使用 iptables MASQUERADE 规则的 NAT 设置为从外部 WAN 接口进入的数据包添加 conntrack 条目

使用 iptables MASQUERADE 规则的 NAT 设置为从外部 WAN 接口进入的数据包添加 conntrack 条目

我正在模拟网络命名空间内的 NAT/路由器设置,并且遇到了奇怪的行为,其中 conntrack 条目是由从外部 WAN 接口发送到路由器的数据包创建的。我期望只有当数据包从内部接口转发到外部接口时才应该创建这样的 conntrack 条目(从而执行保护内部网络免受外部网络影响的 NAT 功能)。

这是我的情况:

建筑学

请注意,上面的架构图像有点过时了。我正在使用192.168.0.1192.168.0.2,而不是198.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

agent1当我从to发送 UDP 数据包时router2,这会router1按预期创建 conntrack 条目。它失败了,因为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阻止我从agent2向发送数据包router1

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

SECOND PACKET到达router2 r2-int接口,然后就消失,它永远不会被发送r2-ext,也永远不会到达router1

我怀疑我的iptables规则太笼统,需要更有选择性(https://superuser.com/questions/1706874/iptables-selective-masquerade)。然而,我尝试仅使用-s 10.0.0.0/24源地址匹配,它仍然导致相同的行为。

我在iptables设置中遗漏了什么吗?如何确保 conntrack 条目不会router2在从 发送过来的数据包中创建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在外部接口上的两个路由器(在不同的 xterms 中)上启动:

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 条目。我不知道这是为什么,但因为它并没有阻止任何东西正常工作,所以我只是假设它按预期工作:数据包被记忆以便能够跟踪潜在的连接,即使该连接永远不会发生。

相关内容