Linux PC에는 두 개의 네트워크 인터페이스가 있으며 주어진 프로세스에서 사용할 인터페이스를 수동으로 설정해야합니다.
프로그램 (Twinkle softphone)에는 비슷한 옵션이 없으므로 외부에서 설정해야한다고 생각합니다.
내가 어떻게 해?
편집 : 서버 프로세스를 특정 인터페이스에 바인딩하지 않고 클라이언트 프로그램이 특정 인터페이스를 사용하여 서버에 연결하도록하려고합니다.
Linux PC에는 두 개의 네트워크 인터페이스가 있으며 주어진 프로세스에서 사용할 인터페이스를 수동으로 설정해야합니다.
프로그램 (Twinkle softphone)에는 비슷한 옵션이 없으므로 외부에서 설정해야한다고 생각합니다.
내가 어떻게 해?
편집 : 서버 프로세스를 특정 인터페이스에 바인딩하지 않고 클라이언트 프로그램이 특정 인터페이스를 사용하여 서버에 연결하도록하려고합니다.
답변:
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입니다.
비슷한 핵과 도구 :
force_bind
Catalin M. Boie 의 프로젝트는 ipv6
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는 프로세스가 사용하는 경로를 제어하지 않기 때문입니다. 첫 번째 경로를 사용합니다.
그리고 항상 동일한 경로를 사용하기 때문에 기본적으로 경로에 등록 된 인터페이스가 사용됩니다.
ip netns exec myNamespace firefox
sudo ip netns exec myNamespace su -u someUser -c firefox
프로세스가 특정 인터페이스를 사용하도록 강요하는 것은 불가능하다고 생각합니다.
그러나 ipchain / iptables를 사용하여 프로세스가 수신 대기중인 특정 포트가 특정 인터페이스를 통해 패킷을 가져 오도록 강요 할 수 있다고 생각합니다.
@ 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 &
참고 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
... 존재하는 것을 제거합니다.
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
MARK=10 LD_PRELOAD=./mark.so wget -qO- ifconfig.me
Firejail https://firejail.wordpress.com/ 은 애플리케이션이 특정 네트워크를 사용하도록 강제 할 수 있지만 호환성은 제한적입니다.
firejail --dns=8.8.8.8 --net=eth0 --ip=192.168.1.1
프로그램이 서버에 연결된 인터페이스 이외의 인터페이스를 사용하여 해당 서버와 통신하려는 이유는 무엇입니까? 그리고 시스템이 해당 서버와 통신하기 위해 서버에 연결된 인터페이스를 사용하지 않는 경우 시스템 수준 (라우팅 테이블) 문제이며 해당 서버와 통신하려는 프로세스와는 아무런 관련이 없습니다.
IP 네트워크의 서버마다 IP 주소가 다릅니다. 커널은 라우팅 테이블을 기반으로 특정 IP 주소에 도달하는 데 사용할 인터페이스를 알아야합니다. 동일한 IP 주소를 가진 두 개의 다른 서버와 통신하려고하면 시스템이 혼란스러워집니다 (특히, 대상 주소를 기준으로 내부적으로 연결을 색인화하기 때문에). 이 작업을 수행 할 수 있지만 소프트웨어 NAT를 통해 컴퓨터에만 연결된 별도의 논리 네트워크에 하나의 서버를 배치하는 것과 관련된 시스템 수준의 수정입니다.
따라서 IP 주소가 다른 경우 경로를 사용하여 올바른 인터페이스를 선택하십시오. IP 주소가 동일한 경우 시스템과 다른 IP 주소를 갖도록 NAT를 사용해야합니다.