Назад | Перейти на главную страницу

Подделать контрольную сумму UDP

У нас возникают некоторые проблемы с подключением IPSec, которые кажутся связанными с контрольной суммой UDP, которая (неправильно) установлена ​​у некоторых интернет-провайдеров.
Для дальнейшего исследования я хочу воспроизвести ошибку в контролируемой среде.
Теперь я не знаю, что именно делает интернет-провайдер, поэтому я хотел бы напрямую манипулировать UDP-пакетами для воспроизведения заданного сценария (контрольная сумма UDP отсутствует, установлена ​​правильно и неправильно).

Клиент: Linux-машина с некоторыми инструментами (perl, iptables, gnu tools, bash, tcpdump).
Сервер: машина на базе FreeBSD почти без инструментов (bash, pf, tcpdump)

Я хочу проверить, как сервер реагирует на различные ситуации с контрольной суммой UDP.
Поскольку у него не так много инструментов, я решил, что проще всего воспроизвести эти ситуации с помощью клиента Linux.
Я знаю, что есть возможность установить контрольную сумму UDP с помощью выжимать стол.
Это только позволяет мне правильно установить контрольную сумму UDP.

Как сделать так, чтобы контрольная сумма пакетов UDP была несуществующей, правильно или неправильно установленной?

Любые идеи о том, как воспроизвести эти сценарии - возможно, по-другому - также приветствуются в комментариях.

Я нашел способ подключить скрипт python к таблице mangle и изменить пакеты с помощью этого скрипта python. Производительность по понятным причинам довольно низкая, но ее вполне достаточно для тестирования.

Скрипт python3 выглядит так (используя чешуйчатый и NetfilterQueue):

from netfilterqueue import NetfilterQueue as nfqueue
from scapy.all import *
import os

iptablesr = 'iptables -t mangle -A POSTROUTING -p udp --dport 4500 -j NFQUEUE --queue-num 1'
print("Adding iptable rules: ")
print(iptablesr)
os.system(iptablesr)
def alter_callback(packet):
  print("=======================")
  pkt = IP(packet.get_payload())
  pkt.show2()

  udp = pkt.getlayer(UDP)

  del pkt.chksum
  #del udp.chksum
  udp.chksum = 0x111 # set udp checksum to something else

  pkt.show2()

  print("=======================")
  packet.set_payload(bytes(pkt))
  packet.accept()

def main():
  q = nfqueue()
  q.bind(1, alter_callback)
  try:
    q.run()
  except KeyboardInterrupt:
    q.unbind()
    print("Flushing iptables.")
    os.system("iptables -t mangle -F")

if __name__ == "__main__":
  main()