在 Centos 7 上使用 Firewalld 设置 NAT

在 Centos 7 上使用 Firewalld 设置 NAT

我有两台服务器,我们将其称为 ROUTER 和 NODE。NODE 位于私有网络 172.27.1.64/28 上,IP 地址为 172.27.1.69。ROUTER 也位于该私有网络上,IP 地址为 172.27.1.71。ROUTER 有一个公共 IP 地址,在本例中我们将其称为 192.168.50.100。在 ROUTER 上,通过接口 eth1 访问私有网络,通过 eth0 访问公共网络。在 NODE 上,只有 eth0,它连接到私有网络。下面的路由表中出现了另一个私有子网,但与这个问题无关(我希望如此)。

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

有很多指南可以做到这一点,我也尝试遵循它们,但我无法从 NODE ping 或以其他方式通过 IP 地址或名称访问主机。

以下是我的配置:

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

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

ROUTER上的路由表:

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 都无法从 NODE 运行:

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% 数据包丢失。对 google.com 的 IP 地址使用 curl 得到相同的结果:从 ROUTER 可以正常工作,但从 NODE 无法正常工作。

答案1

当然,问题最终出现在完全不同的地方。我需要禁用 OpenStack 在私有网络接口上的反欺骗功能。

我可以验证防火墙中所有三条规则都是必要的。

相关内容