携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第6天,点击查看活动详情
随着互联网技术的发展,越来越多的需求是:通过互联网的接入来访问企业内网的信息资源,但这也面临着安全的挑战,比如:信息窃取,信息篡改,非法访问,网络攻击等安全问题。
1、创建的VPN接入技术主流的有以下几种:
| 类型 | 协议 | 备注 |
|---|---|---|
| L2TP/PPTP VPN | 二层 | 这种方式在Win操作系统里面就集成了L2TP/PPTP的客户端所以说不需要再额外的安装软件了,就在控制面板里面找到网络创建新的网络连接,就可以进行部署和使用了。但是这种VPN方式没有高强度的加密认证手段,所以说安全性比较低。 |
| IPSEC VPN | 三层 | |
| SSL VPN | 应用层 | 这种方式对数据的完整性和私密性都有很完善的保护机制。由于现在主流的浏览器都已经支持完整得SSL协议,所以从原理上来说,如果在SLL VPN上来跑B/S应用就不需要安装客户端软件了。但是想要支持C/S应用通常还需要安装额外的客户端的软件或者插件。这里学的Open VPN就是SLL VPN。 |
以上几种VPN技术各自有各自的优缺点。因此在实际情况中需要把这几种VPN技术综合使用。
Open VPN概述
1、官方网址:openvpn.net/
2、Open VPN可以满足的最基本两大场景:
- Client to Site:公司成员在外地可以通过互联网安全访问公司内部资源。
- Site to Site:可以把一个企业或组织位于不同物理位置的局域网安全的连接在一起。
Open VPN架构
1、工作机制:
Open VPN采用名为TUN/TAP虚拟网络驱动程序的技术,这种技术是通过软件来模拟出虚拟网络设备,它有两种类型:这两种网络设备是在安装了Open VPN后也随便安装的
- TAP:模拟的是以太网设备,它在OSI模型中的第二层,实现以太网的帧。
- TUN:三层的IP隧道,在OSI模型中的三层,实现IP数据包
以上新添加的TAP/TUN设备对于应用程序和操作系统的网络堆栈是完全透明的。
在Open VPN实现中,TAP创建网桥,TUN和路由在一起使用TUN/TAP处理数据过程如下:
2、下面是数据的发送过程:
- 1:应用程序在用户空间,它发送的数据向下传通过TCP/IP堆栈一层一层的打包最后把数据封装在IP包里面最后根据路由把数据包发送给TUN/TAP网卡(驱动程序)。
- 2:TUN/TAP的驱动程序把这些数据又传递给Open VPN。
- 3:到达Open VPN的数据会被再次分段封装,进行加密处理,在向下传再次通过内核的TCP/IP协议栈在封装成新的数据包,最终交给物理网卡发送出去。
从上图也可以看出来Open VPN是在用户空间的,因此运行它不需要特权角色。Open VPN是和内核里面的TUN/TAP驱动程序(网卡)直接通信的。
那应用程序的数据是否发给TUN/TAP驱动设备,这取决于Route table。所以在后续配置Open VPN一定要明确网络拓扑结构。
3、数据的接收过程:
- 1:用户从物理网卡接收到数据,经过内核的TCP/IP数据栈发给用户空间Open VPN进程,Open VPN首先就是解密。
- 2:解密后的数据由Open VPN发送给TUN/TAP驱动设备。
- 3:TUN/TAP驱动设备收到数据包还是根据TCP/IP协议栈由内核空间向用户空间传送,根据TCP/UDP的端口号从而到达相应的应用程序。
4、Open VPN的加密:
- 使用OpenSSL库来提供数据和控制通道的加密。
- 使用HMAC(Hashed Message Authentication Code)添加额外的安全层
- 支持硬件加速
查看Open VPN支持的加密算法:
openvpn --show-ciphers
openvpn --show-tls
5、Open VPN的身份验证:
- 预共享密钥
- 证书
- 用户名/密码(2.0版本以后,需要第三方模块实现)
6、网络:
- 使用TUN/TAP驱动接口
- 可以使用UDP/TCP协议
- IANA分配给Open VPN的端口号是1194(配置文件可以修改)
- 支持IPV6
- 支持将一些网络配置选项"推送"到客户端
- 支持数据流压缩(为了减少带宽消耗,Open VPN可以使用LZO压缩库来压缩数据流)
- 支持有代理服务器、NAT和防火墙的等多种场景
通过上述的工作机制中我们可以看出Open VPN的技术关键点是:参与VPN通讯的计算机上创建和使用虚拟网络接口(TUN/TAP)
7、安全:
-
可以使用非特权用户身份来运行Open VPN
-
利用Linux安全功能:
- chroot
- SELinux
- mlocalall
8、可扩展性:
-
使用脚本或第三方插件来进行功能的扩展
-
应用场景:
- 与其他日志系统集成
- 动态更新防火墙策略
- 与其他身份验证方式集成
实验环境准备
Linux下Open VPN安装
1、服务端和客户端自己的需求
2、安装Open VPN
#查看yum仓库包是否有vpn
yum list | grep -i vpn
#安装epel扩展源
yum install -y epel-release
#安装openvpn,easy-rsa,说一下easy-rsa,rsa是一种非对称加密算法,easy-rsa是Open VPN团队写的Shell脚本,这个脚本调用OpenSSL命令来进行rsa密钥的管理,比如:创建CA证书,创建客户端证书,管理证书吊销列表等,比使用OpenSSL命令要方便一些。有了这个脚本我们就不用人工构建CA系统了很便捷。
yum install -y openvpn easy-rsa
Windows下Open VPN安装
1、服务端和客户端自己的需求
2、官方网址:openvpn.net/
Open VPN版本比较
Open VPN分为社区版和专业版:
常见VPN部署场景
点对点VPN
1、点对点VPN:在给定的时刻,只有一个客户端可以连接VPN服务器。
优点:
- 不需要证书、公钥基础设施(PKI)
- 配置简单容易
缺点:
- 无前向保密(forward secrecy)
- 以明文形式存储密钥
2、实验环境:
| Node IP | TUN IP | 扮演角色 |
|---|---|---|
| 192.168.9.130 | 10.200.0.1 | VPN |
| 192.168.9.132 | 10.200.0.2 | Client1 |
(1)VPN端配置:
#10.200.0.1本端隧道IP,10.200.0.2对端隧道IP,--dev表示使用那个虚拟接口设备
[root@vpn ~]# openvpn --ifconfig 10.200.0.1 10.200.0.2 --dev tun
#查看VPN端口
[root@vpn ~]# ss -ntpul
...
udp UNCONN 0 0 *:1194 *:* users:(("openvpn",pid=20000,fd=4))
...
#查看ip信息
[root@vpn ~]# ip a
...
3: tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN group default qlen 100
link/none
inet 10.200.0.1 peer 10.200.0.2/32 scope global tun0
valid_lft forever preferred_lft forever
inet6 fe80::51f2:2a5:4fc7:e0d/64 scope link flags 800
valid_lft forever preferred_lft forever
...
(2)Client1端配置:
[root@client1 ~]# openvpn --ifconfig 10.200.0.2 10.200.0.1 --dev tun --remote 192.168.9.130
3、选项参数说明:
- dev tun x | tap x | null:功能:用于设置YUN/TAP虚拟网络设备,如果省略了x,表示使用动态设备编号,两端虚拟网络设备类型要一致,不能混用。
- ifconfig 参数1 参数2:参数1(local)本地VPN端点的IP地址。参数2如果是点对点模式下的TUN设备,表示远程VPN端点的IP地址。如果是TAP设备或者是--topology subnet的TUN设备,表示虚拟网段的子网掩码。
- remote host [port] [proto]:指定远程主机名称或者是IP地址,port:远程主机使用的端口号,默认为1194,proto:远程主机使用的协议,默认为UDP。
4、之间过程:
各节点之间通过1194端口进行握手连接,然后在控制通道里面进行参数协商,之后在数据通道进行通信。
5、Windows客户端拨入:
d:\openvpn\bin>openvpn --ifconfig 10.200.0.2 10.200.0.1 --dev tun --remote 192.168.9.130
#我们重点是看Win的输出信息:
Sun Jun 05 17:11:58 2022 disabling NCP mode (--ncp-disable) because not in P2MP client or server mode
Sun Jun 05 17:11:58 2022 OpenVPN 2.4.0 x86_64-w64-mingw32 [SSL (OpenSSL)] [LZO] [LZ4] [PKCS11] [AEAD] built on Dec 27 2016
Sun Jun 05 17:11:58 2022 Windows version 6.2 (Windows 8 or greater) 64bit
Sun Jun 05 17:11:58 2022 library versions: OpenSSL 1.0.2i 22 Sep 2016, LZO 2.09
Sun Jun 05 17:11:58 2022 ******* WARNING *******: all encryption and authentication features disabled -- all data will be tunnelled as cleartext
#显示open tun,因为我们服务端是Linux操作系统,并且使用的虚拟接口设备就是TUN,本照着两端虚拟接口设备要一致,因此这个open TUN是合情合理的。但是往下看:
Sun Jun 05 17:11:58 2022 open_tun
#这里竟然显示打开TAP-WIN32设备,为什么相面显示open TUN设备,这里却显示代打开TAP设备呢?这时因为我们在安装Open VPN时,会让我们安装一个虚拟网络接口设备:"TAP-Windows Adapter V9",其实这个TAP设备里面集成了TUN设备,因此这里显示的时TAP设备。
Sun Jun 05 17:11:58 2022 TAP-WIN32 device [以太网] opened: \.\Global{24338D96-A0F5-4E66-80A6-9004578C599A}.tap
Sun Jun 05 17:11:58 2022 Notified TAP-Windows driver to set a DHCP IP/netmask of 10.200.0.2/255.255.255.252 on interface {24338D96-A0F5-4E66-80A6-9004578C599A} [DHCP-serv: 10.200.0.1, lease-time: 31536000]
Sun Jun 05 17:11:58 2022 do_ifconfig, tt->did_ifconfig_ipv6_setup=0
Sun Jun 05 17:11:58 2022 TCP/UDP: Preserving recently used remote address: [AF_INET]192.168.9.130:1194
Sun Jun 05 17:11:58 2022 UDP link local (bound): [AF_INET][undef]:1194
Sun Jun 05 17:11:58 2022 UDP link remote: [AF_INET]192.168.9.130:1194
Sun Jun 05 17:12:08 2022 Peer Connection Initiated with [AF_INET]192.168.9.130:1194
Sun Jun 05 17:19:22 2022 Initialization Sequence Completed #只有出现了这个信息才算客户端连接服务端成功,如果没有出现对点击此"回车"。