OpenVPN笔记-02

文章目录

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