OpenVPN:连接到 VPN 隧道后无法路由到专用网络

OpenVPN:连接到 VPN 隧道后无法路由到专用网络

我正在尝试设置 OpenVPN 服务器以允许隧道连接到私有网络 (192.168.0.0/16),但当我的 VPN 客户端连接时,它无法访问此网络上的主机。目前未为网络设置防火墙/所有端口均已打开。运行 OpenVPN 的服务器在私有网络上分配有 IP 192.168.0.2

服务器配置文件

local 1.2.3.4
port 1194
proto udp
dev tun
ca ca.crt
cert server.crt
key server.key
dh dh.pem
auth SHA512
tls-crypt tc.key
topology subnet
server 10.8.0.0 255.255.255.0
server-ipv6 fddd:1194:1194:1194::/64
push "redirect-gateway def1 ipv6 bypass-dhcp"
push "route 192.168.0.0 255.255.0.0"
push "dhcp-option DNS 10.8.0.1"
ifconfig-pool-persist ipp.txt
keepalive 10 120
cipher AES-256-CBC
user nobody
group nogroup
persist-key
persist-tun
verb 3
crl-verify crl.pem
explicit-exit-notify

客户端.ovpn

client
dev tun
proto udp
remote 1.2.3.4 1194
resolv-retry infinite
nobind
persist-key
persist-tun
remote-cert-tls server
auth SHA512
cipher AES-256-CBC
ignore-unknown-option block-outside-dns
block-outside-dns
verb 3
<ca>
REDACTED
</ca>
<cert>
REDACTED
</cert>
<key>
REDACTED
</key>
<tls-crypt>
REDACTED
</tls-crypt>

连接到 OpenVPN 服务器的客户端可以 ping OpenVPN 网关,也可以使用其他子网上的 IP。但是,它无法 ping 同一网络上的其他主机...

[26/10/21 19:58:32] user@client:~$ ping 10.8.0.1
PING 10.8.0.1 (10.8.0.1) 56(84) bytes of data.
64 bytes from 10.8.0.1: icmp_seq=1 ttl=64 time=27.3 ms
^C
--- 10.8.0.1 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 27.276/27.276/27.276/0.000 ms
[26/10/21 19:58:49] user@client:~$ ping 192.168.0.2
PING 192.168.0.2 (192.168.0.2) 56(84) bytes of data.
64 bytes from 192.168.0.2: icmp_seq=1 ttl=64 time=27.3 ms
^C
--- 192.168.0.2 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 27.271/27.271/27.271/0.000 ms
[26/10/21 19:58:52] user@client:~$ ping 192.168.0.3
PING 192.168.0.3 (192.168.0.3) 56(84) bytes of data.
^C
--- 192.168.0.3 ping statistics ---
1 packets transmitted, 0 received, 100% packet loss, time 0ms

OpenVPN 服务器可以 ping 同一网络上的不同主机......

root@server:~# ping 192.168.0.3
PING 192.168.0.3 (192.168.0.3) 56(84) bytes of data.
64 bytes from 192.168.0.3: icmp_seq=1 ttl=63 time=1.26 ms
^C
--- 192.168.0.3 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 1.262/1.262/1.262/0.000 ms

OpenVPN 服务器路由表...

root@server:~# route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         172.31.1.1      0.0.0.0         UG    100    0        0 eth0
10.8.0.0        0.0.0.0         255.255.255.0   U     0      0        0 tun0
172.31.1.1      0.0.0.0         255.255.255.255 UH    100    0        0 eth0
192.168.0.0     192.168.0.1     255.255.255.0   UG    0      0        0 ens10
192.168.0.1     0.0.0.0         255.255.255.255 UH    0      0        0 ens10

192.168.0.3 路由表...

root@server:~# route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         _gateway        0.0.0.0         UG    100    0        0 eth0
172.17.0.0      0.0.0.0         255.255.0.0     U     0      0        0 docker0
_gateway        0.0.0.0         255.255.255.255 UH    100    0        0 eth0
192.168.0.0     192.168.0.1     255.255.0.0     UG    0      0        0 ens10
192.168.0.1     0.0.0.0         255.255.255.255 UH    0      0        0 ens10

任何帮助都将受到赞赏。

谢谢。

答案1

互联网协议在路由数据包时仅查看目标 IP 地址。它们不关心数据包来自哪里。它们不关心数据包可能是更大的会话、连接或应用程序的一部分。唯一重要的是目标 IP 地址。然后,IP 会查看路由表,以确定如何处理每个数据包,这完全基于目标地址。(从技术上讲,状态防火墙和路由监管等技术可能会使这成为谎言,但就当前目的而言,这样做是可行的。)

正如 @Nikita 指出的,并且 的输出显示route(8),主机192.168.0.3(以及网络上的其他主机)只知道将数据包发送到您的路由器192.168.0.1。它们没有任何信息告诉它们将数据包发送到您的 OpenVPN 系统192.168.0.2.。因此.3和朋友将把他们的所有流量发送到您的路由器。您的路由器不知道您的 VPN。您的路由器要么丢弃数据包,要么将它们发送到公共互联网(下一跳路由器可能会丢弃它)。

有多种可能的解决方案。

解决方案 #1 - 简单但低效

告诉您的路由器10.8.0.0/24可通过 的网关访问192.168.0.2。这将导致发夹路由 - 数据包将从 等主机发送到.3的路由器 LAN 接口.1,然后从同一路由器接口返回到 的 OpenVPN 网关.2。这效率低下,但应该可以工作。

你没有说你的路由器是什么,但如果它是 Linux,命令将是这样的:

ip route add 10.8.0.0/24 via 192.168.0.2

解决方案 #2 - 不打扰但繁琐

您可以在每个 LAN 主机上配置静态路由,告诉它们与 #1 相同的路由信息​​,但无处不在。配置和维护起来会有点麻烦,但却是保持现有网络拓扑的最有效解决方案。与上面的命令相同(适用于 Linux),但您必须在每个 LAN 主机上运行它。您还需要在所有其他可以通过 VPN 工作的设备上执行此操作,包括 Windows 机顶盒、打印机、平板电脑、手机、wifi 灯泡等。您最终会忘记一个,并想知道为什么它不起作用,花时间抓狂,然后当您想起原因时,您会觉得自己像个傻瓜。

解决方案3-复杂但具有破坏性

您可以将 VPN 网关放在通向 Internet 的路由路径上。这里有两种子替代方案。

解决方案 #3A - 路由器上的 VPN

如今,即使是消费级路由器有时也可以运行 OpenVPN 实现,特别是如果您使用第三方固件(OpenWRT、DD-WRT 等)。但是,它们通常缺乏足够的 CPU 马力来获得足够的性能。您也可以用更好的东西替换消费级路由器——商业路由器或其他 Linux。您甚至可以将您的 VPN 网关重新设置为 VPN+路由器+防火墙。

在这种情况下,VPN 和路由器是同一个东西,因此您不必担心路由器与 VPN 网关的配合。从网络设计的角度来看,这可能是最有效的。

解决方案 #3B - 堆叠网关和路由器

您可以将 VPN 网关放在路由器和 LAN 的其余部分之间,并在 VPN 网关的两侧使用不同的 IP 子网。所有其他 LAN 主机都发送到 VPN 网关以访问 Internet。VPN 网关发送并转发到路由器以访问 Internet。

这将需要在 VPN 网关中放置两个网络接口——一个用于 LAN,一个用于切换到路由器。(或者在 VPN 网关上进行发夹路由,这比 #1 更糟糕,因为现在全部互联网流量呈发夹弯状)。

这种方法的主要优点是:您可以保留现有的路由器(也许您的 ISP 让您使用他们的设备,也许它具有其他有用的属性)。如果 VPN 盒发生故障,您可以将其移除,并且(也许)快速重新配置路由器以代替它。

相关内容