У нас возникают некоторые проблемы с подключением 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()