유닉스 프로그램을 특정 네트워크 인터페이스에 바인딩


39

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

사례 : 동일한 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을 통해 수행 된 하드웨어 바인딩에서 영감을 얻은 것 입니다.

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

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


머신이 두 개의 서로 다른 네트워크 (192.168.1.0)에 연결되어 있음을 의미합니까? 라우팅 테이블은 어떤 모양입니까? 프로세스에서 볼 수있는 인터페이스를 제한하려는 경우 가장 가벼운 솔루션은 무거운 컨테이너 인 cgroup입니다.
lgeorget 2016 년

예, 동일한 IP 범위에있는 두 개의 서로 다른 네트워크. 나는 보이는 인터페이스를 제한하고 싶지 않다고 확신하지 않고 기본값으로 사용할 인터페이스를 지시합니까? :)
Skeen

3
동일한 IP 도메인을 사용하여 두 개의 네트워크를 서로 연결하는 것은 같은 수의 2 층 건물에 엘리베이터를 두는 것과 같습니다. IP 범위는 출력 인터페이스가 아닌 도메인을 식별하는 것입니다. 그럼에도 불구하고 결함이있는 네트워크 디자인을 iptables로 해결할 수있는 방법이 있어야합니다.
lgeorget 2016 년

시스템이 상호 작용하도록 설계되지 않았으므로 네트워크 설계에 결함이 있기 때문에 시스템을 두 개의 다른 인플레 이스 인프라에 연결하고 있습니다.
Skeen

1
NAT에 대한 나의 주장은 전체 주소 공간이 일반적으로 NAT 뒤에 숨겨져 있고 두 개의 NAT 기반 인프라를 연결할 때 충돌이 발생한다는 것입니다. -인프라를 수정할 위치가 없습니다. -루트 네임 스페이스를 하나의 물리적 인터페이스에 연결하고 네트워크 네임 스페이스 내에서 프로그램을 실행하는 가상 네트워크 인터페이스 쌍 (네임 스페이스에 하나, 루트 네임 스페이스에 하나)으로 네트워크 네임 스페이스를 사용해 보았습니다. -이것은 작동하는 것처럼 보이지만 루트 네임 스페이스를 넘어서는 액세스 권한을 얻지 못합니다 (즉, 컴퓨터 외부에서는 액세스 할 수 없음).
Skeen

답변:


34

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, 사용자 및 마운트 지점을위한 별도의 공간을 만들 수도 있습니다. 자세한 내용은 다음을 참조하십시오.


"이 시점 이후 eth0은 네임 스페이스 외부의 프로그램에서 사용할 수 없습니다"-이 작업에서 다른 모든 문제에 대한 연결을 풀고 있습니까?
Skeen

1
@Skeen, 그렇습니다. 아마도 다른 프로그램이 네임 스페이스에 사용하지 않는 인터페이스를 푸시하고 기본 네임 스페이스를 정상적으로 사용합니다.
Graeme 2016 년

1
@Graerne; 두 인터페이스 모두 적극적으로 사용되고 있습니다. 나는 인터페이스를 감당할 여유가 없다.
Skeen

기본 게이트웨이는 무엇입니까? wvdial예를 들어 전혀 설정하지 않는 것 같습니다. 따라서 네임 스페이스 자체에서 정의해야합니다.
Flash Thunder

이를 취소하는 방법에 대한 지침을 포함시킬 수 있습니까? 그냥 ip netns remove test_ns정상으로 돌아가시겠습니까? 아니면 특별한 것을해야합니까?
멀티 헌터

17

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

4
잘 했어! 브리지 장치를 만들고 기본 네임 스페이스와 가상 쌍을 실제 장치 중 하나와 브리지 할 수도 있다고 생각합니다. 그래도 동등한 것으로 보입니다.
Graeme 2016 년

1
가상 및 물리적 장치를 연결하려고했습니다. 해당 솔루션을 사용하여 외부 네트워크에 연결할 수 없었습니다.
Skeen

2
나는하지만 새로운 네임 스페이스에서만했다. 내가 겪고있는 문제는 네트워크 관리자와 관련이 있다고 생각하지만, 이해하지 못했거나 대답을 업데이트했을 것입니다.
Graeme

같은 문제가 있지만 해당 솔루션을 사용하지 못했습니다. 마지막 단계에서 {{ROUTE_SOURCE}} 및 {{ROUTE_TARGET}}에 정확히 무엇을 입력해야합니까?
litov December

@Graeme, 적어도 우분투 dhclient <bridge>에서는 here 을 발행하여 네임 스페이스와 글로벌 네임 스페이스 모두에서 연결을 다시 얻을 수있었습니다 .
Chris Hunt

3

솔루션 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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.