
上图显示了我在OpenVPN连接过程中发生的事情。 主机A和B通过1.2.3.4:1194的VPN服务器连接到VPN。 我的问题是:如果主机A希望向主机B发送一个数据包(如ICMP回显数据包),那么数据包如何遍历到达B? 我最初的想法是:
该进程创build目的地为10.20.0.6,源为192.168.0.x的数据包(源IP为192.168.0.x,考虑到应用程序不知道VPN连接)。 从推送到应用程序计算机的路由表中,数据包被发送到虚拟接口。
主机A的虚拟接口将数据包封装为主机B面向广域网的地址(3.4.5.6)。
这到目前为止是正确的吗? B的路由器如何知道这个数据包是发往主机B? 主机A是否把1.2.3.4作为目的地(而不是3.4.5.6),让VPN服务器通过服务器与Bbuild立的连接重新路由? B的路由器是否必须进行预先设置才能允许任何types的VPN连接?
让我们假设你已经安装了所有东西,然后发布
$ 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客户端程序创build的软件定义networking接口。
所以主机A发送一个目的地址为10.20.0.6的ICMP回应请求给tun0 。 接下来会发生的是封装 。 OpenVPN客户端将原始数据包封装在OpenVPN信封中,并将此信封发送到1.2.3.4:1194。
在1.2.3.4的OpenVPN服务器打开信封,并检查地址:“哦,这是为10.20.0.6”。 如果OpenVPN服务器已经被configuration为允许客户端彼此通信,则它将通过与地址3.4.5.6处的Bbuild立的连接发送信封。
B上的OpenVPN客户端打开收到的封装(解封装 ),现在从10.20.0.5(在VPNnetworking中的主机A)收到10.20.0.6的ICMP回显请求。
要工作,OpenVPN只需要TCP或UDP连接到服务器端口1194。 如果防火墙或configuration错误的NAT阻止了这个,它将不起作用。