我在 Tomato (shibby) 上有一个路由器,运行 OpenVPN 服务器(带 TAP;接口在tap21
路由器上)。各种资源(包括一些工作站)都物理连接eth0
到此路由器上。我在全国各地还有另一台物理设备,运行着 nginx 和其他服务。现在,我知道这不是一个很好的地形设置,但不可改变的情况要求运行 nginx 的设备必须是路由器 VPN 的客户端,并且该设备的所有入站流量以及端口 80 和 443 上的出站流量都必须通过此 VPN 连接进行隧道传输。
因此基本上,需要发生的是:
- example.com 解析为路由器上的 WAN 的 IP
- 路由器通过接口将端口 80 和 443 转发
tap21
到 nginx 服务器 - nginx 服务器响应返回
tap21
并通过 WAN 路由回来
我遇到的问题#2部分。
该服务器目前能够与子网上的其他设备通信(能够 ping VPN 上的其他资源以及eth0
路由器上物理连接的资源),并且可以通过 VPN 访问互联网。但是,我无法将端口从 WAN 转发到 VPN 上的服务器地址。我做的第一次尝试只是尝试 Tomato 中的端口转发 GUI(但这似乎不适用于 VPN 上的 IP,只适用于eth0
或上的 IP wlan0
)。当这不起作用时,我尝试添加 iptables 规则,但由于我对 iptables 仍然不太熟悉,我只能从其他答案中找到与这种奇怪且有问题的网络设置无关的问题的片段。这是我正在尝试的(使用 10000 作为带监听的测试端口nc
):
iptables -t nat -I PREROUTING -p tcp -m tcp --dport 10000 -j DNAT --to-destination 192.168.12.53:10000
iptables -I FORWARD -d 192.168.12.53 -p tcp --dport 10000 -j ACCEPT
但是,我搞不清楚以这种方式重新路由的数据包发生了什么——它们肯定没有到达服务器。本质上,我的问题是如何将特定端口上的入站连接转发到 VPN 上的特定设备?当然,路由器上其他资源的端口 80 和 443 上的出站流量eth0
不能受到影响。
感谢您的任何帮助,您可以提供!
答案1
经过一番修改,我终于搞明白了(尽管我欢迎任何可以解释的评论为什么这是有效的)。首先,没有POSTROUTING
规则显然会导致服务器丢弃数据包。通过检查iptables
Tomato 通过 GUI 创建的规则,我为、和创建了类似的条目WANPREROUTING
;wanin
我INPUT
不完全确定为什么INPUT
需要该规则;也许可以将其删除并将-m
标志添加到wanin
?
iptables -t nat -I WANPREROUTING -i vlan2 -p tcp -m tcp --dport 80 -j DNAT --to-destination {SERVER_IP}:80
iptables -I wanin -d {SERVER_IP} -i vlan2 -p tcp --dport 80 -j ACCEPT
iptables -I INPUT -p tcp -m tcp -i vlan2 --dport 80 -m state --state NEW -j shlimit
Tomato GUI 不会POSTROUTING
自动创建规则,所以我也必须这样做:
iptables -t nat -I POSTROUTING -p tcp -d {SERVER_IP} --dport 80 -o tun22 \! -s {GATEWAY_IP} -j SNAT --to-source {GATEWAY_IP}
我为端口 80 和 443 制定了类似的规则集,现在我可以通过 VPN 从互联网访问服务器。