我的设置:
在客户端上,我有一个在端口 443 上运行的 Web 服务器。客户端通过 OpenVPN 连接到远程服务器。OpenVPN 服务器将其端口 443 转发到客户端 tun0 地址 (10.0.0.2)。
iptables -A PREROUTING -d [REMOTE_IP] -p tcp -m tcp --dport 443 -j DNAT --to-destination 10.0.0.2:443
OpenVPN 服务器伪装来自客户端的传出连接。
iptables -A POSTROUTING -s 10.0.0.2/32 -o eth0 -j MASQUERADE
如果我通过 VPN 路由整个客户端流量,则push "redirect-gateway def1"
一切正常。
但我希望客户端仅使用 VPN 来响应来自 VPN 的 Web 服务器的传入连接。因此,我希望保留客户端传出流量的原始默认网关。伪装从服务器到客户端的流量不是一种选择,因为 Web 服务器无法记录传入连接的真实 IP。
如果我不使用push "redirect-gateway def1"
并尝试从 OpenVPN 服务器外部连接到 Web 服务器,我只能在客户端 tun0 接口上监控 TCP-SYN 数据包,但 Web 服务器不会在任何接口上使用 TCP-ACK 进行应答。我希望默认网关接口上至少有一个传出的 TCP-ACK 数据包。如果我尝试从 OpenVPN 服务器本身(源 IP 10.0.0.1)进行连接,它就可以正常工作。
我的路由表:
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.0.1 0.0.0.0 UG 0 0 0 eth0
10.0.0.1 255.255.255.255 255.255.255.255 UGH 0 0 0 tun0
192.168.0.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
[Remote-Server] 192.168.0.1 255.255.255.255 UGH 0 0 0 eth0
255.255.255.255 0.0.0.0 255.255.255.255 UH 0 0 0 tun0
有没有办法使用 OpenVPN 服务器进行端口转发,而无需通过 vpn 重定向完整的流量?
答案1
我找到了一个解决方案,但并不是一个很好的解决方案。
此链接帮助我解决了这个问题: https://askubuntu.com/questions/1004295/ubuntu-server-16-04-to-2-gateway-at-same-time
在客户端我添加了一个路由表:
echo 1 vpn >> /etc/iproute2/rt_tables
我将 OpenVPN 服务器作为默认网关添加到此路由表:
ip route add default via 10.0.0.1 dev tun0 table vpn
我将 Web 服务器监听端口更改为任意一个希望很少使用的端口 800,并让任何往返于该端口的连接使用新的路由表“vpn”:
ip rule add dport 800 table vpn
ip rule add sport 800 table vpn
不幸的是其他规则不起作用。我尝试了以下方法,但没有成功:
ip rule add to 10.0.0.0/24 table vpn
ip rule add from 10.0.0.0/24 table vpn
ip rule add iif tun0 table vpn
ip rule add oif tun0 table vpn
答案2
使用多个路由表,您走在正确的道路上。您只需稍微调整一下您正在创建的规则,让这些数据包使用 vpn 表而不是主路由表。在我的解决方案中,我还让 OpenVPN 运行路由脚本,该脚本会在连接时自动设置路由。
在 OpenVPN 客户端配置中,您可以添加:
script-security 2
route-up /etc/openvpn/up.sh
与之前一样,添加 vpn 路由表:
echo 1 vpn >> /etc/iproute2/rt_tables
现在创建脚本/etc/openvpn/up.sh
。它应该包含:
#!/bin/bash
/sbin/ip route add 10.8.0.0/24 dev tun0 src 10.8.0.2 table vpn
/sbin/ip route add default via 10.8.0.1 dev tun0 table vpn
/sbin/ip rule add from 10.8.0.2 table vpn
/sbin/ip rule add to 10.8.0.2 table vpn
将 IP 替换为适用的范围。(在此示例中,10.8.0.0/24 是服务器配置的 IP 范围,10.8.0.1 是 OpenVPN 服务器,10.8.0.2 是 OpenVPN 客户端。)