- 前言
- 读者对象
- 如何阅读本书
- 勘误和支持
- 致谢
- 第 1 篇 高性能网站构建
- 第 1 章 深入理解 DNS 原理与部署 BIND
- 第 2 章 全面解析 CDN 技术与实战
- 第 3 章 负载均衡和高可用技术
- 第 4 章 配置及调优 LVS
- 第 5 章 使用 HAProxy 实现 4 层和 7 层代理
- 第 6 章 实践 Nginx 的反向代理和负载均衡
- 第 7 章 部署商业负载均衡设备 NetScaler
- 第 8 章 配置高性能网站
- 第 9 章 优化 MySQL 数据库
- 第 2 篇 服务器安全和监控
- 第 10 章 构建企业级虚拟专用网络
- 第 11 章 实施 Linux 系统安全策略与入侵检测
- 第 12 章 实践 Zabbix 自定义模板技术
- 第 13 章 服务器硬件监控
- 第 3 篇 网络分析技术
- 第 14 章 使用 tcpdump 与 Wireshark 解决疑难问题
- 第 15 章 分析与解决运营商劫持问题
- 第 16 章 深度实践 iptables
- 第 4 篇 运维自动化和游戏运维
- 第 17 章 使用 Kickstart 完成批量系统安装
- 第 18 章 利用 Perl 编程实施高效运维
- 第 19 章 精通 Ansible 实现运维自动化
- 第 20 章 掌握端游运维的技术要点
- 第 21 章 精通手游运维的架构体系
最佳实践 59:OpenVPN 的排错步骤
在实践中,运维工程师们经常需要搭建一套 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 解决疑难问题”一章。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论