Я пишу простой клиент OpenVPN (с Python & Scapy & [scapy-ssl_tls]), который должен подключаться к серверу OpenVPN.
Я открываю сокет UDP в Python, и с помощью Scapy я определяю свой собственный уровень OpenVPN поверх UDP (согласно спецификациям OpenVPN) и отправляю на него пакеты (как и исходный клиент).
Я могу успешно отправить начальное P_CONTROL_HARD_RESET_CLIENT_V2
сообщение и получить ответ от сервера, который равен P_CONTROL_HARD_RESET_SERVER_V2
, затем я отправляю P_ACK_V1
сообщение.
Имейте в виду, что я правильно генерирую идентификаторы всех сеансов.
Теперь, когда я отправляю первое P_CONTROL_V1
сообщение, которое по сути является TLS ClientHello поверх уровня OpenVPN, я получаю 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.
ClientHello
(первый снимок экрана), а «реальная вещь» состоит из нескольких фрагментов, включаяClientHello
+Certificate
+ClientKeyExchange
+CertificateVerify
... (см. столбец с информацией о снимке экрана и информацию о «фрагментах сообщения») - person tintin   schedule 24.11.2015ClientHello
(которое Wireshark разбивает на дваP_CONTROL_V1
сообщения), а затем сервер отправляет собственноеServerHello
и так далее. Да, мне нужно отправлять сертификаты и все такое, но только после ответа сервера. Я могу четко наблюдать это с помощью Wireshark, когда смотрю на реальную связь клиент-сервер - после ClientHello приходит ServerHello. Просто Wireshark объединяет все сообщения клиентов, даже если они были отправлены в разном порядке. - person Tomas   schedule 24.11.2015