VPN 网络建立
概述
什么是 VPN
VPN 是虚拟专用网络(Virtual Private Network)的缩写。它是在两个或多个物理网络(或设备)之间通过互联网/公共网络创建的虚拟网络,以创建扩展的专用网络,以帮助用户/设备发送和接收数据,就好像用户是直接连接的一个私人网络。这意味着 VPN 中的应用程序可以获得相同的功能,并且可以像在专用网络中一样进行管理。
为什么使用 VPN
互联网上的每个设备都有一个公共 IP 地址,用于使用浏览器,命令行或任何其他方法识别和连接该设备。为此,数据通过互联网发送,并包含 IP 地址等信息,如果您通过不安全的网络进行拦截,则可以截获这些信息。为了保护通过互联网传输的身份,隐私和数据,VPN用于在两个设备/网络之间建立专用连接。
VPN可以在各种场景中使用,其中最常见的是从办公室远程工作的人想要通过互联网使用安全的网络连接从办公室访问设施,网络,文件等,就像他们在办公室工作一样。这也可以称为点对点 VPN 连接。另一种常见情况是公司在不同的地理位置有许多办事处,并希望通过互联网建立私人连接以连接这些办公室/网络。这也称为站点到站点连接。由于连接是通过公共网络进行的,为了保护数据安全并防止窃听,授权访问以保护数据丢失,在 VPN 提供的两个网络/设备之间建立安全和加密的专用连接变得很重要。
VPN还可用于隐藏用户的公共 IP 地址和地理位置,因为用户通过互联网的所有请求都是从用户已创建 VPN 连接(隧道)的服务器发送的。
KidVPN 简介
KidVPN 是 SylixOS 系统下的开源VPN。使用 KidVPN 可以方便地在各种网络访问场所之间搭建专用网络通道。
KidVPN 使用两重验证来保证设备安全:
- AESKEY 验证。
- 密钥验证。
VND 虚拟网卡
KidVPN 使用时,通信双方需要先创建一个虚拟网卡设备,用来进行隧道报文的收发。接着双方需要建立连接,协商好通信的参数,最后上层应用借助 KidVPN 进行正常的网络通信。
SylixOS 系统支持通过 vnd
命令来快速创建一个新的 VND 虚拟网卡。
[root@sylixos:/root]# help vnd
add or delete a virtual net device (ethernet).
eg. vnd add 10 10:ae:13:b2:5c:f8
vnd add 11
vnd del 10
vnd [add | del] [id] [hwaddr] [nochksum]
[root@sylixos:/root]#
VND 网卡原理
VND 是 SylixOS 操作系统实现的虚拟网络设备,不同于物理网卡靠硬件网路板卡实现,VND 提供了一台主机内用户空间的数据传输机制。它虚拟了一套网络接口,这套接口和物理的接口无任何区别,可以配置 IP,可以路由流量,不同的是,它的流量只在主机内流通。
作为网络设备,VND 也需要配套相应的驱动程序才能工作。VND 驱动程序包括两个部分,一个是字符设备驱动,一个是网卡驱动。这两部分驱动程序分工不太一样,字符驱动负责数据包在内核空间和用户空间的传送,网卡驱动负责数据包在 TCP/IP 网络协议栈上的传输和处理。
VND 位于网络 OSI 模型的二层(数据链路层),操作二层的以太网帧。
创建 VND 网卡
创建一个新的 VND 虚拟网卡,并设置虚拟网卡的MAC 地址为 10:ae:13:b2:5c:f8。
[root@sylixos:/root]# vnd add 3 10:ae:13:b2:5c:f8 [ifparam]No network parameter for [vnd-3] from /etc/ifparam.ini, default parameters will be used. virtual net device vn3 added.
配置虚拟网卡地址为 10.7.0.105,子网掩码是 255.255.0.0。
[root@sylixos:/root]# ifconfig vn3 inet 10.7.0.105 [root@sylixos:/root]# ifconfig vn3 netmask 255.255.0.0 [root@sylixos:/root]# ifconfig vn3 gateway 10.7.0.1 [root@sylixos:/root]# ifconfig vn3 vn3 Link encap: Ethernet HWaddr: 10:ae:13:b2:5c:f8 Dev: vnd-3 Ifidx: 4 DHCP: D4 D6 Spd: N/A inet addr: 10.7.0.105 netmask: 255.255.0.0 gateway: 10.7.0.1 broadcast: 10.7.255.255 inet6 addr: fe80::12ae:13ff:feb2:5cf8 Scope:Link<T0> UP BROADCAST MULTICAST MTU:1500 Metric:1 collisions:0 txqueue:0 tcpaf:1 tcpwnd:65535 RX ucast packets:0 nucast packets:0 dropped:0 TX ucast packets:0 nucast packets:0 dropped:0 RX bytes:0 (0.0 B) TX bytes:0 (0.0 B) [root@sylixos:/root]#
删除 VND 网卡
删除上文创建的 VND 虚拟网卡。
[root@sylixos:/root]# vnd del 3 virtual net device vn3 delete.
实际场景
准备两台 SylixOS 设备,设备 1 作为VPN服务器,设备 2 作为 VPN 客户端。
打开设备 1 的Shell界面,在 设备 1 创建 VND 虚拟网卡,MAC 地址设置为 10:ae:13:b2:5c:f8。
[root@sylixos:/root]# vnd add 1 10:ae:13:b2:5c:f8 [ifparam]No network parameter for [vnd-1] from /etc/ifparam.ini, default parameters will be used. virtual net device vn3 added.
打开设备 2 的Shell界面,在设备 2 创建 VND 虚拟网卡,MAC 地址设置为 10:ae:13:b2:58:fc。
[root@sylixos:/root]# vnd add 1 10:ae:13:b2:58:fc [ifparam]No network parameter for [vnd-1] from /etc/ifparam.ini, default parameters will be used. virtual net device vn3 added.
使用
ifconfig
命令将设备 1 和设备 2 的网络地址按照上文网络拓扑图所写配置。在设备 1(服务器端)中通过 kidvpn 可执行程序生成一个AESkey 值(部署 BASE 的时候,kidvpn 可执行程序会直接部署到系统的
/sbin
目录下)。[root@sylixos:/root]# kidvpn -genkey 256 2c82bb784aab72392e51475e4c0a2f0e24443d3532064929588733891f60079c
将设备 1 生成的 key 值放入设备 1 和设备 2 的
/etc/kidvpn_key.key
文件(用户主动创建该文件)内,两个设备的 key 值要保持一致。在设备 1 的
/etc
目录下创建并配置 kidvpn_server.ini 和 serv.iv 文件。~ [root@sylixos:/root]# cat /etc/kidvpn_server.ini [server_0] mode=server # Run as server mode key_file=/etc/kidvpn_key.key # AES key file iv_file=/etc/serv.iv vnd_id=1 # Virtual network device ID (For SylixOS) mtu=1464 # 1280 ~ 1472 (Optional default: 1464) local_ip=10.4.120.211 # Local IP address in this system port=10088 # Local port (Optional default: 10088) [root@sylixos:/root]#
[root@sylixos:/root]# cat /etc/serv.iv hello [root@sylixos:/root]#
在设备 2 的
/etc
目录下创建并配置 kidvpn_client.ini 和 cli.iv 文件。[root@sylixos:/root]# cat /etc/kidvpn_client.ini [client_0] mode=client # Run as server mode iv_file=/etc/cli.iv key_file=/etc/kidvpn_key.key # AES key file vnd_id=1 # Virtual network device ID (For SylixOS) mtu=1464 # 1280 ~ 1472 (Optional default: 1464) server=10.4.120.211 # Local IP address in this system port=10088 # Local port (Optional default: 10088) [root@sylixos:/root]#
[root@sylixos:/root]# cat /etc/cli.iv hello [root@sylixos:/root]#
在设备 1 (服务器端) 执行
kidvpn /etc/kidvpn_server.ini server_0 123
用来启动VPN服务器。[root@sylixos:/root]# kidvpn /etc/kidvpn_server.ini server_0 123 [root@sylixos:/root]# [KidVPN] We use virtual net device: vn3 for VPN connect. [KidVPN] Server working.
在设备 2 (客户端)执行
kidvpn /etc/kidvpn_client.ini client_0 123
连接到VPN服务器。[root@sylixos:/root]# kidvpn /etc/kidvpn_client.ini client_0 123 [root@sylixos:/root]# [KidVPN] We use virtual net device: vn3 for VPN connect. [KidVPN] Try connect server <1 times>...! [KidVPN] Client working. [KidVPN] Server connected 10.4.120.211 [10:ae:13:b2:5c:f8]
经过上面步骤,VPN网络建立成功,两个 VND 虚拟网卡之间可以互相通信。
[root@sylixos:/root]# ping 192.168.7.105 Pinging 192.168.7.105 Reply from 192.168.7.105: bytes=32 time=1.191ms TTL=255 Reply from 192.168.7.105: bytes=32 time=0.621ms TTL=255 Reply from 192.168.7.105: bytes=32 time=0.615ms TTL=255 Reply from 192.168.7.105: bytes=32 time=0.636ms TTL=255 Ping statistics for 192.168.7.105: Packets: Send = 4, Received = 4, Lost = 0(0% loss), Approximate round trip times in milli-seconds: Minimum = 0.615ms, Maximum = 1.191ms, Average = 0.765ms [root@sylixos:/root]#