上图显示了我认为在 OpenVPN 连接期间发生的情况。主机 A 和 B 通过 1.2.3.4:1194 的 VPN 服务器连接到 VPN。我的问题是:如果主机 A 希望向主机 B 发送数据包(例如 ICMP 回显数据包),数据包如何遍历才能到达 B?我最初的想法是:
该过程创建数据包,其目的地为 10.20.0.6,源为 192.168.0.x(考虑到应用程序不知道 VPN 连接,源 IP 为 192.168.0.x)。根据推送到应用程序计算机的路由表,数据包被发送到虚拟接口。
主机 A 的虚拟接口封装了发往主机 B 的 WAN 端地址 (3.4.5.6) 的数据包。
到目前为止,这是否正确?B 处的路由器如何知道此数据包的目的地是主机 B?主机 A 是否将 1.2.3.4 作为目的地(而不是 3.4.5.6),并让 VPN 服务器通过服务器与 B 之间已建立的连接重新路由?B 处的路由器是否必须预先设置才能允许任何类型的 VPN 连接?
答案1
假设你已经设置好了一切,并且你发出
$ ping 10.20.0.6
在主机 A 上。
主机 A 检查其内部路由表,了解如何到达 10.20.0.6,在 Linux 上,它大致如下所示
$ route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
10.20.0.0 10.20.0.1 255.255.255.0 UG 0 0 0 tun0
因此主机 A 确定“为了联系 10.20.0.6,我需要通过网关 10.20.0.1 发送消息,我可以使用tun0界面”
10.20.0.1 是 OpenVPN 服务器的 VPN 地址,tun0是主机 A 上的 OpenVPN 客户端程序创建的软件定义网络接口。
因此,主机 A 向tun0.接下来发生的事情是封装。OpenVPN 客户端将原始数据包包装在 OpenVPN 信封中,并将此信封发送到 1.2.3.4:1194。
位于 1.2.3.4 的 OpenVPN 服务器打开信封并检查地址:“哦,这是 10.20.0.6。” 如果 OpenVPN 服务器已配置为允许客户端相互通信,它将通过与地址 3.4.5.6 的 B 建立的连接发送信封。
B 处的 OpenVPN 客户端打开收到的信封(解封装),现在有一个从地址 10.20.0.5(即 VPN 网络中的主机 A)接收到的针对 10.20.0.6 的 ICMP 回显请求。
OpenVPN 仅需要与服务器的 1194 端口建立 TCP 或 UDP 连接即可工作。如果防火墙或配置错误的 NAT 阻止了此操作,则无法工作。