我尝试使用以下命令在 NetBSD 下使用 OpenVPN 作为客户端:
openvpn --client --config /etc/openvpn/config.ovpn
我收到以下输出和错误:
localhost# openvpn --client --config /etc/openvpn/openvpn.ovpn
2024-04-26 10:29:35 WARNING: Compression for receiving enabled. Compression has been used in the past to break encryption. Sent packets are not compressed unless "allow-compression yes" is also set.
2024-04-26 10:29:35 DEPRECATED OPTION: --cipher set to 'AES-256-CBC' but missing in --data-ciphers (AES-256-GCM:AES-128-GCM:CHACHA20-POLY1305). OpenVPN ignores --cipher for cipher negotiations.
2024-04-26 10:29:35 OpenVPN 2.6.10 x86_64--netbsd [SSL (OpenSSL)] [LZO] [LZ4] [MH/PKTINFO] [AEAD]
2024-04-26 10:29:35 library versions: OpenSSL 1.1.1k 25 Mar 2021, LZO 2.10
Enter Auth Username:********
Enter Auth Password:********
2024-04-26 10:32:48 TCP/UDP: Preserving recently used remote address: [AF_INET]**.191.33.**:1701
2024-04-26 10:32:48 Socket Buffers: R=[32768->32768] S=[32768->32768]
2024-04-26 10:32:48 Attempting to establish TCP connection with [AF_INET]**.191.33.**:1701
2024-04-26 10:32:48 TCP connection established with [AF_INET]**.191.33.**:1701
2024-04-26 10:32:48 TCPv4_CLIENT link local: (not bound)
2024-04-26 10:32:48 TCPv4_CLIENT link remote: [AF_INET]**.191.33.**:1701
2024-04-26 10:32:48 NOTE: UID/GID downgrade will be delayed because of --client, --pull, or --up-delay
2024-04-26 10:32:48 TLS: Initial packet from [AF_INET]**.191.33.**:1701, sid=0006909e 9b0d208f
2024-04-26 10:32:48 WARNING: this configuration may cache passwords in memory -- use the auth-nocache option to prevent this
2024-04-26 10:32:48 VERIFY OK: depth=1, C=US, ST=New York, L=New York, O=Ubiquiti Inc., OU=UniFi_OpenVPN_CA, CN=UniFi_OpenVPN_CA
2024-04-26 10:32:48 VERIFY KU OK
2024-04-26 10:32:48 Validating certificate extended key usage
2024-04-26 10:32:48 ++ Certificate has EKU (str) TLS Web Server Authentication, expects TLS Web Server Authentication
2024-04-26 10:32:48 VERIFY EKU OK
2024-04-26 10:32:48 VERIFY OK: depth=0, C=US, ST=New York, L=New York, O=Ubiquiti Inc., OU=UniFi_OpenVPN_Server, CN=UniFi_OpenVPN_Server
2024-04-26 10:33:53 Control Channel: TLSv1.3, cipher TLSv1.3 TLS_AES_256_GCM_SHA384, peer certificate: 2048 bits RSA, signature: RSA-SHA256, peer temporary key: 253 bits X25519
2024-04-26 10:33:53 [UniFi_OpenVPN_Server] Peer Connection Initiated with [AF_INET]**.191.33.**:1701
2024-04-26 10:33:53 TLS: move_session: dest=TM_ACTIVE src=TM_INITIAL reinit_src=1
2024-04-26 10:33:53 TLS: tls_multi_process: initial untrusted session promoted to trusted
2024-04-26 10:33:53 PUSH: Received control message: 'PUSH_REPLY,dhcp-option DNS 192.168.7.1,route 192.168.4.0 255.255.255.0,route 192.168.2.0 255.255.255.0,route 192.168.1.0 255.255.255.0,route 192.168.3.0 255.255.255.0,route-gateway 192.168.7.1,topology subnet,ping 10,ping-restart 60,ifconfig 192.168.7.2 255.255.255.0,peer-id 0,cipher AES-256-GCM'
2024-04-26 10:33:53 OPTIONS IMPORT: --ifconfig/up options modified
2024-04-26 10:33:53 OPTIONS IMPORT: route options modified
2024-04-26 10:33:53 OPTIONS IMPORT: route-related options modified
2024-04-26 10:33:53 OPTIONS IMPORT: --ip-win32 and/or --dhcp-option options modified
2024-04-26 10:33:53 TUN/TAP device /dev/tun0 opened
2024-04-26 10:33:53 /sbin/ifconfig tun0 192.168.7.2 192.168.7.1 mtu 1500 netmask 255.255.255.0 up
2024-04-26 10:33:53 /sbin/route add -net 192.168.7.0 192.168.7.1 -netmask 255.255.255.0
add net 192.168.7.0: gateway 192.168.7.1
2024-04-26 10:33:53 /sbin/route add -net **.191.33.** 192.168.1.254 -netmask 255.255.255.255
route: writing to routing socket: File exists
add net **.191.33.**: gateway 192.168.1.254: File exists
2024-04-26 10:33:53 ERROR: OpenBSD/NetBSD route add command failed: external program exited with error status: 1
2024-04-26 10:33:53 /sbin/route add -net 0.0.0.0 192.168.7.1 -netmask 128.0.0.0
add net 0.0.0.0: gateway 192.168.7.1
2024-04-26 10:33:53 /sbin/route add -net 128.0.0.0 192.168.7.1 -netmask 128.0.0.0
add net 128.0.0.0: gateway 192.168.7.1
2024-04-26 10:33:53 /sbin/route add -net 192.168.4.0 192.168.7.1 -netmask 255.255.255.0
add net 192.168.4.0: gateway 192.168.7.1
2024-04-26 10:33:53 /sbin/route add -net 192.168.2.0 192.168.7.1 -netmask 255.255.255.0
add net 192.168.2.0: gateway 192.168.7.1
2024-04-26 10:33:53 /sbin/route add -net 192.168.1.0 192.168.7.1 -netmask 255.255.255.0
route: writing to routing socket: File exists
add net 192.168.1.0: gateway 192.168.7.1: File exists
2024-04-26 10:33:53 ERROR: OpenBSD/NetBSD route add command failed: external program exited with error status: 1
2024-04-26 10:33:53 /sbin/route add -net 192.168.3.0 192.168.7.1 -netmask 255.255.255.0
add net 192.168.3.0: gateway 192.168.7.1
2024-04-26 10:33:53 GID set to nogroup
2024-04-26 10:33:53 UID set to nobody
2024-04-26 10:33:53 Initialization Sequence Completed
2024-04-26 10:33:53 Data Channel: cipher 'AES-256-GCM', peer-id: 0, compression: 'lzo'
2024-04-26 10:33:53 Timers: ping 10, ping-restart 60
当我作为客户端运行 OpenVPN 时,有可用的互联网连接,但我无法访问网络上的任何机器**.191.33.**
,我知道我应该能够通过 SSH 连接到 192.168.1.114,但我无法通过 OpenVPN 访问该机器,Ubuiquity 框中有防火墙规则,允许从 192.168.7.* 到 192.168.1.* 的流量我知道这是有效的,它使用 OpenVPN 客户端从 Mac 和 PC 进行测试,我只是无法让它工作网络BSD
这是我运行 OpenVPN 之前的路由表:
Internet:
Destination Gateway Flags Refs Use Mtu Interface
default 192.168.1.254 UGS - - - iwn0
127/8 127.0.0.1 UGRS - - 33624 lo0
127.0.0.1 lo0 UHl - - 33624 lo0
192.168.1/24 link#2 UC - - - iwn0
192.168.1.68 link#2 UHl - - - lo0
192.168.1.254 00:1e:80:a2:2e:ff UHL - - - iwn0
这是我运行 OpenVPN 时的路由表:
Internet:
Destination Gateway Flags Refs Use Mtu Interface
0/1 192.168.7.1 UGS - - - tun0
default 192.168.1.254 UGS - - - iwn0
**.191.33.**/32 192.168.1.254 UGS - - - iwn0
127/8 127.0.0.1 UGRS - - 33624 lo0
127.0.0.1 lo0 UHl - - 33624 lo0
128/1 192.168.7.1 UGS - - - tun0
192.168.1/24 link#2 UC - - - iwn0
192.168.1.68 link#2 UHl - - - lo0
192.168.2/24 192.168.7.1 UGS - - - tun0
192.168.3/24 192.168.7.1 UGS - - - tun0
192.168.4/24 192.168.7.1 UGS - - - tun0
192.168.7/24 192.168.7.1 UGS - - - tun0
192.168.7.1 192.168.7.2 UH - - - tun0
192.168.7.2 tun0 UHl - - - lo0
192.168.1.254 00:1e:80:a2:2e:ff UHL - - - iwn0
这是我停止 OpenVPN 后的路由表:
Internet:
Destination Gateway Flags Refs Use Mtu Interface
0/1 192.168.7.1 UGS - - - tun0
default 192.168.1.254 UGS - - - iwn0
**.191.33.**/32 192.168.1.254 UGS - - - iwn0
127/8 127.0.0.1 UGRS - - 33624 lo0
127.0.0.1 lo0 UHl - - 33624 lo0
128/1 192.168.7.1 UGS - - - tun0
192.168.1/24 link#2 UC - - - iwn0
192.168.1.68 link#2 UHl - - - lo0
192.168.2/24 192.168.7.1 UGS - - - tun0
192.168.3/24 192.168.7.1 UGS - - - tun0
192.168.4/24 192.168.7.1 UGS - - - tun0
192.168.7/24 192.168.7.1 UGS - - - tun0
192.168.7.2 tun0 UHl - - - lo0
192.168.1.254 00:1e:80:a2:2e:ff UHL - - - iwn0
这是我销毁 tun0 后的路由表:
ifconfig tun0 destroy
Internet:
Destination Gateway Flags Refs Use Mtu Interface
default 192.168.1.254 UGS - - - iwn0
**.191.33.**/32 192.168.1.254 UGS - - - iwn0
127/8 127.0.0.1 UGRS - - 33624 lo0
127.0.0.1 lo0 UHl - - 33624 lo0
192.168.1/24 link#2 UC - - - iwn0
192.168.1.68 link#2 UHl - - - lo0
192.168.1.254 00:1e:80:a2:2e:ff UHL - - - iwn0
当停止 OpenVPN 并破坏隧道 tun0 时,通往的路由**.191.33.**
仍然存在,我不知道这是否是预期的行为。
更新 我现在检查了几台计算机,没有一台计算机有192.168.1/24路由,只有在运行NetBSD的计算机上,我尝试删除它,但没有成功。我还阅读了很多手册页和各种其他文档,但我还没有想出任何有用的东西。
OpenVPN 配置
client
dev tun
proto tcp
remote **.191.33.** 1701
resolv-retry infinite
nobind
# Downgrade privileges after initialization (non-Windows only)
user nobody
group nogroup
persist-key
persist-tun
auth-user-pass
remote-cert-tls server
cipher AES-256-CBC
comp-lzo
verb 3
auth SHA1
key-direction 1
reneg-sec 0
redirect-gateway def1
<ca>
-----BEGIN CERTIFICATE-----
...
-----END CERTIFICATE-----
</ca>
<tls-auth>
-----BEGIN OpenVPN Static key V1-----
...
-----END OpenVPN Static key V1-----
</tls-auth>
<cert>
-----BEGIN CERTIFICATE-----
...
-----END CERTIFICATE-----
</cert>
<key>
-----BEGIN PRIVATE KEY-----
...
-----END PRIVATE KEY-----
</key>
意图
我正在尝试从家里连接到远程位置的 VPN。远程网络受到面向互联网的防火墙的保护,路由器后面网络上的所有计算机都可以访问,192.168.7.* 网络是标准 Ubuiquity 并用于 VPN 客户端,我添加了一条防火墙规则以允许来自 192.168 的流量.7.* 到 192.168.1.* 网络,这在我尝试过的所有计算机(Mac、PC、Windows、Linux、MacOS)上都运行良好。等,但运行 NetBSD 的 PC 除外。
运行NetBSD的PC上的网络配置是在安装过程中进行的,并且我使用了自动配置功能,因此我根本没有指定任何网络、路由或规则。使用 OpenVPN 客户端时我能够访问互联网,但我无法访问远程网络上的任何计算机。所以我想我缺少的部分是从 192.168.7.* 到 192.168.1.* 的路由,这样我将能够访问连接到该网络的计算机
虽然我对 NetBSD 不熟悉,但根据您粘贴的路由表以及 NetBSD
route
在线命令的手册页,该操作系统似乎不支持称为路由度量的东西,它基本上是指示路由的数字优先。在现代 Linux 中,可能还有 Windows 和 macOS 中,您可以拥有具有相同目的地的路由(请注意,目的地是指路由覆盖的 IP 范围/块,而不是“下一跳”或任何等效项)在同一个路由表中。 (我们将此类路由称为“重复路由”,即使它们并不是真正的“重复”。)具有最低度量值(最高优先级)的路由将用于具有路由覆盖的目的地的流量。
(事实上,至少在Linux、IIRC中,不禁止存在具有相同度量值的“重复路由”,包括但不限于最低值
0
,这可以使该值至少隐藏在一些相关命令的输出中我不知道这会导致什么确切的行为/政策。)因此,从您粘贴的输出/日志中我们可以看出,NetBSD 不允许重复的路由和/或路由度量。因此,不会添加远程站点/主机所需的路由,即
192.168.1.0/24
(192.168.1/24
只是另一种表示形式),它恰好是 NetBSD 主机所在的本地 LAN 中使用的 IP 子网,这这就是为什么你无法访问192.168.1.114
(远程一侧)的原因。作为解决方法,您可以添加非“重复”的覆盖路由。例如,如果是您需要访问的
192.168.1.114
唯一主机:192.168.1.0/24
或者,如果您想访问
192.168.1.0/24
远程端尽可能多的主机:(基本上将
192.168.1.0/24
路由分成两半,以便您可以拥有更高优先级的“有效复制”。如果您想了解这种覆盖的基本原理,您需要深入了解 L3 网络概念,例如 VLSM、前缀长度和等等,和/或一般如何做出路由决策)。如果您希望 OpenVPN 自动执行这些命令,您可以在客户端 conf/ovpn 文件中包含等效
route
选项。 (我懒得在这里给出确切的语法,但你几乎只需要在那里填充相同的“数字”集。有关详细信息,请参阅 OpenVPN 手册。)通过这种方法/解决方法,您不需要尝试摆脱“原始”
192.168.1.0/24
路线,因为它实际上会被“休眠”。(一般来说,在采取该方法之前,您需要确保已添加专门针对 LAN 网关的路由。在 DHCP 的情况下,通常,就像您的情况一样,显然,但不一定 AFAIK,此类路由是由DHCP 服务器和/或由 DHCP 客户端配置,因为它是典型网络设置中前缀路由的冗余。)
请注意,无论您如何执行此操作,由于目的地 (
192.168.1.0/24
) 仍然是您的 LAN 和远程站点之间的“冲突”,因此,如果您选择路由/获取对远程站点的访问权限,或者只是其中之一像这样的主机192.168.1.114
,您无法访问本地具有相同 IP 的主机,除非您删除添加的路由(通过删除它们或销毁 tun 接口)。然而,或多或少不可能访问分配有您的 LAN 网关的 IP(即
192.168.1.254
您的情况)或该客户端主机本身的 IP(即192.168.1.68
,如果我们更改为另一台)的远程主机。这里讨论 DHCP)。您看到的线条
ERROR: OpenBSD/NetBSD route add command failed
在某种程度上可以被认为是无害的。正如我在命令中提到的,因为/如果这些错误不会阻止 OpenVPN 成功建立连接/设置,您所需要做的就是“补偿”失败/错过的内容,即在您的情况下添加备用/覆盖路由192.168.1.0/24
手动。 (尽管我无法确定“非无错误”连接是否是 OpenVPN 在连接被断开时不恢复其操作的原因。)(这个
**.191.33.**
也是无害的,因为它只是在路由表中找到 VPN 的“远程地址”的“真实”重复路由的结果,因为您的 OpenVPN 程序以某种方式不会恢复它在路由时所做的事情。如果您是在重新启动后第一次连接,我很确定您不会看到它,并且显然,如果您想知道为什么这样的路线,则无需“补偿”。添加后,请查看redirect-gateway
OpenVPN 手册中的选项。这基本上是出于与我上面提到的 LAN 网关路由类似的原因。)如果您想要完成的任务是防止服务器推送的某些路由阻止您访问本地端的主机,或者更准确地说,通过现有/物理接口访问主机,那么您只“需要”拉式过滤器。 (当然,这意味着您不介意“失去”对冲突子网中远程端主机的访问权限。)但就您而言,NetBSD 或多或少已经“为您做到了”,无论您是否愿意。
我确实认为您想找出为什么在您的情况下 OpenVPN 在被停止时不会恢复其“操作”(包括但不限于添加 tun 接口,即删除它以进行恢复),例如您是否/NetBSD 正在停止它以错误的方式(例如SIGKILL?)。但我本人不知道在这方面做出贡献。
现在这是基于OP的新信息重写的,作为对此答案的评论,问题的更新,@TomYan指出的信息,以及我自己对OpenVPN源代码的调查。
作为前言,我要声明,自从我上次使用 OpenVPN 以来已经很多年了。然而,从根本上来说,OpenVPN 客户端所做的就是验证连接,然后配置本地隧道和路由以通过该隧道传递流量,然后通过来自/到远程 OpenVPN 服务器的加密连接将数据包传递到/来自该隧道的用户区端点。
我还假设您在 NetBSD 安装期间使用的“自动配置”功能与我将其与“使用 DHCP 配置网络接口”相关联的功能相同,并且您已将其配置为使用相同的 WiFi 路由器和您的其他本地计算机正在使用的 DHCP 服务器。
您在下面的评论中指出:
根据您显示的日志,这与远程 OpenVPN 服务器推送的网络路由冲突。
您不能在不同位置拥有两个前缀相同的 IPv4 子网,然后期望能够在它们之间进行通信。
因此,首先您必须重新配置本地路由器以使用不同的子网。这可以是任何私有 RFC 1918 网络,除了由远程 OpenVPN 服务器推送的网络之外。我会避免任何带有 192.168 前缀的内容,因为这似乎是远程 OpenVPN 服务器的最爱。
请注意,您不必将 WiFi 路由器置于桥接模式。只需更改其 LAN 地址及其提供的子网即可。
请记住在更改子网后重新启动所有本地计算机,并测试它们是否继续工作(无论是否有 VPN)。
如果您无法更改本地 WiFi 网络的子网(如果您想使用该 OpenVPN 服务器),则必须将另一台路由器(带 NAT)和 WiFi 网关放在现有路由器前面并进行设置,以便它 NAT 到您选择的新的唯一子网。但这样的配置并不理想,而且不可靠!
其次,您的本地 OpenVPN 客户端配置具有以下行:
OpenVPN 客户端当前尝试实现这一点的方式,如下面的日志条目所示(并通过我对代码的阅读确认),可能与 NetBSD 或具有 BSD 网络代码的任何其他系统不兼容:
这些路由条目(可能)不会对任何 BSD 系统产生预期的效果(如果它们这样做是偶然的,而不是设计的)。 OpenVPN 客户端尚未正确移植到 BSD。
因此,我也强烈建议
redirect-gateway def1
从 OpenVPN 客户端配置中删除该行,并将其替换为:另外,作为旁注,我想说的是,在我看来,通过 VPN 重定向所有流量很少是最好的设置方法。
最后你说你的其他计算机都没有到 192.168.1/24 的路由。从表面上看,这听起来是不可能的,而且相当令人困惑。这些其他计算机可能与 NetBSD 计算机不在同一个 LAN 上,或者它们在该 LAN 上未使用相同的 DHCP 服务器,和/或它们没有连接到同一个 OpenVPN 服务器。不管怎样,他们都应该有 192.168.1/24 路由,至少当他们的 OpenVPN 客户端正在运行和连接时。
您确定所有本地计算机确实通过同一 WiFi 路由器和 DHCP 服务器连接到同一 LAN?在其中之一上禁用 OpenVPN 并重新启动它而不启动 OpenVPN 客户端,然后再次检查其网络接口的配置方式。