Linux 네트워크 네임스페이스 간에 트래픽을 전달하는 방법은 무엇입니까?

Linux 네트워크 네임스페이스 간에 트래픽을 전달하는 방법은 무엇입니까?

네트워크 네임스페이스를 설정하고 네임스페이스 내에서 127.0.0.1을 수신하는 서버를 시작할 수 있었습니다.

# ip netns add vpn
# ip netns exec vpn ip link set dev lo up
# ip netns exec vpn nc -l -s 127.0.0.1 -p 80 &

# ip netns exec vpn netstat -tlpn

Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 127.0.0.1:80            0.0.0.0:*               LISTEN      5598/nc

그런 다음 네임스페이스 내의 서버에 연결할 수 있습니다.

# ip netns exec vpn nc 127.0.0.1 80 -zv
localhost [127.0.0.1] 80 (http) open

하지만 네임스페이스 외부의 서버에는 연결할 수 없습니다.

# nc 127.0.0.1 80
(UNKNOWN) [127.0.0.1] 80 (http) : Connection refused

글로벌 네임스페이스에서 VPN 네임스페이스로 트래픽을 전달하도록 iptables 또는 네임스페이스를 구성하는 방법은 무엇입니까?

답변1

첫째: 127.0.0.0/8 및/또는 루프백 인터페이스(예: lo)를 사용하여 이를 달성할 수 없다고 생각합니다. 127.0.0.0/8과 루프백에는 특정 기능이 내장되어 있으므로 다른 IP와 인터페이스를 사용해야 합니다.

확실히 여러 가지 방법이 있지만 예를 들면 다음과 같습니다.

# ip netns add vpn
# ip link add name vethhost0 type veth peer name vethvpn0
# ip link set vethvpn0 netns vpn
# ip addr add 10.0.0.1/24 dev vethhost0
# ip netns exec vpn ip addr add 10.0.0.2/24 dev vethvpn0
# ip link set vethhost0 up
# ip netns exec vpn ip link set vethvpn0 up
# ping 10.0.0.2
PING 10.0.0.2 (10.0.0.2) 56(84) bytes of data.
64 bytes from 10.0.0.2: icmp_seq=1 ttl=64 time=0.134 ms
64 bytes from 10.0.0.2: icmp_seq=2 ttl=64 time=0.100 ms

첫 번째 명령은 가상 이더넷 케이블로 연결된 가상 이더넷 인터페이스 쌍을 생성합니다. 두 번째 명령은 이러한 인터페이스 중 하나를 netns VPN으로 이동합니다. 소켓 쌍(2) 또는 파이프(2)와 같은 것으로 생각하십시오. 프로세스는 쌍을 생성한 다음 포크하며, 각 프로세스는 쌍의 한쪽 끝만 유지하며 통신할 수 있습니다.

일반적으로(LXC, virt-manager 등) 네트워크가 많으면 모든 것을 동일한 LAN에 배치하는 브리지도 있습니다.

일단 설치되면 다른 라우터처럼 호스트에 나타납니다. IP 전달을 활성화합니다(가능한 경우 더 엄격하게 설정: 최소한 vethhost0 및 기본 인터페이스에서 요구함).

# echo 1 > /proc/sys/net/ipv4/conf/all/forwarding

예를 들어 일부 DNAT 규칙을 추가합니다.

# iptables -t nat -A PREROUTING ! -s 10.0.0.0/24 -p tcp -m tcp --dport 80 -j DNAT --to-destination 10.0.0.2

이제 다음 명령을 사용하여 VPN 내에 기본 경로를 추가할 수 있습니다.

# ip netns exec vpn ip route add default via 10.0.0.1

또는 모든 콘텐츠가 VPN 내의 10.0.0.1에서 오는 것으로 간주되도록 SNAT 규칙을 추가합니다.

# iptables -t nat -A POSTROUTING -d 10.0.0.2/24 -j SNAT --to-source 10.0.0.1

이 작업이 완료되면 다른 호스트에서 테스트할 수 있지만 호스트 자체에서는 테스트할 수 없습니다. 이렇게 하려면 이전 DNAT와 유사한 DNAT 규칙을 추가해야 하지만 OUTPUT에서 이를 자신의 IP로 변경해야 합니다(그렇지 않으면 나가는 http 연결도 변경됩니다). 귀하의 IP가 192.168.1.2라고 가정합니다.

# iptables -t nat -A OUTPUT -d 192.168.1.2 -p tcp -m tcp --dport 80 -j DNAT --to-destination 10.0.0.2

이제 호스트에서 자체적으로 연결해도 작동합니다.만약에루프백 IP를 사용하지 않고 위의 NAT 규칙을 사용하는 호스트에 속한 다른 IP를 사용합니다. 귀하의 IP가 192.168.1.2라고 가정합니다.

# ip netns exec vpn nc -l -s 10.0.0.2 -p 80 &
[1] 10639
# nc -vz 192.168.1.2 80
nc: myhost (192.168.1.2) 80 [http] open
#
[1]+  Done                    ip netns exec vpn nc -l -s 10.0.0.2 -p 80

관련 정보