我正在尝试设置 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 盒发生故障,您可以将其移除,并且(也许)快速重新配置路由器以代替它。