如何解决使用 scapy 删除 TCP 选项
我使用 scapy 和 NetFilterQueue 来操作客户端和服务器之间的 IP 数据包。
我想删除 TCP 标头选项字段列表中的最后一个选项。删除 TCP 标头中的选项会更改数据包的大小,每当我更改数据包大小时,都会导致客户端和服务器端的数据包丢失。
我尝试重新计算 IP 和 TCP 的长度,但仍然无效。这是我的完整代码,我使用的是 2.4.5 版 scapy。
#! /usr/bin/env python2.7
from scapy.all import *
from netfilterqueue import NetfilterQueue
import os
iptablesr = "iptables -A FORWARD -j NFQUEUE --queue-num 1"
os.system(iptablesr)
os.system("sysctl net.ipv4.ip_forward=1")
def check_mptcp_option(option_list):
for option in option_list:
if option[0] == 30:
return True
return False
def modify(packet):
ip_pkt = IP(packet.get_payload())
try:
ip_tcp = ip_pkt.getlayer(TCP)
if check_mptcp_option(ip_tcp.options):
payload_before = len(ip_pkt[TCP])
ip_pkt[TCP].options = ip_pkt[TCP].options[:-1] # remove last option
payload_after = len(ip_pkt[TCP])
payload_dif = payload_after - payload_before
ip_pkt[IP].len = ip_pkt[IP].len + payload_dif
del ip_pkt[IP].chksum
del ip_pkt[TCP].chksum
packet.set_payload(str(ip_pkt))
packet.accept()
except Exception as e:
print(e)
packet.accept() #just skip the packet unmodified.
def main():
nfqueue = NetfilterQueue()
nfqueue.bind(1,modify)
try:
print "[*] waiting for data"
nfqueue.run()
except KeyboardInterrupt:
nfqueue.unbind()
print "Flushing iptables."
os.system('iptables -F')
os.system('iptables -X')
if __name__ == "__main__":
main()
注意:如果我在不改变数据包大小的情况下执行任何操作(例如修改 TCP 选项而不是删除它)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。