在Centos 7上使用firewalldbuild立NAT

我有两台服务器,我们称之为ROUTER和NODE。 NODE是在专有networking172.27.1.64/28,有IP地址172.27.1.69。 路由器也在该专用networking上,IP地址为172.27.1.71。 路由器有一个公共IP地址,我们将在这个例子中调用192.168.50.100。 在ROUTER上,通过接口eth1访问专用networking,通过eth0访问公用networking。 在NODE上,只有eth0连接到专用networking。 还有一个私有子网出现在下面的路由表中,但不应该是相关的(我希望)这个问题。

我想要做的就是把ROUTER当作一个使用NAT的路由器。 NODE应该能够通过ROUTER连接到一般的互联网,但是不能连接到相反的方向。

这里有很多指南,我试图去关注它们,但是我一直无法通过NODE的IP地址或名称来ping或者访问主机。

这是我在configuration方面的:

公共接口位于“公共”区域,私人接口位于“内部”区域。

NODE路由表:

default via 172.27.1.71 dev eth0 unreachable 169.254.169.254 scope host 172.27.1.64/28 dev eth0 proto kernel scope link src 172.27.1.69 172.27.9.192/28 dev eth0 scope link 

路由器上的路由表:

 default via 192.168.50.1 dev eth0 192.168.50.0/24 dev eth0 proto kernel scope link src 192.168.50.100 unreachable 169.254.169.254 scope host 172.27.1.64/28 dev eth1 proto kernel scope link src 172.27.1.71 172.27.9.192/28 dev eth1 scope link 

ROUTER上的FirewallD规则:

 # firewall-cmd --direct --get-all-rules ipv4 nat POSTROUTING 0 -o eth0 -j MASQUERADE 

我在ROUTER上另外有了这些规则,因为对每个方向都有特定的规则来接受数据包是有意义的,但是他们的存在或不存在没有任何区别 – 既不ping也不curl也不ssh工作:

 ipv4 filter FORWARD 0 -i eth1 -o eth0 -j ACCEPT ipv4 filter FORWARD 0 -i eth0 -o eth1 -m state --state RELATED,ESTABLISHED -j ACCEPT 

我通常用firewalld启用伪装:

 # firewall-cmd --zone public --query-masquerade yes 

而且我已经在内核中转发了IP:

 # sysctl net.ipv4.ip_forward net.ipv4.ip_forward = 1 

我试着通过ping 8.8.8.8。 它从ROUTER工作正常,但它不能从NODE工作。 100%的数据包丢失。 使用curl反对google.com的IP地址具有相同的结果:从ROUTER,而不是从NODE。

当然,问题最终变成完全不同的地方。 我需要禁用专用networking接口上的OpenStack的反欺骗。

我可以validation这三条规则在防火墙中是必须的。