返回介绍

最佳实践 59:OpenVPN 的排错步骤

发布于 2025-04-20 17:44:46 字数 6553 浏览 0 评论 0 收藏

在实践中,运维工程师们经常需要搭建一套 OpenVPN 的系统或者运维一套已经在线上生产环境中使用的 OpenVPN 系统。在配置或者维护虚拟专用网络的过程中,根据不同的需求,可能会遇到各种各样不同的问题。

在此,我们总结了对于 OpenVPN 系统最佳的排错步骤。在遇到问题时,可以按照下面的步骤进行排查。

步骤 1 认真查看与分析服务器端和客户端的 OpenVPN 日志。

在服务器上,使用如下指令配置 OpenVPN 的日志:

log-append  /var/log/openvpn/openvpn.log
verb 4

那么在出现异常时,首先需要分析这个文件,该文件分以下几个部分。

- OpenVPN 实际运行时读取的配置文件位置和配置项。以如下格式开始:

Fri Dec 18 13:25:44 2015 us=656293 Current Parameter Settings:
Fri Dec 18 13:25:44 2015 us=656383   config = '/etc/openvpn/server.conf'

- OpenVPN 的版本和 OpenSSL 版本:

Fri Dec 18 13:25:44 2015 us=660554 OpenVPN 2.3.8 x86_64-redhat-linux-gnu [SSL (OpenSSL)] [LZO] [EPOLL] [PKCS11] [MH] [IPv6] built on Aug  4 2015
Fri Dec 18 13:25:44 2015 us=660566 library versions: OpenSSL 1.0.1e-fips 11 Feb 2013, LZO 2.03
Fri Dec 18 13:25:44 2015 us=663615 Diffie-Hellman initialized with 1024 bit key

- OpenVPN 本地添加的路由信息:

Fri Dec 18 13:25:44 2015 us=665243 /sbin/ip link set dev tun0 up mtu 1500
Fri Dec 18 13:25:44 2015 us=668536 /sbin/ip addr add dev tun0 local 172.16.100.1 peer 172.16.100.2
Fri Dec 18 13:25:44 2015 us=670061 /sbin/ip route add 10.128.119.0/24 via 172.16. 100.2
Fri Dec 18 13:25:44 2015 us=671212 /sbin/ip route add 192.168.20.0/24 via 172.16. 100.2
Fri Dec 18 13:25:44 2015 us=672122 /sbin/ip route add 172.16.100.0/24 via 172.16. 100.2 

注意

观察需要增加的路由是否完整,同时注意配置项的输出是否和配置文件中一致。

如果不一致,则可能是修改了配置文件而没有重启 OpenVPN 进程。

- 客户端连接时的信息:

Fri Dec 18 13:25:54 2015 us=348333 x.y.z.28:58937 Re-using SSL/TLS context
#压缩启用成功
Fri Dec 18 13:25:54 2015 us=348369 x.y.z.28:58937 LZO compression initialized
Fri Dec 18 13:25:54 2015 us=348505 x.y.z.28:58937 Control Channel MTU parms [ L:1542 D:166 EF:66 EB:0 ET:0 EL:3 ]
Fri Dec 18 13:25:54 2015 us=348537 x.y.z.28:58937 Data Channel MTU parms [ L:1542 D:1450 EF:42 EB:143 ET:0 EL:3 AF:3/1 ]
#和客户端建立连接时,本地的配置项
Fri Dec 18 13:25:54 2015 us=348679 x.y.z.28:58937 Local Options String: 'V4,dev-type tun,link-mtu 1542,tun-mtu 1500,proto UDPv4,comp-lzo,keydir 0,cipher BF-CBC,auth SHA1,keysize 128,tls-auth,key-method 2,tls-server'
#和客户端建立连接时,对客户端配置项的要求
Fri Dec 18 13:25:54 2015 us=348706 x.y.z.28:58937 Expected Remote Options String: 'V4,dev-type tun,link-mtu 1542,tun-mtu 1500,proto UDPv4,comp-lzo,keydir 1,cipher BF-CBC,auth SHA1,keysize 128,tls-auth,key-method 2,tls-client'
Fri Dec 18 13:25:54 2015 us=348743 x.y.z.28:58937 Local Options hash (VER=V4): '14168603'
Fri Dec 18 13:25:54 2015 us=348766 x.y.z.28:58937 Expected Remote Options hash (VER=V4): '504e774e'
Fri Dec 18 13:25:54 2015 us=348824 x.y.z.28:58937 TLS: Initial packet from [AF_INET]x.y.z.28:58937, sid=5e66e4eb b8382cc8
#CA 证书信息
Fri Dec 18 13:25:54 2015 us=652935 x.y.z.28:58937 VERIFY OK: depth=1, C=CN, ST=SH, L=SH, O=XUFENG-INFO, OU=DEVOPS, CN=cert.xufeng.info, emailAddress=xufengnju@163.com
#客户端证书,注意 VERIFY 后面的,必须是 OK
Fri Dec 18 13:25:54 2015 us=653140 x.y.z.28:58937 VERIFY OK: depth=0, C=CN, ST=SH, O=XUFENG-INFO, OU=VPN, CN=vpnclient1.xufeng.info, emailAddress=xufengnju@163.com
Fri Dec 18 13:25:54 2015 us=704318 x.y.z.28:58937 Data Channel Encrypt: Cipher 'BF-CBC' initialized with 128 bit key #加密算法
Fri Dec 18 13:25:54 2015 us=704352 x.y.z.28:58937 Data Channel Encrypt: Using 160 bit message hash 'SHA1' for HMAC authentication #HMAC 算法
Fri Dec 18 13:25:54 2015 us=704436 x.y.z.28:58937 Data Channel Decrypt: Cipher 'BF-CBC' initialized with 128 bit key
Fri Dec 18 13:25:54 2015 us=704453 x.y.z.28:58937 Data Channel Decrypt: Using 160 bit message hash 'SHA1' for HMAC authentication
Fri Dec 18 13:25:54 2015 us=729243 x.y.z.28:58937 Control Channel: TLSv1.2, cipher TLSv1/SSLv3 DHE-RSA-AES256-GCM-SHA384, 1024 bit RSA
Fri Dec 18 13:25:54 2015 us=729287 x.y.z.28:58937 [vpnclient1.xufeng.info] Peer Connection Initiated with [AF_INET]x.y.z.28:58937
Fri Dec 18 13:25:54 2015 us=729344 vpnclient1.xufeng.info/x.y.z.28:58937 OPTIONS IMPORT: reading client specific options from: /etc/openvpn/ccd/vpnclient1.xufeng.info #确认服务器上读到了客户端的专用配置文件
Fri Dec 18 13:25:54 2015 us=729586 vpnclient1.xufeng.info/x.y.z.28:58937 MULTI: Learn: 172.16.100.5 -> vpnclient1.xufeng.info/x.y.z.28:58937
Fri Dec 18 13:25:54 2015 us=729610 vpnclient1.xufeng.info/x.y.z.28:58937 MULTI: primary virtual IP for vpnclient1.xufeng.info/x.y.z.28:58937: 172.16.100.5
Fri Dec 18 13:25:54 2015 us=729628 vpnclient1.xufeng.info/x.y.z.28:58937 MULTI: internal route 10.128.119.0/24 -> vpnclient1.xufeng.info/x.y.z.28:58937
Fri Dec 18 13:25:54 2015 us=729648 vpnclient1.xufeng.info/x.y.z.28:58937 MULTI: Learn: 10.128.119.0/24 -> vpnclient1.xufeng.info/x.y.z.28:58937
Fri Dec 18 13:25:56 2015 us=789781 vpnclient1.xufeng.info/x.y.z.28:58937 PUSH: Received control message: 'PUSH_REQUEST'
Fri Dec 18 13:25:56 2015 us=789819 vpnclient1.xufeng.info/x.y.z.28:58937 send_push_reply(): safe_cap=940
Fri Dec 18 13:25:56 2015 us=789862 vpnclient1.xufeng.info/x.y.z.28:58937 SENT CONTROL [vpnclient1.xufeng.info]: 'PUSH_REPLY,route 172.16.100.0 255.255.255.0,topology net30,ping 10,ping-restart 120,route 10.168.103.0 255.255.255.0,route 192.168.20.0 255.255.255.0,ifconfig 172.16.100.5 172.16.100.6' (status=1) #向客户端发送的 PUSH 内容

步骤 2 对比分析服务器端和客户端的配置文件,确保相关配置项一致。

这里提供一个简单有效的方法。首先把服务器配置文件和客户端配置文件都下载下来,对内容使用 Linux 中的 diff 或者 Windows 中的 Beyond Compare 进行对比。使用 diff 命令时操作如下:

sort server.conf > server.conf.1
sort vpnclient.conf >vpnclient.conf.1
diff server.conf.1 vpnclient.conf.1 

注意

这样对比下来,以下项目必须保证一致:cipher、ca、dev、proto、comp-lzo。

另外,在服务器端 tls-auth/etc/openvpn/ta.key 0 和客户端 tls-auth/etc/openvpn/ta.key 1 上匹配。

步骤 3 检查服务器是否打开转发并被防火墙允许。

使用如下命令,确认值是 1:

# sysctl net.ipv4.ip_forward
net.ipv4.ip_forward = 1 

使用如下命令,确认 chain FORWARD 为 ACCEPT 或者显示指定了 tun0 的 FORWARD 为 ACCEPT:

iptables -L -n

步骤 4 检查服务器上 NAT 的设置。

如下是一个正确使用 iptables-save 之后的 NAT 配置内容:

*nat
:PREROUTING ACCEPT [176:15277]
:POSTROUTING ACCEPT [44:2480]
:OUTPUT ACCEPT [36:2160]
-A POSTROUTING -o eth1 -j MASQUERADE #VPN 服务器内网口启用 NAT
-A POSTROUTING -o tun0 -j MASQUERADE #VPN 服务器隧道口启用 NAT
COMMIT

步骤 5 检查主机的路由表。

在所有参与网络通信的服务器,按照网络数据流的路径,依次使用 route 或者 traceroute 命令检查下一跳是否正确。如指向不正确,则修正。

步骤 6 使用 tcpdump 进行分析。

如以上步骤依然无法排除问题,可以使用 tcpdump 进行抓包。关于使用 tcpdump 的技巧,请参考本书“第 14 章使用 tcpdump 与 Wireshark 解决疑难问题”一章。

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。