iptables NAT与网桥,容器和systemd-networkd:没有转发

我在CentOS 7上configuration一个iptables NAT时遇到了一些问题。当前在NAT后面的客户端可以到达外部IP而不是外部networking。

我遵循这个教程来设置我的NAT,知道它在Gentoo和Arch上运行良好:

http://www.revsys.com/writings/quicktips/nat.html

模式化我的问题:

  • eth0(external)= 192.168.1.1/24
  • eth1(internal)= 192.168.2.1/24

当我从192.168.2.2 ping:

  • ping 192.168.1.1:好的
  • ping 192.168.1.2:NOK
  • ping 8.8.8.8:NOK

请注意,我也build立了一个从192.168.1.1:80到192.168.2.2:80的端口转发规则。 这样做很好,根据Wireshark我的数据包被成功转发到192.168.2.2。 然后192.168.2.2回复但数据包被丢弃,所以我看到多个TCP重新传输。 没有任何“主机行政禁止”消息。

当我尝试从外部连接到192.168.2.2:80时,这里是滴水信息:

1 drops at ip_error+68 (0xffffffff815c47d8) 1 drops at ip_error+68 (0xffffffff815c47d8) 1 drops at ip_error+68 (0xffffffff815c47d8) 1 drops at ip_error+68 (0xffffffff815c47d8) 1 drops at tcp_rcv_state_process+1b0 (0xffffffff815e5030) 1 drops at ip_error+68 (0xffffffff815c47d8) 1 drops at tcp_rcv_state_process+1b0 (0xffffffff815e5030) 1 drops at ip_error+68 (0xffffffff815c47d8) 2 drops at ip_error+68 (0xffffffff815c47d8) 1 drops at tcp_v4_do_rcv+80 (0xffffffff815ef160) 1 drops at ip_error+68 (0xffffffff815c47d8) 1 drops at tcp_v4_do_rcv+80 (0xffffffff815ef160) 1 drops at ip_error+68 (0xffffffff815c47d8) 2 drops at ip_error+68 (0xffffffff815c47d8) 1 drops at tcp_v4_do_rcv+80 (0xffffffff815ef160) 2 drops at ip_error+68 (0xffffffff815c47d8) 1 drops at tcp_v4_do_rcv+80 (0xffffffff815ef160) 1 drops at ip_error+68 (0xffffffff815c47d8) 

请有人知道我做错了什么吗? 谢谢大家。

编辑:

 -P INPUT ACCEPT -P FORWARD ACCEPT -P OUTPUT ACCEPT -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT -A INPUT -p icmp -j ACCEPT -A INPUT -i lo -j ACCEPT -A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT -A FORWARD -i eth0 -o eth1 -m state --state RELATED,ESTABLISHED -j ACCEPT -A FORWARD -i eth1 -o eth0 -j ACCEPT -A FORWARD -d 192.168.2.2/32 -p tcp -m tcp --dport 80 -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT Chain PREROUTING (policy ACCEPT 1270 packets, 123K bytes) pkts bytes target prot opt in out source destination 30 1696 DNAT tcp -- eth0 any anywhere anywhere tcp dpt:http to:192.168.2.2:80 Chain INPUT (policy ACCEPT 347 packets, 42272 bytes) pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 6 packets, 431 bytes) pkts bytes target prot opt in out source destination Chain POSTROUTING (policy ACCEPT 30 packets, 1696 bytes) pkts bytes target prot opt in out source destination 6 431 MASQUERADE all -- any eth0 anywhere anywhere 

编辑:

是IP转发已正确设置。 当我从192.168.2.2 ping到192.168.1.2我无法看到192.168.1.2 Wireshark任何传入的数据包。 在使用Wireshark的时候我也看不到eth0的任何包。

奇怪的是,当我成功从192.168.2.2 ping 192.168.1.1时,我看不到在eth0上传入的任何ICMP数据包。

我想我必须补充一些我没有披露的东西,因为我没有发现它是相关的。 实际上,我正试图将一个名为br0的网桥(我的eth1在这里)连接到本地局域网。 我的服务器192.168.2.2是在一个连接到网桥veth的容器

我不知道是否应该编辑我的所有post,以更好地反映情况。 我认为我的问题纯粹是一个iptable错误,但在networking堆栈中似乎有些问题,因为ping 192.168.1.1时应该看到传入的ICMP数据包。

当我说我已经在Gentoo和Arch上进行了这个设置时,也使用了LXC。 现在我尝试使用systemd-nspawn。 Selinux被定为宽容。 从我的CentOS主机ping 192.168.2.2是好的,迫使它使用eth0不起作用,但这是正常的行为。

路线主持人:

 default via 192.168.1.254 dev eth0 proto static metric 100 192.168.2.0/24 dev br0 proto kernel scope link src 192.168.2.1 192.168.1.0/24 dev eth0 proto kernel scope link src 192.168.1.1 metric 100 

路线容器:

 default via 192.168.2.1 dev host0 proto static 192.168.2.0/24 dev host0 proto kernel scope link src 192.168.2.2 

最后,我非常头疼后find解决scheme…

我正在使用systemd-networkd来设置我的网桥。 虽然net.ipv4.ip_forward被正确设置为1,并且我也将net.ipv4.conf.all.forwarding设置为1,但是似乎systemd-networkd没有考虑到我的默认设置,同时启动网桥。

Si它结束net.ipv4.conf.br0.forwarding被设置为0.我只是将其设置为1,现在它的工作。

对于碰巧遇到类似问题的所有人,请运行以下命令:

 sysctl -a | grep "\.forwarding" | grep ipv4 

确保您的所有接口都已启用转发。

祝你今天愉快。