我们遇到了一些 IPSec 连接问题,这些问题似乎与某些 ISP 的 UDP 校验和设置(错误)有关。
为了进一步调查,我想在受控环境中重现错误。
现在,我不知道 ISP 到底做了什么,所以我想直接操纵 UDP 数据包来重现给定的场景(UDP 校验和缺失、正确设置和错误设置)。
客户端:一台装有部分工具(perl、iptables、gnu tools、bash、tcpdump)的 Linux 机器。
服务器:一台几乎没有任何工具(bash、pf、tcpdump)的基于 freeBSD 的机器。
我想测试服务器对不同 UDP 校验和情况的反应。
由于它没有太多工具,我认为重现这些情况的最简单方法是从 Linux 客户端。
我知道可以使用曼格尔表。
这只允许我正确设置 UDP 校验和。
如何伪造数据包的 UDP 校验和,使其不存在、设置正确或设置错误?
关于如何重现这些场景的任何想法(也许以不同的方式)也欢迎在评论中提出。
答案1
我找到了一种方法,可以将 Python 脚本挂接到 mangle 表中,并使用该 Python 脚本更改数据包。性能显然很慢,但对于测试目的来说已经足够了。
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()