我正在编写一个简单的OpenVPN客户机(使用Python&Scapy&Scapy&ssl_tls] )它应该连接到OpenVPN服务器。在
我用Python打开udpsocket,用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
确认,但仅此而已。注意,这个确认并不意味着服务器收到了OpenVPN消息,不一定是TLS数据。我应该得到ServerHello和所有剩余的东西,但服务器在确认后不发送任何东西。在
我将我发送的数据包的格式和所有网络层与真实客户端的通信(下图)进行了比较,几乎所有字段都是相同的。在
当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中定义的一个层。在
你知道我为什么不叫服务器吗?在
编辑:考虑到我没有收到来自服务器的任何警报,我确信服务器出于某种原因甚至看不到我的ClientHello。
显然
Message Packet-ID
必须是1(或更多)。现在我得到服务器的响应。在Official specification只提到包id是用于重播保护的。。在
相关问题 更多 >
编程相关推荐