다양한 프로세스에 대해 다양한 네트워크 인터페이스를 사용하는 방법은 무엇입니까?

다양한 프로세스에 대해 다양한 네트워크 인터페이스를 사용하는 방법은 무엇입니까?

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

프로그램(트윙클 소프트폰)에는 비슷한 옵션이 없어서 외부에서 설정해야 한다고 생각합니다.

내가 어떻게 해?

편집하다:나는 서버 프로세스를 특정 인터페이스에 바인딩하려는 것이 아니라 클라이언트 프로그램이 특정 인터페이스를 사용하여 서버에 접속하도록 하려는 것입니다.

답변1

다음을 사용하여 런타임에 코드를 바꿀 수 있습니다.LD_PRELOAD(@windows라는 유사한 기술을 사용할 수 있습니다.우회, 꽤 멋지다). 이것이 하는 일은 먼저 실행하려는 프로세스에 모든 라이브러리를 로드한 다음 그 위에 더 많은 라이브러리를 추가하도록 동적 링커에게 알리는 것입니다. 일반적으로 다음과 같이 사용합니다.

% 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

더 긴 하우투는http://daniel-lange.com/archives/53-Binding-applications-to-a-특이적-IP.html

유사한 해킹 및 도구:

답변2

ip netns는 이것을 할 수 있습니다.

요약: 네트워크 네임스페이스를 생성하고 인터페이스를 연결한 다음 "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는 프로세스가 사용하는 경로를 제어하지 않기 때문입니다. 첫 번째 경로를 사용합니다.

그리고 항상 같은 라우트를 사용하기 때문에 해당 라우트에 등록된 인터페이스를 기본값으로 사용하게 됩니다.(우리가 원하는 것은 아닙니다)

답변3

아래 @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" 네임스페이스에서 실행될 애플리케이션의 이름입니다. 예: "파이어폭스".

참고 I:" " 명령 -b -u의 " " 플래그를 사용 sudo하면 애플리케이션이 사용자("루트" 아님)를 사용하여 백그라운드에서 터미널을 해제하여 실행할 수 있습니다. 스 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

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

답변4

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

그러나 내 생각에는 ipchain/iptables를 사용하여 프로세스가 수신 대기 중인 특정 포트가 특정 인터페이스를 통해 들어오는 패킷만 받도록 강제할 수 있을 것입니다.

유용한 방법: http://tldp.org/HOWTO/IPCHAINS-HOWTO.html

관련 정보