iptables MASQUERADE 규칙을 사용한 NAT 설정은 외부 WAN 인터페이스에서 들어오는 패킷에 대한 conntrack 항목을 추가합니다.

iptables MASQUERADE 규칙을 사용한 NAT 설정은 외부 WAN 인터페이스에서 들어오는 패킷에 대한 conntrack 항목을 추가합니다.

네트워크 네임스페이스 내에서 NAT/라우터 설정을 시뮬레이션하고 있는데 외부 WAN 인터페이스에서 라우터로 전송된 패킷에서 conntrack 항목이 생성되는 이상한 동작에 직면했습니다. 이러한 conntrack 항목은 내부 인터페이스에서 외부 인터페이스로 패킷이 전달될 때만 생성되어야 한다고 예상했습니다(이를 통해 외부 네트워크로부터 내부 네트워크를 보호하는 NAT 기능을 수행함).

내 상황은 다음과 같습니다.

건축학

위의 아키텍처 이미지는 약간 오래된 것입니다. 저는 대신에 192.168.0.1and를 사용하고 있습니다 .192.168.0.2198.168.X.X

ip netns add agent1
ip netns add router1
ip netns add router2
ip netns add agent2

# creates an interface a1 (otherside is r1-int)
ip netns exec agent1 ip link add a1 type veth peer name r1-int
# set r1-int to router1
ip netns exec agent1 ip link set r1-int netns router1

# creates an interface r1-ext (otherside is rw-ext)
ip netns exec router1 ip link add r1-ext type veth peer name r2-ext
# sets r2-ext to router2
ip netns exec router1 ip link set r2-ext netns router2

# creates an interface r2-int (otherwisde is a2)
ip netns exec router2 ip link add r2-int type veth peer name a2
# sets a2 to agent2
ip netns exec router2 ip link set a2 netns agent2

# set up interfaces for agent1
ip netns exec agent1 ip link set lo up
ip netns exec agent1 ip link set a1 up
ip netns exec agent1 ip addr add 10.0.0.2/24 dev a1
ip netns exec agent1 ip route add default via 10.0.0.1

# set up interfaces for router1
ip netns exec router1 ip link set lo up
ip netns exec router1 ip link set r1-int up
ip netns exec router1 ip link set r1-ext up
ip netns exec router1 ip addr add 10.0.0.1/24 dev r1-int
ip netns exec router1 ip addr add 192.168.0.1/24 dev r1-ext
ip netns exec router1 ip route add default via 192.168.0.2

# setup interfaces for router2
ip netns exec router2 ip link set lo up
ip netns exec router2 ip link set r2-int up
ip netns exec router2 ip link set r2-ext up
ip netns exec router2 ip addr add 10.0.0.1/24 dev r2-int
ip netns exec router2 ip addr add 192.168.0.2/24 dev r2-ext
ip netns exec router2 ip route add default via 192.168.0.1

# setup interfaces for agent2
ip netns exec agent2 ip link set lo up
ip netns exec agent2 ip link set a2 up
ip netns exec agent2 ip addr add 10.0.0.2/24 dev a2
ip netns exec agent2 ip route add default via 10.0.0.1

# Setting up port-restricted NAT for both routers (mapping will always be to port 55555 for easier testing)
ip netns exec router1 iptables -t nat -A POSTROUTING -p udp -o r1-ext -j MASQUERADE --to-ports 55555
ip netns exec router2 iptables -t nat -A POSTROUTING -p udp -o r2-ext -j MASQUERADE --to-ports 55555

agent1tome에서 UDP 패킷을 보내면 예상대로 conntrack 항목이 생성됩니다 router2. 아무것도 듣고 있지 않기 router1때문에 실패합니다 .router2

ip netns exec agent1 nc -u -p 55555 192.168.0.2 55555
> FIRST PACKET

그러나 에도 conntrack항목이 생성됩니다 router2.

$ sudo ip netns exec router1 conntrack -L
udp      17 14 src=10.0.0.2 dst=192.168.0.2 sport=55555 dport=55555 [UNREPLIED] src=192.168.0.2 dst=192.168.0.1 sport=55555 dport=55555 mark=0 use=1
conntrack v1.4.6 (conntrack-tools): 1 flow entries have been shown.

$ sudo ip netns exec router2 conntrack -L
udp      17 16 src=192.168.0.1 dst=192.168.0.2 sport=55555 dport=55555 [UNREPLIED] src=192.168.0.2 dst=192.168.0.1 sport=55555 dport=55555 mark=0 use=1
conntrack v1.4.6 (conntrack-tools): 1 flow entries have been shown.

이 추가 conntrack 항목 으로 router2인해 .agent2router1

ip netns exec agent2 nc -u -p 55555 192.168.0.1 55555
> SECOND PACKET

인터페이스 SECOND PACKET에 도착한 다음 사라지고 전송되지도 않으며 도착하지도 않습니다 .router2 r2-intr2-extrouter1

iptables내 규칙이 너무 일반적이어서 좀 더 선별적이어야 한다고 생각합니다 (https://superuser.com/questions/1706874/iptables-selective-masquerade). 그러나 소스 주소 일치만 사용해 보았지만 -s 10.0.0.0/24여전히 동일한 동작이 발생했습니다.

iptables설정에서 뭔가 빠졌 나요 ? router2에서 보낸 패킷에 conntrack 항목이 생성되지 않도록 하는 방법은 무엇입니까 agent1?

답변1

부분 답변:

보다 일반적인 규칙을 사용하여 내 시스템에서 양방향으로 작동하도록 할 수 있습니다.전달 활성화

echo "1" | ip netns exec router1 tee /proc/sys/net/ipv4/ip_forward
ip netns exec router1 iptables -t nat -A POSTROUTING -o r1-ext -j MASQUERADE 

echo "1" | ip netns exec router2 tee /proc/sys/net/ipv4/ip_forward
ip netns exec router2 iptables -t nat -A POSTROUTING -o r2-ext -j MASQUERADE 

nc그런 다음 외부 인터페이스의 두 라우터(다른 xterm)에서 시작할 수 있습니다 .

ip netns exec router1 nc -u -l 192.168.0.1 -p 5555
ip netns exec router2 nc -u -l 192.168.0.2 -p 5555

그리고 프록시가 "원격" 라우터에 접속하도록 합니다.

echo foo | sudo ip netns exec agent1 nc -u 192.168.0.2 5555
echo foo | sudo ip netns exec agent2 nc -u 192.168.0.1 5555

Ping또한 작동합니다.

따라서 conntrack 항목을 "추가"해도 역방향 패킷이 "차단"되지 않습니다(그리고 귀하의 컴퓨터에 정확히 어떤 문제가 있는지 모르겠습니다).

나가는 연결만 전달되도록 허용하는 것도 표준 관행입니다(나가는 패킷에 대해 NAT를 수행하고 있으므로).

ip netns exec router1 iptables -P FORWARD DROP
ip netns exec router1 iptables -A FORWARD -i r1-ext -o r1-int -m state --state ESTABLISHED,RELATED -j ACCEPT
ip netns exec router1 iptables -A FORWARD -i r1-int -o r1-ext -j ACCEPT

ip netns exec router2 iptables -P FORWARD DROP
ip netns exec router2 iptables -A FORWARD -i r2-ext -o r2-int -m state --state ESTABLISHED,RELATED -j ACCEPT
ip netns exec router2 iptables -A FORWARD -i r2-int -o r2-ext -j ACCEPT

그러나 이러한 필터를 사용하더라도 두 번째 conntrack 항목은 계속 생성됩니다. 이유는 모르겠지만 제대로 작동하는 데 방해가 되지 않으므로 예상대로 작동한다고 가정합니다. 연결이 전혀 발생하지 않더라도 잠재적인 연결을 추적할 수 있도록 패킷이 기억됩니다.

관련 정보