自定义 OpenVPN 客户端不接收 TLS ServerHello
Custom OpenVPN client does not receive TLS ServerHello
我正在编写一个简单的 OpenVPN 客户端(使用 Python & Scapy & [scapy-ssl_tls]
) 应该连接到 OpenVPN 服务器。
我在 Python 中打开 UDP 套接字并使用 Scapy 在 UDP 之上定义我自己的 OpenVPN 层(根据 OpenVPN 规范)并在其上发送数据包(就像原始客户端一样)。
我能够成功发送初始 P_CONTROL_HARD_RESET_CLIENT_V2
消息并从服务器接收响应,即 P_CONTROL_HARD_RESET_SERVER_V2
,然后我发送 P_ACK_V1
消息。
请记住,我正确生成了所有会话 ID。
现在,当我发送第一个 P_CONTROL_V1
消息时,它本质上是 OpenVPN 层顶部的 TLS ClientHello,我从服务器收到 P_ACK_V1
确认,仅此而已。请注意,此 ACK 仅表示服务器收到了 OpenVPN 消息,不一定是 TLS 数据。我应该得到 ServerHello 和所有剩余的东西,但服务器在 ACK 之后没有发送任何东西。
我将发送的数据包的数据包格式和所有网络层与真实客户端的通信(下图)进行了比较,几乎所有字段都是相同的。
Wireshark 在完成握手后会自动合并和组装数据包,因此比较它并不难。
我也尝试重播来自之前真实客户端通信的完整 ClientHello 消息(虽然我生成了自己的本地时间)但结果是一样的 - ACK 然后什么都没有。
我还检查了服务器日志,没有发现任何错误或任何可以帮助我的东西。
我这样创建我的 TLS 数据包(有更多选项):
pack = openvpn(opcode=0x20, session_id=ses, message_packet_id_array_length=0, message_packet_id=0000)/TLSRecord()/TLSHandshake()/TLSClientHello()
openvpn
是我在Scapy中自己定义的层。
为什么我没有得到 ServerHello 有什么想法吗?
编辑:考虑到我没有从服务器收到任何警报,我很确定服务器出于某种原因甚至没有看到我的 ClientHello。
显然 Message Packet-ID
必须为 1(或更多)。现在我得到了服务器的响应。
Official specification 只提到 Packet-id 用于重放保护..
我正在编写一个简单的 OpenVPN 客户端(使用 Python & Scapy & [scapy-ssl_tls] ) 应该连接到 OpenVPN 服务器。
我在 Python 中打开 UDP 套接字并使用 Scapy 在 UDP 之上定义我自己的 OpenVPN 层(根据 OpenVPN 规范)并在其上发送数据包(就像原始客户端一样)。
我能够成功发送初始 P_CONTROL_HARD_RESET_CLIENT_V2
消息并从服务器接收响应,即 P_CONTROL_HARD_RESET_SERVER_V2
,然后我发送 P_ACK_V1
消息。
请记住,我正确生成了所有会话 ID。
现在,当我发送第一个 P_CONTROL_V1
消息时,它本质上是 OpenVPN 层顶部的 TLS ClientHello,我从服务器收到 P_ACK_V1
确认,仅此而已。请注意,此 ACK 仅表示服务器收到了 OpenVPN 消息,不一定是 TLS 数据。我应该得到 ServerHello 和所有剩余的东西,但服务器在 ACK 之后没有发送任何东西。
我将发送的数据包的数据包格式和所有网络层与真实客户端的通信(下图)进行了比较,几乎所有字段都是相同的。
Wireshark 在完成握手后会自动合并和组装数据包,因此比较它并不难。
我也尝试重播来自之前真实客户端通信的完整 ClientHello 消息(虽然我生成了自己的本地时间)但结果是一样的 - ACK 然后什么都没有。
我还检查了服务器日志,没有发现任何错误或任何可以帮助我的东西。
我这样创建我的 TLS 数据包(有更多选项):
pack = openvpn(opcode=0x20, session_id=ses, message_packet_id_array_length=0, message_packet_id=0000)/TLSRecord()/TLSHandshake()/TLSClientHello()
openvpn
是我在Scapy中自己定义的层。
为什么我没有得到 ServerHello 有什么想法吗?
编辑:考虑到我没有从服务器收到任何警报,我很确定服务器出于某种原因甚至没有看到我的 ClientHello。
显然 Message Packet-ID
必须为 1(或更多)。现在我得到了服务器的响应。
Official specification 只提到 Packet-id 用于重放保护..