《Linux系统安全:纵深防御、安全扫描与入侵检测 》 —3.8 OpenVPN的排错步骤
3.8 OpenVPN的排错步骤
在实践中,运维工程师们经常需要搭建一套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)检查服务器上网络地址转换的设置。
如下是一个正确使用iptables-save之后的网络地址转换配置内容:
*nat
:PREROUTING ACCEPT [176:15277]
:POSTROUTING ACCEPT [44:2480]
:OUTPUT ACCEPT [36:2160]
-A POSTROUTING -o eth1 -j MASQUERADE #虚拟专用网络服务器内网口启用网络地址转换
-A POSTROUTING -o tun0 -j MASQUERADE #虚拟专用网络服务器隧道口启用网络地址转换
COMMIT
5)检查主机的路由表。在所有参与网络通信的服务器上,按照网络数据流的路径,依次使用route或者traceroute命令检查下一跳是否正确。如指向不正确,则修正。
6)使用tcpdump进行分析。
如以上步骤依然无法排除问题,可以使用tcpdump进行抓包分析。
- 点赞
- 收藏
- 关注作者
评论(0)