无需重定向网关即可将 OpenVPN 服务器上的端口转发到客户端

无需重定向网关即可将 OpenVPN 服务器上的端口转发到客户端

我的设置:

在客户端上,我有一个在端口 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 客户端。)

相关内容