![具有一个网络接口的 Iptables + NAT 和端口转发循环](https://linux22.com/image/701713/%E5%85%B7%E6%9C%89%E4%B8%80%E4%B8%AA%E7%BD%91%E7%BB%9C%E6%8E%A5%E5%8F%A3%E7%9A%84%20Iptables%20%2B%20NAT%20%E5%92%8C%E7%AB%AF%E5%8F%A3%E8%BD%AC%E5%8F%91%E5%BE%AA%E7%8E%AF.png)
我正在 AWS 中设置 NAT 服务器后面的 OpenVPN 访问服务器。目前,我的 NAT 服务器有一个网络接口,我正在尝试将一些端口转发到 OpenVPN 访问服务器。
端口转发有效,我可以通过浏览器或 OpenVPN 客户端连接到我的 OpenVPN 访问服务器(建立 VPN 连接)。
现在的问题是 OpenVPN Access Server 使用端口 443 和 943 进行 HTTPS。但是当我尝试在连接到 VPN 的同时访问 HTTPS 网站时,HTTPS 证书全部失效,因为 HTTPS 连接被重定向回 OpenVPN AS。
这是我的 IPTABLES 规则:
iptables -t nat -A POSTROUTING -o eth0 -s 172.16.0.0/24 -j MASQUERADE
iptables -A FORWARD -m state -p tcp -d 172.16.0.213 --dport 943 --state NEW,ESTABLISHED,RELATED -j ACCEPT
iptables -t nat -A PREROUTING -p tcp --dport 943 -j DNAT --to-destination 172.16.0.213:943
iptables -t nat -A POSTROUTING -p tcp -d 172.16.0.213 --dport 943 -j SNAT --to-source 172.16.0.213
iptables -A FORWARD -m state -p tcp -d 172.16.0.213 --dport 443 --state NEW,ESTABLISHED,RELATED -j ACCEPT
iptables -t nat -A PREROUTING -p tcp --dport 443 -j DNAT --to-destination 172.16.0.213:443
iptables -t nat -A POSTROUTING -p tcp -d 172.16.0.213 --dport 443 -j SNAT --to-source 172.16.0.213
iptables -t nat -A PREROUTING -p udp -i eth0 -d 172.16.0.213 --dport 1194 -j DNAT --to-destination 172.16.0.213:1194
iptables -t nat -L的输出:
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
DNAT tcp -- anywhere anywhere tcp dpt:https to:172.16.0.213:443
DNAT udp -- anywhere ip-172-16-0-213.eu-west-1.compute.internal udp dpt:openvpn to:172.16.0.213:1194
DNAT tcp -- anywhere anywhere tcp dpt:943 to:172.16.0.213:943
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
SNAT tcp -- anywhere ip-172-16-0-213.eu-west-1.compute.internal tcp dpt:https to:172.16.0.213
SNAT tcp -- anywhere ip-172-16-0-213.eu-west-1.compute.internal tcp dpt:943 to:172.16.0.213
MASQUERADE all -- ip-172-16-0-0.eu-west-1.compute.internal/24 anywhere
是否仍然可以使用一个网络接口来执行此操作并使用 iptables 解决它?
基本上,我想告诉“iptables,请不要从内部到外部进行任何端口转发”,目前端口转发进入“循环”。
感谢您的帮助和想法!
答案1
您应该重新考虑是否需要任何 DNAT 规则。您没有提供原因。SNAT 规则也是如此,因为它们强制所有连接都显示为本地连接,而原因不明确。
如果需要 DNAT,请使用 connmark 在 mangle 表的 PREROUTING 链中标记和恢复来自 openvpn-as tun 接口的数据包,并-m mark ! --mark <the mark you set>
在 nat PREROUTING 端口 443 DNAT 规则上添加条件。这将防止传出连接被 DNAT 回您的设备。
根据您的网络进行编辑:
删除所有 SNAT 规则。如果存在此规则,则无法审核 openvpn-as 服务器上的连接。
确保 openvpn-as 服务器通过网关路由连接。将默认路由设置为网关(简单),或策略路由(复杂)。
将所有 DNAT 规则更改为忽略本地源范围,即! -s 172.16.0.0/24
。如果 openvpn-as 未执行 MASQUERADE 或 SNAT,则可能需要添加 VPN IP 范围以及! -s base/mask
每个范围的其他内容。
答案2
iptables -t nat -I PREROUTING -i eth1 -p tcp --dport 443 -j DNAT --to 192.168.0.1:943
iptables -t nat -I POSTROUTING -o eth1 -p tcp -d 192.168.0.1 --dport 943 -j MASQUERADE
将 443 替换为要监听的公共端口,将 192.168.0.1 替换为您的其他服务器,将 943 替换为其他服务器的监听端口。替换eth1
为您的接口。请注意,某些配置有虚拟接口,因此可能需要 vlan1 或 ppp0 之类的东西。
第一行是转发数据包的基本规则。但是由于数据包的源地址保持不变,因此会导致不对称路由,从而破坏此有状态 netfilter。因此出现了第二行 - 将数据包的源地址替换为此服务器之一。这会使连接稍微绕道,迫使它两次通过此服务器,但它确实消除了不对称性,从而使其正常工作。
此解决方案依赖于所使用的端口来判断第一条规则中的哪些连接被第二条规则使用。对于您的简单设置,这没问题,但对于任何试图在路由器中实现此解决方案的人,如果路由器后面有用户试图访问相同的资源,则值得注意的是,MARK
应该使用 netfilter 的功能来告诉第二MASQUERADE
行它应该处理哪些数据包,而不仅仅是端口。将其MASQUERADE
应用于所有内容可能会引发不必要的行为。