涉及设备:一台VPS,一台路由器,以及连接到路由器的若干台设备。
最终目标:基于已连接到 VPS 服务器的 OpenVPN 客户端,指定仅有的本地一台设备通过VPN访问互联网,并将VPS的部分端口转发到指定设备上。
VPS 网络:
Public IP: 157.7.201.X
路由器网络:
WAN: 192.168.178.207/27
LAN: 192.168.1.0/24
VPN:
DHCP: 10.168.1.0/29
VPS: 10.168.1.1 (static)
Client: 10.168.1.2 (static)
指定设备的 IP 为192.168.1.123 (static)
(大家可以跳过下面的详细配置直接看我现在的情况,因为有点长而且不是每一行都有用。)
以下是我的 VPS 的 iptables:
root@VPS:~# iptables -t nat -L POSTROUTING -vn
Chain POSTROUTING (policy ACCEPT 24 packets, 2860 bytes)
pkts bytes target prot opt in out source destination
6280 663K SNAT all -- * * 10.168.1.0/29 0.0.0.0/0 to:157.7.201.X
我的路由器的路由表:
root@Onee3:/tmp/home/root# route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.178.193 * 255.255.255.255 UH 0 0 0 vlan1
157.7.201.85 192.168.178.193 255.255.255.255 UGH 0 0 0 vlan1
10.168.1.1 * 255.255.255.255 UH 0 0 0 tun11
10.168.1.0 10.168.1.1 255.255.255.248 UG 0 0 0 tun11
192.168.178.192 * 255.255.255.224 U 0 0 0 vlan1
192.168.1.0 * 255.255.255.0 U 0 0 0 br0
127.0.0.0 * 255.0.0.0 U 0 0 0 lo
default 192.168.178.193 0.0.0.0 UG 0 0 0 vlan1
我的路由器的 iptables:
root@Onee3:/tmp/home/root# iptables -t nat -L POSTROUTING -vn
Chain POSTROUTING (policy ACCEPT 5 packets, 709 bytes)
pkts bytes target prot opt in out source destination
75 14012 SNAT all -- * br0 192.168.1.0/24 192.168.1.0/24 to:192.168.1.233
12828 1438K SNAT all -- * vlan1 192.168.1.100 0.0.0.0/0 to:192.168.178.207
27 1764 SNAT all -- * tun11 0.0.0.0/0 10.168.1.0/29 to:10.168.1.2
33 1980 SNAT all -- * vlan1 192.168.1.222 0.0.0.0/0 to:192.168.178.207
0 0 SNAT all -- * tun11 192.168.1.123 0.0.0.0/0 to:10.168.1.2
我现在的情况是:
路由器本身可以通过物理网络访问互联网,可以访问任意主机,包括10.168.1.1(这是VPS的虚拟IP)。
任何连接到路由器的设备都可以正常访问路由器和VPS的虚拟IP,路由器iptables中包含的设置使用vlan1的设备都可以正常上网,例如列表中的192.168.1.100,其他没有包含在内,因为默认的MASQUERADE记录被手动删除了,所以无法上网。
因此现在我在路由器的 iptables 中添加了一条记录,通过 SNAT(在上面的列表中)或 MASQUERADE(也尝试过)将 192.168.1.123 的 IP 转发到 10.168.1.2,但结果是 192.168.1.123 只能访问 LAN 中的主机或 VPS 的虚拟 IP。
简而言之,我现在距离最终目标还差一半(甚至更少)。请帮助我,谢谢。
答案1
看来问题真的与预路由或后路由无关
我最终通过添加新的路由表解决了这个问题
route add default gw 192.168.178.193 # to add a default route of the local physical network, notice that it should be above the one of the VPN
ip route del default via 10.168.1.1 dev tun11 table main # delete the VPN route from the main route table
ip route add table 200 via 10.168.1.1 dev tun11 # create a new table numbered 200 to use the VPN
ip rule add from 192.168.1.200/32 table 200 # add devices which are expected to be connected to the VPN
ip rule add from 192.168.1.222/32 table 200
然后对于端口转发,我参考了https://unix.stackexchange.com/questions/55791/port-forward-to-vpn-client