OpenVPN笔记-02
Overview
1. 前言
最近有时间又研究了下OpenVPN,发现这个老牌VPN还是有许多闪光点,例如:
- 在用户空间运行,几乎适配所有操作系统
- 使用OpenSSL加密库的SSL/TLS,能受益于这些标准组件的升级和优化
- 支持TCP/UDP的方式创建隧道承载上层流量,UDP丢包率高的环境下可以切换TCP,并绕过一些防火墙限制,例如只允许443端口的进出站的环境
- 支持配置SOCKS代理,能嵌套其他代理工具组合使用
除了配置复杂外(配置是在占了太多),剩下的都是优点,上一篇中讨论了TAP模式的配置,但除了Linux外,其他系统对TAP都不太友好,这里就对比下TAP与TUN,并记录下TUN模式部署方法
2. TAP vs TUN
OpenVPN的维基中已经详细论述了TAP与TUN的区别:BridgingAndRouting
什么情况下需要TAP:
- 需要桥接
- 需要在OpenVPN 2.2或更早版本传输非IP流量或IPv6流量
- 需要LAN和VPN客户端位于同一个广播域中
- 需要LAN的DHCP服务器为VPN客户端提供DHCP地址
- 需要访问Windows服务器,并且需要网络邻居发现才能通过VPN工作
TAP看上去似乎比TUN更简洁,但是也带来很多隐藏的问题,下面是两者的优缺点比较:
TAP的优点:
- 表现得像一个真实的网络适配器
- 可以传输任何网络协议(IPv4、IPv6、Nettalk、IPX 等)
- 工作在第2层,以太网帧可通过VPN隧道传递
- 可用于桥接
TAP的缺点:
- 在VPN隧道上有更多的广播开销
- 在VPN隧道传输的所有数据包都会添加以太网数据帧头部造成额外开销
- 不能用于Android或iOS设备
- 扩展性差
TUN的优点:
- 较低的流量开销,仅传输发往VPN客户端的流量
- 仅传输第3层的IP数据包
TUN 缺点:
- 无法传输广播流量
- 只能传输 IPv4(OpenVPN 2.3 增加了 IPv6)
- 不能用于桥接
综上所述:
- 只需要使用VPN的代理功能或客户端设备受限于安卓/iOS/macOS等时,可以选择TUN模式
- 需要更复杂的网络配置时,使用TAP模式,例如UDP广播、公网IP绑定、虚拟机接入VPN等等
3. 安装与配置OpenVPN服务端
安装内容不再赘述,安装后创建配置文件 /etc/openvpn/server/tun0.conf,内容如下:
1# 监听443端口
2port 443
3# 使用TCP作为传输方式,客户端会在一个TCP连接上承载所有流量
4proto tcp
5# 使用TAP模式
6dev tun
7# 设置MTU为1500
8tun-mtu 1500
9# 设置拓扑结构为子网
10topology subnet
11# 设置VPN网段,转换为CIDR格式对应10.100.0.0/24
12server 10.100.0.0 255.255.255.0
13# 客户端配置文件,若需要为客户端分配固定IP可以在此设置,按用户名(或CN)存放文件
14# client-config-dir /etc/openvpn/ccd
15# 自签名的根证书
16ca /etc/openvpn/server/ca.crt
17# 自签名的服务端证书
18cert /etc/openvpn/server/server.crt
19# 自签名的服务端密钥
20key /etc/openvpn/server/server.key
21# dh交换参数
22dh /etc/openvpn/server/dh2048.pem
23tls-server
24tls-version-min 1.2
25# 认证方式设置
26verify-client-cert none
27# 使用用户名作为CN
28username-as-common-name
29# 设置脚本安全等级,等级2允许通过文件传递认证信息
30script-security 2
31# 使用临时文件验证,用户名和密码保存在临时文件中,作为参数传给可执行文件
32auth-user-pass-verify /etc/openvpn/server/verify via-file
33# others
34keepalive 10 120
35cipher AES-256-CBC
36persist-key
37persist-tun
38# 状态文件,在此文件中可查看已连接的客户端信息
39status /var/log/openvpn/openvpn-status.log
40# 日志文件
41log-append /var/log/openvpn/openvpn.log
42verb 3
认证插件与密码生成等沿用之前的配置
启动服务
1systemctl enable --now openvpn-server@tun0
检查网卡与日志
1➜ ip addr show tun0
268: tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc fq state UNKNOWN group default qlen 100
3 link/none
4 inet 10.100.0.1/24 brd 10.100.0.255 scope global tun0
5 valid_lft forever preferred_lft forever
6 inet6 fe80::741a:7b72:a4d5:74ba/64 scope link flags 800
7 valid_lft forever preferred_lft forever
8➜ ~ tail /var/log/openvpn/openvpn.log
9/sbin/ip addr add dev tun0 10.100.0.1/24 broadcast 10.100.0.255
10Could not determine IPv4/IPv6 protocol. Using AF_INET
11Socket Buffers: R=[87380->87380] S=[65536->65536]
12Listening for incoming TCP connection on [AF_INET][undef]:443
13TCPv4_SERVER link local (bound): [AF_INET][undef]:443
14TCPv4_SERVER link remote: [AF_UNSPEC]
15MULTI: multi_init called, r=256 v=256
16IFCONFIG POOL: base=10.100.0.2 size=252, ipv6=0
17MULTI: TCP INIT maxclients=1024 maxevents=1028
18Initialization Sequence Completed
4. 安装与配置OpenVPN客户端
客户端使用macOS,通过homebrew安装openvpn-connect
1brew install --cask openvpn-connect
编写openvpn.opvn配置文件
1client
2dev tun
3nobind
4proto tcp
5tun-mtu 1500
6remote xxx.xxx.xxx.xxx 443
7cipher AES-256-CBC
8# 包含账号密码的txt文件位置
9auth-user-pass $HOME/auth.txt
10persist-key
11persist-tun
12# 内嵌根证书
13<ca>
14-----BEGIN CERTIFICATE-----
15....
16-----END CERTIFICATE-----
17</ca>
将openvpn.ovpn与auth.txt文件放在同一个目录下,然后打开OpenVPN导入配置
测试联通性
1➜ ping 10.100.0.1
2PING 10.100.0.1 (10.100.0.1): 56 data bytes
364 bytes from 10.100.0.1: icmp_seq=0 ttl=64 time=169.304 ms
464 bytes from 10.100.0.1: icmp_seq=1 ttl=64 time=169.096 ms
564 bytes from 10.100.0.1: icmp_seq=2 ttl=64 time=169.901 ms
664 bytes from 10.100.0.1: icmp_seq=3 ttl=64 time=172.967 ms
7^C
8--- 10.100.0.1 ping statistics ---
94 packets transmitted, 4 packets received, 0.0% packet loss
10round-trip min/avg/max/stddev = 169.096/170.317/172.967/1.558 ms
comments powered by Disqus