TLS 握手为什么会失败?

TLS 握手为什么会失败?

我的 OpenVPN 客户端(Windows 10)位于企业局域网中,并连接到 Internet 上的服务器(Ubuntu)。该设置以前可以运行,但一段时间前停止了(请参阅下文了解小型基础设施更改,服务器或客户端的配置均未更改)。

在下面的日志中

  • OpenVPN 服务器地址是SERVERIP
  • 离开公司局域网时,源地址是CORPORATEIP(它是从客户端的内部IP进行SNAT的)

当尝试从客户端连接时,我收到以下日志:

Sun May 29 10:55:07 2016 OpenVPN 2.3.11 x86_64-w64-mingw32 [SSL (OpenSSL)] [LZO] [PKCS11] [IPv6] built on May 10 2016
Sun May 29 10:55:07 2016 Windows version 6.2 (Windows 8 or greater) 64bit
Sun May 29 10:55:07 2016 library versions: OpenSSL 1.0.1t  3 May 2016, LZO 2.09
Sun May 29 10:55:07 2016 MANAGEMENT: TCP Socket listening on [AF_INET]127.0.0.1:25340
Sun May 29 10:55:07 2016 Need hold release from management interface, waiting...
Sun May 29 10:55:08 2016 MANAGEMENT: Client connected from [AF_INET]127.0.0.1:25340
Sun May 29 10:55:08 2016 MANAGEMENT: CMD 'state on'
Sun May 29 10:55:08 2016 MANAGEMENT: CMD 'log all on'
Sun May 29 10:55:08 2016 MANAGEMENT: CMD 'hold off'
Sun May 29 10:55:08 2016 MANAGEMENT: CMD 'hold release'
Sun May 29 10:55:08 2016 MANAGEMENT: CMD 'proxy NONE  '
Sun May 29 10:55:09 2016 Socket Buffers: R=[65536->65536] S=[65536->65536]
Sun May 29 10:55:09 2016 MANAGEMENT: >STATE:1464512109,RESOLVE,,,
Sun May 29 10:55:09 2016 UDPv4 link local: [undef]
Sun May 29 10:55:09 2016 UDPv4 link remote: [AF_INET]SERVERIP:1194
Sun May 29 10:55:09 2016 MANAGEMENT: >STATE:1464512109,WAIT,,,

在服务器端这相当于

May 29 10:55:09 srv ovpn-server[732]: CORPORATEIP:15057 TLS: Initial packet from [AF_INET]CORPORATEIP:15057, sid=38d5a524 b40f69aa
May 29 10:56:09 srv ovpn-server[732]: CORPORATEIP:15057 TLS Error: TLS key negotiation failed to occur within 60 seconds (check your network connectivity)
May 29 10:56:09 srv ovpn-server[732]: CORPORATEIP:15057 TLS Error: TLS handshake failed
May 29 10:56:09 srv ovpn-server[732]: CORPORATEIP:15057 SIGUSR1[soft,tls-error] received, client-instance restarting
May 29 10:56:12 srv ovpn-server[732]: CORPORATEIP:15082 TLS: Initial packet from [AF_INET]CORPORATEIP:15082, sid=36d1f0e9 9cdc88ec

因此客户端确实到达了服务器,尝试建立连接,然后TLS Error: TLS key negotiation failed to occur within 60 seconds就发生了。

OpenVPN 常见问题解答提到此错误并暗示流量可能被防火墙阻断(在服务器或客户端)。但事实并非如此,因为客户端到达服务器(因此udp/1154流量在防火墙上是开放的)。

该设置以前可以正常工作,我能想到的唯一变化是服务器端的变化:它以前位于 LAN 中,并udp/1154转发到它,现在位于 DMZ 中(如果需要,它通过 iptables/shorewall 自行管理 DNAT)。由于来自客户端的数据包确实到达了服务器,因此我不认为这是原因。

在进一步探讨之前,我想先把防火墙问题放在一边:

  • 我从以上内容理解是客户端->服务器连接有效。
  • 从 OpenVPN 服务器到外部世界的流量是开放的(CORPORATEIP例如,我可以 ping 通,UDP并且TCP也是开放的)

我上面关于防火墙不是问题的假设正确吗?

(因为我想确保返回路径不被阻塞,所以我在服务器上放置了一个小型 HTTP 服务器,并从企业局域网连接到它,连接通过(相同的路径))


# server configuration
port 1194
proto udp
dev tun0
ca /etc/openvpn/ca.crt
cert /etc/openvpn/server.crt
dh /etc/openvpn/dh2048.pem
server 10.10.13.0 255.255.255.0
ifconfig-pool-persist ipp.txt
push "redirect-gateway def1 bypass-dhcp"
push "dhcp-option DNS 208.67.222.222"
push "dhcp-option DNS 208.67.220.220"
duplicate-cn
keepalive 10 120
comp-lzo
user nobody
group nogroup
persist-key
persist-tun
status openvpn-status.log
verb 3

# client configuration
route-nopull
route 10.10.10.0 255.255.255.0
route 10.10.11.0 255.255.255.0
route 10.10.12.0 255.255.255.0
client
dev tun
proto udp
remote SERVER_IP 1194
resolv-retry infinite
nobind
persist-key
persist-tun
remote-cert-tls server
comp-lzo
verb 3
<ca>
-----BEGIN CERTIFICATE-----
MIIEgDCCA2igAwIBAgIJ...
(...)
b4yiCAmaA8p5JRYqYBiT...
p20oZw==
-----END CERTIFICATE-----
</ca>
<cert>
Certificate:
(...)
         8f:d4:9d:d0
-----BEGIN CERTIFICATE-----
MIIE3DCCA8SgAwIBAgIBA...
(...)
eGOJMoV4vXQ31DZmEl33l...
-----END CERTIFICATE-----
</cert>
<key>
-----BEGIN PRIVATE KEY-----
MIIEvwIBADANBgkqhkiG9...
(...)
APOSuHJ4aXJocgOK3jGoK...
-----END PRIVATE KEY-----
</key>

答案1

TL;DR:问题最终出在出站防火墙上。

这是带有透明代理的防火墙,可以过滤“应用程序”等(具体如何实现是专有的 - 这是 BlueCoat 设备)。我被授权使用 VPN(包括 OpenVPN),处理授权的守护进程在周末崩溃了 - 导致我的数据包被丢弃。

这是一个局部问题,我考虑删除该问题,但有一个奇怪的行为可能对面临类似问题的人有所帮助:只有一些 OpenVPN 数据包被 BlueCoat 标记为“VPN” - 因此初始连接正在通过(即CLIENT_HARD_RESET),但其他数据包(SERVER_HARD_RESET首先)被阻止。

如果一切都被阻止,排除故障就会容易得多,但误导性的是部分流量丢失。

相关内容