유닉스 프로그램을 특정 네트워크 인터페이스에 바인딩 네트워크 인터페이스 (eth1 및 eth2)를 통해 액세스

질문 :
특정 네트워크 인터페이스를 통해 네트워크 액세스가 바인드되도록하면서 프로그램을 어떻게 시작합니까?

사례 :
동일한 IP (192.168.1.1)를 사용하지만 두 개의 서로 다른 네트워크 인터페이스 (eth1 및 eth2)를 통해 액세스 할 수있는 두 대의 개별 컴퓨터에 액세스하려고합니다.

예:

net-bind -D eth1 -exec {Program 192.168.1.1}
net-bind -D eth2 -exec {Program 192.168.1.1}

위의 내용은 primusrunoptirun을 통해 수행 된 하드웨어 바인딩에서 영감을 얻은 것 입니다.

도전 과제 : 관련 스레드 에서 제안한 바와 같이 , 사용 된 인터페이스는 프로그램이 아니라 커널이 선택합니다 (따라서 위의 예에서 사전 바인딩 구문).

만족스럽지 않은 관련 솔루션을 찾았습니다. 이들은 사용자 별 네트워크 블랙리스트를 통한 네트워크 인터페이스 바인딩을 기반으로합니다. 즉, 단일 특정 네트워크 인터페이스에만 액세스 할 수있는 사용자로 프로세스를 실행합니다.



답변

Linux의 경우 수퍼 유저에서 이미 답변을 받았습니다. 프로세스마다 다른 네트워크 인터페이스를 사용하는 방법은 무엇입니까? .

가장 인기있는 답변은 LD_PRELOAD트릭을 사용하여 프로그램의 네트워크 바인딩을 변경하지만 최신 커널은 ip프로그램을 통해 노출되는 ‘네트워크 네임 스페이스’라는 훨씬 유연한 기능을 지원합니다 . 이 답변 은 이것을 사용하는 방법을 보여줍니다. 내 자신의 실험에서 다음을 루트로 수행했습니다.

# Add a new namespace called test_ns
ip netns add test_ns

# Set test to use eth0, after this point eth0 is not usable by programs
# outside the namespace
ip link set eth0 netns test_ns

# Bring up eth0 inside test_ns
ip netns exec test_ns ip link set eth0 up

# Use dhcp to get an ipv4 address for eth0
ip netns exec test_ns dhclient eth0

# Ping google from inside the namespace
ip netns exec test_ns ping www.google.co.uk

unsharensenter명령을 사용하여 네트워크 네임 스페이스를 어느 정도 관리 할 수도 있습니다 . 이를 통해 PID, 사용자 및 마운트 지점을위한 별도의 공간을 만들 수도 있습니다. 자세한 내용은 다음을 참조하십시오.


답변

Graeme의 답변을 받고 있습니다. 이것은 단순히 내 문제를 해결하기 위해 그의 제안에 대한 변경 사항을 설명하는 후속 조치입니다.

네임 스페이스 내부의 물리적 인터페이스를 바인딩하는 대신 네트워크 네임 스페이스의 한 쪽 끝과 루트의 한 쪽 끝을 가진 가상 네트워크 인터페이스 쌍을 만들었습니다. 그런 다음 패키지는이 가상 네트워크를 통해 네임 스페이스에서 루트 네임 스페이스로, 물리적 인터페이스로 라우팅됩니다. -따라서 모든 일반 데이터 전송을 실행할 수 있으며 특정 인터페이스에만 액세스 할 수있는 프로세스를 시작할 수 있습니다.

# Create the eth0 network namespace
ip netns add eth0_ns

# Create the virtual network pair
ip link add v_eth0a type veth peer name v_eth0b

# Move v_eth0a to the eth0_ns namespace, the virtual pair is now split
# between two network namespaces.
ip link set v_eth0a netns eth0_ns

# Configure the ends of the virtual network pairs
ip netns exec eth0_ns ifconfig v_eth0a up {{NAMESPACE_IP}} netmask {{NAMESPACE_NETMASK}}
ifconfig v_eth0b up {{ROOT_NS_IP}} netmask {{ROOT_NS_NETMASK}}

# Setup routing from namespace to root
ip netns exec eth0_ns route add default gw {{ROOT_NS_IP}} dev v_eth0a

# Setup IP forwarding
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A POSTROUTING -s {{ROUTE_SOURCE}}/24 -o {{NETWORK_INTERFACE}} -j SNAT --to-source {{ROUTE_TARGET}}

인터페이스가 eth0 및 eth1에 대해 설정되고 해당 네임 스페이스가 eth0_ns 및 eth1_ns 인 경우 지정된 인터페이스에서 다음을 통해 프로그램을 실행할 수 있습니다.

ip netns exec eth0_ns fish
ip netns exec eth1_ns fish

답변

솔루션 I : 특정 라이브러리 사전로드

  • App-Route-Jail : ld_preload를 사용하여 인터페이스 게이트웨이를 강제 실행 (좋은 아이디어이지만 루트 또는 마크 기능이 필요함) 사용법에 대한 자세한 내용은 다음과 같습니다.

  • Proxybound : ld_preload를 사용하여 프록시를 특정 응용 프로그램에 강제로 적용합니다 (인터페이스 대신 프록시 사용).

  • 강제 바인딩 : 많은 기능이 있지만 바인드 누출 (신뢰할 수 없음)

  • Bind-Interface-IP : 너무 간단하고 누출 연결 (신뢰할 수 없음)

  • Bind-IP : 너무 간단하고 연결이 누출 됨 (신뢰할 수 없음)

솔루션 II : Linux 사용자 공간

  • 클래식 리눅스 사용자 공간 ip-netns : 훌륭한 솔루션이지만 루트와 인터페이스가 하나의 단일 사용자 공간에만 존재할 수 있습니다.

  • Firejail : Firejail은 응용 프로그램이 특정 네트워크를 사용하도록 강제 할 수 있지만 호환성은 제한적입니다 (예 : tun 인터페이스와 호환되지 않음). firejail은 루트가 필요하지 않습니다firejail --dns=8.8.8.8 --noprofile --net=eth0 --ip=192.168.1.1 app-command

  • netns가 포함 된 Firejail : Firejail은 응용 프로그램이 개별적으로 생성 된 특정 사용자 공간을 사용하도록 할 수 있습니다. 이렇게하면 루트없이 공간 이름을 지정할 수 있습니다firejail --dns=8.8.8.8 --noprofile --netns=nameOfyourNS app-command

  • 가장 무도회와 다리 Firejail : Firejail가 사용하는 응용 프로그램을 강제 할 수 iptables에 가장 무도회와 특정 인터페이스를 ,이 위대하고 루트가 필요하지 않습니다 하지만 이 IP_FORWARD 요구 및 보안에 미치는 영향을 의미 할 수firejail --net=br0 firefox

솔루션 III : Linux iptables

iptables는 이러한 목적으로 사용될 수 있지만 ip_forward가 필요하며 올바르게 구성되지 않은 경우 보안 영향을 암시 할 수 있습니다 ( 예 1 , 예 2 , 예 3 , 예 4).

솔루션 (I, II 및 III) 참고 사항 :

와이어 가드

VPN (특히 wireguard)을 사용 중이고이 솔루션을 wireguard 인터페이스 ( 사용자 공간 이있는 wireguard)에 적용하려는 경우 링크 된 지시에 따라 wg 인터페이스를 포함하는 사용자 공간을 만들 수 있습니다 (따라서 VPN 인터페이스로 제한됨) ) 또한 firejail --netns=container루트없이 사용자 공간을 사용할 수 있도록 결합 될 수 있습니다.

인터페이스 게이트웨이를 찾는 방법

게이트웨이를 찾는 많은 솔루션이 있습니다. 여기에 사용 된 게이트웨이를 찾을 수있는 몇 가지 명령이 있습니다.

$ 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

App-Route-Jail 사용 방법

  • 앱 루트-제일 구축
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