无需 NAT 的 OpenVPN 网关

无需 NAT 的 OpenVPN 网关

我正在尝试设置一个到远程网络的透明 VPN 网关,在远程网络上有一个 OpenVPN 服务器,在本地网络上有一个充当网关的 OpenVPN 客户端。

该图显示了每个主机的 IP 和路由,我用绿色标记了我添加的路由以使所有路由正常工作,我想在 VPN 服务器上进行 NAT,因此该网络的每个服务器上不需要额外的路由(名为目标的服务器是该网络上服务器的一个示例)。

编辑并添加说明:

我的问题仅存在于标有“VPN 客户端”的服务器上,我可以通过按照如下所述在该服务器中配置 NAT 来使设置工作,但我希望它将数据包路由到没有 NAT 的“VPN 服务器”,NAT 将由“VPN 服务器”执行。

连接图

据我了解,从标记为“工作站”的计算机到标记为“目的地”的服务器的 ping 操作应该可以工作,但实际上却不行,而 VPN 客户端的相同 ping 操作却可以按预期工作,只需在 VPN 服务器中执行一次 NAT。

如果我在两侧的 tun0 上打开 tcpdump,我可以在 VPN 客户端上看到从工作站到目的地的 ping 数据包,但在 VPN 服务器上看不到任何内容,以下是 VPN 客户端上 tcpdump 的输出:

$ sudo tcpdump -i tun0 'icmp'
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on tun0, link-type RAW (Raw IP), capture size 262144 bytes
16:07:11.391614 IP 10.1.110.7 > 192.168.1.63: ICMP echo request, id 10871, seq 49, length 64
16:07:12.404989 IP 10.1.110.7 > 192.168.1.63: ICMP echo request, id 10871, seq 50, length 64

如果我在 VPN 客户端上添加伪装规则,ping 将到达目的地并发送答复:

$ iptables -t nat -A POSTROUTING -o tun0 -j MASQUERADE

但是通过这种设置,我将执行两次 NAT,我希望 VPN 客户端无需进行 NAT 即可转发数据包。

防火墙转发策略设置为接受:

$ sudo iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         

并且没有可以干扰的 NAT 规则:

$ sudo iptables -L -t nat
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination         

Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination        

IP 转发已启用:

$ cat /proc/sys/net/ipv4/ip_forward
1

我错过了什么?

答案1

ip ro事实证明,除了您通过或看到的路由表之外,OpenVPN 有自己的路由表route -n

如果 OpenVPN 服务器收到来自客户端的数据包,而该客户端没有该数据包的路由(即 VPN 服务器,而非主机),则它会在数据包到达 tun0 之前将其丢弃。发生这种情况时,您会在 openvpn 日志中看到类似这样的消息:

Tue Nov 14 11:26:21 2017 us=135733 client/X.X.X.X:40770 MULTI: bad source address from client [10.1.110.7], packet dropped

发生这种情况时,您需要添加伊洛特iroutes 是客户端特定的,你必须启用客户端配置目录

#/etc/openvpn/server.conf
...
client-config-dir ccd

然后/etc/openvpn/ccd/<client_name>你可以在里面添加你的 iroute:

# /etc/openvpn/ccd/client
iroute 10.1.0.0 255.255.0.0

重新启动 OpenVPN 服务器后,您将看到数据包到达另一端的 tun0,因为此时 OpenVPN 不会丢弃它们。

相关内容