我有一个在网络命名空间中运行的服务,并且很少有 iptables 规则将其暴露给外部世界。
以下命令是我的设置示例:
sudo ip netns add ns1
sudo ip link add veth1_ type veth peer name veth1
sudo ip link set veth1_ netns ns1
sudo ip netns exec ns1 ifconfig veth1_ 192.168.0.2/24 up
sudo ifconfig veth1 192.168.0.1/24 up
sudo iptables -P FORWARD ACCEPT
sudo iptables -t nat -A POSTROUTING -o veth1 -j MASQUERADE
sudo iptables -t nat -A PREROUTING -p tcp -m tcp --dport 50000 -j DNAT --to-destination 192.168.0.2:8000
sudo ip netns exec ns1 netcat -l 8000
我可以通过 :50000 端口访问该服务,所以到目前为止还没有问题。
我还需要路由源自该网络命名空间并通过特殊接口发送至特定 IP 地址的数据包,为此,我使用源路由策略。
sudo ip route add 172.23.23.23 via X.X.X.X table 1000
sudo ip rule add from 192.168.0.2 iif veth1 to 172.23.23.23 lookup 1000
当我尝试从主机 172.23.23.23 访问该服务时,它无法工作,而它可以从任何其他主机工作。
我的问题是,为什么这个基于源的策略路由会影响流量?进入 veth1 的数据包被伪装,因此答案不应与这些规则匹配。我的推理有错吗?
谢谢,