我正在使用 LXC 容器。我的每个容器都有一个 10.0.3.0/24 中的 IP 地址。我希望从某个端口进入主机的数据包被重定向到容器,因此我使用以下规则:
iptables -t nat -A PREROUTING -p tcp --dport 3000 -j DNAT --to-destination 10.0.3.4:3000
这允许执行(外部数据包)# --> HOST:3000 --> CONTAINER:3000
效果很好。但是,当我在容器内(不是上一条规则中使用的容器)并且想要访问端口 3000 上的另一个主机(例如 HOST2)时,我的数据包将被重定向到我的容器。它确实:
(容器包内)# --> HOST2:3000 --> HOST:3000 --> CONTAINER:3000
而不是(容器包内)# --> HOST2:3000 --> HOST:3000 --> HOST2:3000
我尝试将上述规则改为
iptables -t nat -A PREROUTING -s 10.0.3.0/24 -p tcp --dport 3000 -j DNAT --to-destination 10.0.3.4:3000
意思是:如果数据包来自容器,则不应用规则,但这不起作用。任何帮助都很好,问候
这是我的 iptables 规则:
Chain PREROUTING (policy ACCEPT 154 packets, 29925 bytes)
pkts bytes target prot opt in out source destination
4 240 DNAT tcp -- * * 10.0.3.0/24 0.0.0.0/0 tcp dpt:3000 to:10.0.3.5:3000
3 180 DNAT tcp -- * * 10.0.3.0/24 0.0.0.0/0 tcp dpt:3001 to:10.0.3.6:3001
Chain INPUT (policy ACCEPT 126 packets, 28400 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 25 packets, 1900 bytes)
pkts bytes target prot opt in out source destination
Chain POSTROUTING (policy ACCEPT 29 packets, 2140 bytes)
pkts bytes target prot opt in out source destination
28 1525 MASQUERADE all -- * * 10.0.3.0/24 !10.0.3.0/24
不起作用的意思是,当我从容器内 curl 3000 个主机时,我会被重定向到我的容器:3000
答案1
标志-s
仅选择与指定主机或网络匹配的流量。如果要匹配所有流量除了即使用
! -s 10.0.3.0/24
并且不要忘记!
使用引号或反斜杠将其从 shell 中转义。