我使用动态 DNS 服务,该服务会从我的路由器发送 IP 地址更新。在路由器设置中,端口 22 和 80 会转发到我的服务器 192.168.1.10。我的服务器上运行着一个 Web 服务器和 sshd。从本地网络之外,我可以访问 mydomain.dyndns.org,或 ssh 进入我的服务器。在我连接到 OpenVPN 之前,这很正常。当我将服务器连接到 OpenVPN 提供商时,我无法再从本地网络之外 ssh 进入我的服务器。http 和 ssh 都超时了。即使我删除了 dyndns 内容并只使用 WAN IP,在连接 OpenVPN 的情况下它仍然会超时,而当我停止 OpenVPN 时它又可以正常工作。
我的 OpenVPN 提供商(我无法控制)将路由推送给我(客户端)。具体来说,当连接到 openvpn 时,会运行以下命令:
/sbin/ifconfig tun0 10.15.0.74 pointopoint 10.15.0.73 mtu 1500
/sbin/route add -net 141.255.164.66 netmask 255.255.255.255 gw 192.168.1.1
/sbin/route add -net 0.0.0.0 netmask 128.0.0.0 gw 10.15.0.73
/sbin/route add -net 128.0.0.0 netmask 128.0.0.0 gw 10.15.0.73
/sbin/route add -net 10.15.0.1 netmask 255.255.255.255 gw 10.15.0.73
del
当 VPN 连接关闭时,添加的路由将被删除。
问题是,这条路线一切通过 VPN。相反,我希望我的服务器使用 openvpn 来处理除端口 80 和 22(入站和出站)之外的所有流量。也就是说,我希望能够使用 http 和 ssh 连接到我的服务器。
我相信也有人问过类似的问题,但似乎都是通过 VPN 和其他所有东西来路由特定端口,而不是通过 VPN。我无法根据自己的目的调整它们。
编辑:
我的路由器是 192.168.1.1(dd-wrt 路由器)。我猜应该标记 ssh/http 流量并将其设置为使用 192.168.1.1 作为默认网关。但是,我不确定该怎么做。
编辑2:
根据 leucos 的建议,我尝试了以下方法:
root@FILESERVER:~# curl ipecho.net/plain; echo
###.###.135.118
root@FILESERVER:~# echo "Connecting to OpenVPN in other terminal"
Connecting to OpenVPN in other terminal
root@FILESERVER:~# curl ipecho.net/plain; echo
###.###.164.93
root@FILESERVER:~# echo "1 NOVPN" >> /etc/iproute2/rt_tables
root@FILESERVER:~# ip route add default via 192.168.1.1 dev p4p1 table NOVPN
root@FILESERVER:~# ip route show table NOVPN
default via 192.168.1.1 dev p4p1
root@FILESERVER:~# ip rule add from all fwmark 0x1 lookup NOVPN
root@FILESERVER:~# iptables -t mangle -I PREROUTING -p tcp --dport 22 -j MARK --set-mark 1
root@FILESERVER:~# iptables -t mangle -I PREROUTING -p tcp --dport 80 -j MARK --set-mark 1
root@FILESERVER:~# curl ipecho.net/plain; echo
###.###.164.93
现在我不再确切地不确定 ipecho.net 是如何工作的,但我猜测它已经从 ###.###.164.93 收到了一些数据,这意味着端口 80 的流量不是通过 p4p1(我的本机接口)路由,但改为通过 tun0(由 OpenVPN 设置)路由。尝试从我的网络外部进行连接也继续超时。
答案1
“正常”路由决策基于目的地和路由表前缀和掩码。如果您想根据其他数据(例如 TCP 端口)做出路由决策,则必须使用ip rule
。
使用ip rule
,您基本上可以要求内核在发生某些情况时使用备用路由表。您通常使用 iptables 中的数据包标记来实现此目的。
这是一个未经测试的例子,您可能想尝试一下(如果您只有与服务器的远程连接,请不要玩这个!)。
# Create an alternate routing table
echo "1 NOVPN" >> /etc/iproute2/rt_tables
# Create the routes for this table
# Actually, you just want to set the default gateway
ip route add default via 192.168.1.1 dev eth0 table NOVPN
# Check results with
ip route show table NOVPN
# Now tell the kernel that this routing table should be used when
# a packet waiting to be routed has a specific "mark"
ip rule add from all fwmark 0x1 lookup NOVPN
# Then mark all the required packets with the same mark use above
iptables -t mangle -I OUTPUT -p tcp --sport 22 -j MARK --set-mark 1
iptables -t mangle -I OUTPUT -p tcp --sport 80 -j MARK --set-mark 1
祝你好运。
编辑:
您可能还需要调整源地址:
iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source 192.168.1.10
如果不起作用,请检查发生的情况:
tcpdump -enieth0 port 80
(我假设我的回复中正确的出站以太网接口是 eth0)
答案2
这会导致所有流量都通过 VPN
/sbin/route add -net 0.0.0.0 netmask 128.0.0.0 gw 10.15.0.73
/sbin/route add -net 128.0.0.0 netmask 128.0.0.0 gw 10.15.0.73
您是否在配置文件中指定了这一点?根据OpenVPN 文档相关配置指令是redirect-gateway