自定义 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 用于重放保护..