프로세스마다 다른 네트워크 인터페이스를 사용하는 방법은 무엇입니까?


59

Linux PC에는 두 개의 네트워크 인터페이스가 있으며 주어진 프로세스에서 사용할 인터페이스를 수동으로 설정해야합니다.

프로그램 (Twinkle softphone)에는 비슷한 옵션이 없으므로 외부에서 설정해야한다고 생각합니다.

내가 어떻게 해?

편집 : 서버 프로세스를 특정 인터페이스에 바인딩하지 않고 클라이언트 프로그램이 특정 인터페이스를 사용하여 서버에 연결하도록하려고합니다.


클라이언트는 바인드 / 연결도 사용합니다. ircII (irc- 클라이언트 프로그램)를 지정된 ip로 강제 실행하는 방법에 대한 bind.c.txt 문서를보십시오. BIND_ADDR = "your-virt-ip"LD_PRELOAD =. / bind.so ircII '
akira

내가 여기에 다른 접근 방식을 발견, 나는 그것이 도움이 희망 (나는 확실히 설명 커널 정책 라우팅은 기본적으로 활성화되어 희망 현재) : kindlund.wordpress.com/2007/11/19/...
사바스 Radevic

답변:


48

LD_PRELOAD를 사용하여 런타임에 코드를 대체 할 수 있습니다 (@windows는 detours 라는 비슷한 기술을 사용할 수 있습니다 ). 이것이하는 일은 동적 링커에게 먼저 실행하려는 프로세스에 모든 라이브러리를로드 한 다음 그 위에 더 많은 것을 추가하도록 알리는 것입니다. 일반적으로 다음과 같이 사용하십시오.

% LD_PRELOAD=./mylib.so ls

그에 의해 당신은 무엇을 변경합니다 ls.

귀하의 문제에 대해 http://www.ryde.net/code/bind.c.txt 을 시도해 볼 수 있습니다.

% BIND_ADDR="ip_of_ethX" LD_PRELOAD=./bind.so twinkle

다음은 빌드 방법입니다.

% wget http://www.ryde.net/code/bind.c.txt -O bind.c
% gcc -nostartfiles -fpic -shared bind.c -o bind.so -ldl -D_GNU_SOURCE

더 긴 howto는 http://daniel-lange.com/archives/53-Binding-applications-to-a-specific-IP.html입니다.

비슷한 핵과 도구 :


7
와, 도대체. +1
sinni800

1
안녕하세요, 이것은 정말 좋은 트릭처럼 보이지만 저에게는 효과적이지 않습니다. 연결되면 두 개의 인터페이스 (ppp0 및 ppp1)를 여는 두 개의 3G 모뎀이 있습니다. 두 IP 중 하나를 강제하려고하면 항상 동일한 인터페이스로 끝납니다 (각 인터페이스마다 하나씩 두 개의 wireshark 인스턴스가 있기 때문에 알 수 있습니다). 또한 bind.c에서 디버그 인쇄를 제거했으며 실제로 "오버로드 된"라이브러리가로드 된 것을 확인하여 왜 작동하지 않는지 알 수 없습니다.
Andrea Spadaccini

3
유효 UID가 실제 UID와 동일하지 않으면 LD_PRELOAD가 무시됩니다.
matthias krull

force_bindCatalin M. Boie 의 프로젝트는 ipv6
BurnsBA를

훌륭하게 작동하지만 컴파일에 성공하려면 #include <arpa / inet.h>를 추가해야했습니다.
anno

31

ip netns가이를 수행 할 수 있습니다.

TL; DR : 네트워크 네임 스페이스를 생성하고 인터페이스를 연결 한 다음 "ip netns exec NAME cmd ..."를 실행하십시오.

배포판이 ip netns를 지원하는지 확인하십시오 ... (Backtrack 5r3은 지원하지 않지만 Kali는;))

자세한 내용은 :

#create netns
ip netns add myNamespace
#link iface to netns
ip link set eth0 netns myNamespace
#set ip address in namespace
ip netns exec myNamespace ifconfig eth0 192.168.0.10/24 up
#set loopback (may be needed by process run in this namespace)
ip netns exec myNamespace ifconfig lo 127.0.0.1/8 up
#set route in namespace
ip netns exec myNamespace route add default gw 192.168.0.1
#force firefox to run inside namespace (using eth0 as outgoing interface and the route)
ip netns exec myNamespace firefox

LD_PRELOAD를 통해 ip를 바인딩하는 것보다 이것이 왜 더 낫습니까? LD_PRELOAD는 프로세스가 사용하는 경로를 제어하지 않기 때문입니다. 첫 번째 경로를 사용합니다.

그리고 항상 동일한 경로를 사용하기 때문에 기본적으로 경로에 등록 된 인터페이스가 사용됩니다.


2
답변에 자세한 내용을 추가하십시오.
Renju Chandran chingath

4
eth0이 공용 네트워크 인터페이스 인 경우 원격 서버에서이 작업을 수행하지 마십시오.
ygrek

1
마지막 줄은ip netns exec myNamespace firefox
meuh

1
"sudo ip netns del <namespace-name>"을 사용하여 필요할 때 네임 스페이스를 제거하십시오!
Eduardo Lucio

1
@EduardoLucio 다음과 같이 실행할 수 있어야합니다 : sudo ip netns exec myNamespace su -u someUser -c firefox
olivervbk

2

프로세스가 특정 인터페이스를 사용하도록 강요하는 것은 불가능하다고 생각합니다.

그러나 ipchain / iptables를 사용하여 프로세스가 수신 대기중인 특정 포트가 특정 인터페이스를 통해 패킷을 가져 오도록 강요 할 수 있다고 생각합니다.

유용한 하우투 : http://tldp.org/HOWTO/IPCHAINS-HOWTO.html


2
투표율이 높은 두 개의 게시물은 그렇지 않다는 것을 증명합니다.
Paul Gear

2

@ olivervbk를 기반으로 아래 답변은 나의 것입니다!

모든 명령을 "루트"로 실행하십시오.

명령을 사용하십시오 ...

ip a

... 사용할 네트워크 인터페이스의 이름을 찾으십시오.

템플릿으로 아래 명령을 실행하십시오 ...

ip netns add [INTERFACE_NAME]_ns
ip link set dev [INTERFACE_NAME] netns [INTERFACE_NAME]_ns
ip netns exec [INTERFACE_NAME]_ns ifconfig [INTERFACE_NAME] 10.1.1.10/24 up
ip netns exec [INTERFACE_NAME]_ns ifconfig lo 127.0.0.1/8 up
ip netns exec [INTERFACE_NAME]_ns route add default gw 10.1.1.1
ip netns exec [INTERFACE_NAME]_ns dhcpcd [INTERFACE_NAME]
ip netns exec [INTERFACE_NAME]_ns sudo -b -u [YOUR_USER] [APP_NAME] 2> /dev/null 1> /dev/null &
  • [INTERFACE_NAME]-선택한 네트워크 인터페이스의 이름으로 바꿉니다.
  • [YOUR_USER]-사용자 이름으로 바꿉니다.
  • [APP_NAME]-네임 스페이스 "[INTERFACE_NAME] _ns"에서 실행될 애플리케이션의 이름입니다. 예 : "firefox"

참고 I : "sudo"명령의 "-b -u"플래그를 사용하면 응용 프로그램을 "루트"가 아닌 사용자를 사용하여 백그라운드에서 터미널을 해제하여 실행할 수 있습니다. 2> /dev/null 1> /dev/null &단편은 "[APP_NAME] '말단에 인쇄되는 출력을 방지하는 것이다.
참고 II : ip "10.1.1.10"및 "10.1.1.1"의 값은 임의적입니다.
참고 III : 나를 위해 일하려면 dhcpcd [INTERFACE_NAME]명령 을 실행해야했습니다 .

네임 스페이스를 제거하려면 ...

ip netns del [INTERFACE_NAME]_ns

... 또는 ...

ip -all netns delete

... 존재하는 것을 제거합니다.


1

일반적으로 프로그램에 청취 인터페이스 설정 옵션이없는 경우 모든 인터페이스에서 청취합니다. (로 확인할 수 있습니다 lsof -i).

들어오는 트래픽을 원하지 않는 인터페이스의 포트로 향하게하는 iptables 방화벽 규칙을 작성하는 것이 가장 쉬운 방법입니다.


1

대안 I :

ld_preload를 사용하여 인터페이스 게이트웨이를 강제 실행 https://github.com/Intika-Linux-Network/App-Route-Jail

응용 프로그램이 특정 네트워크 인터페이스를 사용하도록 강제

우리는 네트워크 인터페이스가 어떤 게이트웨이를 사용하고 있는지 확인한 다음 해당 게이트웨이를 감옥 애플리케이션에 강제로 적용하여 애플리케이션이 특정 네트워크 인터페이스에 바인딩되도록합니다.

  • 인터페이스 게이트웨이를 찾는 방법 (게이트웨이를 찾는 많은 솔루션이 있습니다. 여기에는 사용 된 게이트웨이를 찾을 수있는 몇 가지 명령이 있습니다)
$ route
$ route -n
$ ip rule list
$ ip route show
$ netstat -rn
$ cat /etc/network/interfaces
$ cat /etc/sysconfig/network-scripts/ifcfg-eth0
$ traceroute www.google.com
$ ip route show 0.0.0.0/0 dev eth0

애플리케이션 게이트웨이 당

  • 앱 루트-제일 구축
git clone https://github.com/Intika-Linux-Network/App-Route-Jail.git
cd Approute-Utils
chown 755 make.sh
./make.sh
  • 이 예에서 미래에 표시된 패킷에 대한 경로 추가 (감옥 된 응용 프로그램의 경우) 192.168.1.1는 강제 게이트웨이로 사용되며,이 경로 규칙은 다른 응용 프로그램에 영향을 미치지 않습니다.이 조작은 예를 들어 시스템 부팅시 한 번만 수행해야합니다. 이 솔루션을 매일 사용하십시오
ip rule add fwmark 10 table 100
ip route add default via 192.168.1.1 table 100
  • 당신이 감옥에서 응용 프로그램을 시작
MARK=10 LD_PRELOAD=./mark.so firefox
  • wan IP 주소 테스트
MARK=10 LD_PRELOAD=./mark.so wget -qO- ifconfig.me

대안 II :

Firejail https://firejail.wordpress.com/ 은 애플리케이션이 특정 네트워크를 사용하도록 강제 할 수 있지만 호환성은 제한적입니다.

firejail --dns=8.8.8.8 --net=eth0 --ip=192.168.1.1

일반 사용자에게는 마크를 사용할 수 없으므로 루트로 실행해야합니다.
jornane

-2

프로그램이 서버에 연결된 인터페이스 이외의 인터페이스를 사용하여 해당 서버와 통신하려는 이유는 무엇입니까? 그리고 시스템이 해당 서버와 통신하기 위해 서버에 연결된 인터페이스를 사용하지 않는 경우 시스템 수준 (라우팅 테이블) 문제이며 해당 서버와 통신하려는 프로세스와는 아무런 관련이 없습니다.

IP 네트워크의 서버마다 IP 주소가 다릅니다. 커널은 라우팅 테이블을 기반으로 특정 IP 주소에 도달하는 데 사용할 인터페이스를 알아야합니다. 동일한 IP 주소를 가진 두 개의 다른 서버와 통신하려고하면 시스템이 혼란스러워집니다 (특히, 대상 주소를 기준으로 내부적으로 연결을 색인화하기 때문에). 이 작업을 수행 할 수 있지만 소프트웨어 NAT를 통해 컴퓨터에만 연결된 별도의 논리 네트워크에 하나의 서버를 배치하는 것과 관련된 시스템 수준의 수정입니다.

따라서 IP 주소가 다른 경우 경로를 사용하여 올바른 인터페이스를 선택하십시오. IP 주소가 동일한 경우 시스템과 다른 IP 주소를 갖도록 NAT를 사용해야합니다.


3
첫째, 클라이언트와 서버 사이에 유효한 경로가 여러 개있을 수 있지만 트래픽 유형에 따라 다른 특성이 있습니다. 예를 들어 UMTS (Cellular Data)는 비용이 들지만 WiFi보다 범위가 크지 만 둘 다 광섬유 연결보다 느립니다. 업스트림 공급자가 소스 필터링 (또는 NAT)을 수행하는 경우 '올바른'인터페이스를 발송할 수밖에 없습니다. 둘째, 라우팅에 영향을 미치는 것이 소스 주소를 선택하는 유일한 이유는 아닙니다. 두 주소가 동일한 인터페이스에 있더라도 서버와 같이 연결을 시작할 때 바인딩 될 주소를 제어하는 ​​것이 유용 할 수 있습니다.

한 가지 경우는 다른 공용 IP가 있고 나가는 연결에 대해 각각 새로운 프로세스를 시작하려는 경우입니다.
Rfraile
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.