해결 방법 1: 특정 라이브러리를 미리 로드

해결 방법 1: 특정 라이브러리를 미리 로드

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

사례: 동일한 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}

위의 내용은 다음을 통해 수행된 하드웨어 바인딩에서 영감을 받아 내가 원하는 것에 대한 대략적인 것입니다.프리마슬렌그리고최적화된 운영.

도전:제안대로관련 주제, 사용되는 인터페이스는 프로그램이 아니라 커널에 의해 선택됩니다(따라서 위 예의 사전 바인딩된 구문).

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

답변1

Linux의 경우 이 질문은 이미 Superuser에서 답변되었습니다.다양한 프로세스에 대해 다양한 네트워크 인터페이스를 사용하는 방법은 무엇입니까?.

가장 인기 있는 답변은 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

unshare및 명령을 사용하여 nsenter네트워크 네임스페이스를 어느 정도 관리 할 수도 있습니다 . 또한 PID, 사용자 및 마운트 지점을 위한 별도의 공간을 생성할 수 있습니다. 자세한 내용은 다음을 참조하세요.

답변2

나는 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

답변3

해결 방법 1: 특정 라이브러리를 미리 로드

  • 애플리케이션 라우팅 감옥: ld_preload를 사용하여 인터페이스 게이트웨이를 강제합니다(좋은 생각이지만 루트 또는 태그 기능이 필요함) 사용법에 대한 자세한 내용은 아래 설명을 참조하세요.

  • 프록시 바인딩: ld_preload를 사용하여 특정 애플리케이션에 프록시를 강제 적용합니다(인터페이스가 아닌 프록시를 사용함).

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

  • 인터페이스 IP 바인딩: 너무 단순하고 연결이 누출됨(신뢰할 수 없음)

  • IP 바인딩: 방법이 너무 간단하고 연결이 새는 경우(신뢰할 수 없음)

해결 방법 2: Linux 사용자 공간

  • 클래식 리눅스 사용자 공간IP 네트워크: 좋은 솔루션이지만 루트가 필요하고 인터페이스는 하나의 사용자 공간에만 존재할 수 있습니다.

  • 지옥불: Firejail은 애플리케이션이 특정 네트워크를 사용하도록 강제할 수 있지만 호환성이 제한적입니다(예: tun 인터페이스와의 비호환성). Firejail에는 루트가 필요하지 않습니다firejail --dns=8.8.8.8 --noprofile --net=eth0 --ip=192.168.1.1 app-command

  • Netns가 있는 방화 감옥: Firejail은 애플리케이션이 별도로 생성된 특정 사용자 공간을 사용하도록 강제할 수 있습니다. 이를 통해 루트 없이 네임스페이스를 지정할 수 있습니다.firejail --dns=8.8.8.8 --noprofile --netns=nameOfyourNS app-command

  • 가장 무도회와 다리가 있는 소방 감옥: Firejail은 애플리케이션을 강제로 사용하도록 할 수 있습니다.iptables로 위장한 특정 인터페이스, 훌륭하고 루트가 필요하지 않습니다하지만여기에는 ip_forward가 필요하며 보안에 영향을 미칠 수 있습니다.firejail --net=br0 firefox

해결 방법 3: Linux iptables

이 목적으로 iptables를 사용할 수 있습니다하지만이를 위해서는 ip_forward가 필요하며, 잘못 구성된 경우 보안에 영향을 미칠 수 있습니다.실시예 1,실시예 2,실시예 3,실시예 4

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

와이어 가드

VPN(특히 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-Root-Jail
chmod 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

답변4

또 다른 솔루션이 사전 로드되어 있습니다.

인터페이스에 바인딩

인터페이스에 바인딩프로그램이 특정 인터페이스를 사용하도록 강제하는 라이브러리를 로드합니다. intika의 응답 강제에 있는 다른 3가지 바인딩 옵션은 특정 IP 주소에 바인딩됩니다. 따라서 예를 들어 192.168.178.68의 모든 인터페이스에 바인딩할 수 있음을 의미하는 0.0.0.0 대신 이 인터페이스에서만 수신하도록 바인딩할 수 있습니다. 그러나 연결이 설정되면 기본 경로 테이블이 계속 사용되고 다른 인터페이스가 사용됩니다.

BindToInterface는 다음과 같이 작동합니다 BIND_INTERFACE=eth1 LD_PRELOAD=./bindToInterface.so <your command>. DNS 서버를 재정의할 수도 있습니다. 이는 바인딩 인터페이스를 통해 기본 DNS 서버에 연결할 수 없을 때 유용합니다. 이렇게 하면 연결 속도가 빨라집니다. 환경 변수를 통해 이를 제어할 수 있습니다.DNS_OVERRIDE_IP=8.8.8.8

프로그램이 eth1에 바인딩되면 localhost에 연결할 수 없습니다. 해당 IP 또는 다른 IP에 도달해야 하는 경우 해당 IP를 제외하여 제외할 수 있습니다 BIND_EXCLUDE=127.0.0.1.

따라서 명령은 다음과 같습니다 BIND_INTERFACE=eth1 DNS_OVERRIDE_IP=8.8.8.8 BIND_EXCLUDE=127.0.0.1 LD_PRELOAD=./bindToInterface.so <your command>.

몇 가지 옵션이 더 있습니다Github 페이지에 설명된 인터페이스에 바인딩합니다..



현재(2020년 3월) Firejail 솔루션은 Wi-Fi를 통해 사용할 수 없습니다.https://github.com/netblue30/firejail/issues/3000

관련 정보