如何使用 OpenVPN 处理除端口 80 和 22(入站和出站)以外的所有流量?

如何使用 OpenVPN 处理除端口 80 和 22(入站和出站)以外的所有流量?

我使用动态 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

相关内容