![为什么需要这条 MASQUERADE 规则?](https://linux22.com/image/739439/%E4%B8%BA%E4%BB%80%E4%B9%88%E9%9C%80%E8%A6%81%E8%BF%99%E6%9D%A1%20MASQUERADE%20%E8%A7%84%E5%88%99%EF%BC%9F.png)
我目前有一个 VPN 站点到站点设置,其中 Centos7 服务器设置为远程站点隧道的 VPN 客户端。隧道建立良好,我正尝试通过隧道访问远程站点的资源,但到目前为止,除了 VPN 客户端本身之外,我无法 ping 通任何东西,它后面什么都无法ping 通。
远程站点 VPN 客户端(centos7 服务器)可以 ping 并访问资源,但 VPN 客户端防火墙后面的客户端则无法访问。
设置:
主站点:路由器/防火墙:192.168.150.1(运行 openvpn/sophos 防火墙)
客户端站点:Centos7 服务器 192.168.200.1(eth0 地址)/ 192.168.201.1(tun0 地址)
主站点上的客户端(例如 192.168.150.2)可以 ping 通 192.168.200.1 和 192.168.201.2,但不能 ping 通 192.168.200.50(客户端站点上的资源)。
在客户端站点上,我在firewalld中设置了以下直接规则:
ipv4 filter FORWARD 0 -i tun0 -o eth0 -p icmp -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
ipv4 filter FORWARD 0 -i eth0 -o tun0 -p icmp -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
内核已启用 ipv4 转发。每个接口在 Firewalld 中都位于自己的区域中。
添加此规则可解决问题,并建立连接。但为什么?我不想要任何 NAT。
ipv4 nat POSTROUTING 0 -o eth0 -j MASQUERADE
答案1
从完整描述中,我可以猜测“主站点”上一切正常,所有需要的路由设置都正确。我会在 IP 为 192.168.200.50 的主机上看到“问题”(否则仅一个 MASQUERADE 规则是不够的)。
这种行为意味着,一旦您尝试从主站点与 192.168.200.50 进行通信,它就会通过 VPN 隧道正确路由到 192.168.201.1,然后再路由到 192.168.200.50(您可以尝试捕获 192.168.200.50 上的流量,并且很可能会看到传入数据)。问题在于回复。192.168.200.50 节点不知道如何与 192.168.201.0/x 或 192.168.150.0/y 进行通信。结果是响应被路由到默认网关,而未到达目的地...
使用 NAT 规则,流量似乎源自 192.168.200.1,因此 192.168.200.50 将其正确引导回“VPN GW”,在那里它被“解除 NAT”并通过隧道正确发送回来。
尝试在 192.168.200.50 上添加这些规则(假设两个掩码都是 /24):
ip route add 192.168.201.0/24 via 192.168.200.1
ip route add 192.168.150.0/24 via 192.168.200.1
然后在 192.168.200.1 上重试不使用 MASQUERADE 规则的通信,我认为它会按预期工作。祝你好运!
-- 编辑 / 2019 年 6 月 22 日星期六 21:09 UTC --
或者,您可以尝试在 192.168.200.0/24 的默认网关上添加静态路由(因为 VPN 使用的是 .1,所以网关可能是 .254 :) )。然后它也可以工作,因为 192.168.200.50 会通过默认网关正常将其发回,但它会将其发回“VPN 网关”...