我正在编写一个简单的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是用于重播保护的。
关于python - 自定义OpenVPN客户端未收到TLS ServerHello,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33873869/