Я рвал на себе волосы из-за этого. Я пытаюсь написать сервер SOCKS5 на Python для туннелирования UDP-трафика. Я привязываюсь к порту и получаю данные нормально. Затем я анализирую заголовок SOCKS5 UDP (не типичный заголовок UDP) и перенаправляю дейтаграмму в запрошенную конечную точку.
Все хорошо. Затем я прослушиваю ответ от конечной точки (повторно отправляя, если тайм-аут) и получаю ответ. Здорово!
Вот где я схожу с ума-
Я получаю дейтаграмму от конечной точки. Я повторно инкапсулирую возвращенную дейтаграмму в соответствии с SOCKS5 RFC, который является тем же заголовком UDP, что и раньше. , за исключением того, что теперь я изменил адрес назначения и порт на исходный вызывающий абонент. Я использую:
sock_client = socket.socket(socket.AF_INET, # Internet
socket.SOCK_DGRAM) # UDP
sock_client.sendto(packed_datagram, (self.client_ip, self.client_port))
отправить дейтаграмму обратно клиенту. Клиент никогда не получает ответ! Всегда!
Глядя на WireShark, он говорит следующее: Контрольная сумма заголовка: 0x0000 [неверно, должно быть 0xcd1f (может быть вызвано «разгрузкой контрольной суммы IP»?)]
Разве реализация сокета Python с установленным socket.DGRAM не должна автоматически правильно упаковывать мои данные в заголовок UDP и вычислять соответствующую контрольную сумму? Почему он установлен на 0x0000? Я проверил полезную нагрузку в шестнадцатеричном формате, контрольная сумма действительно установлена неправильно. Что, черт возьми, происходит?