python - 使用 scapy 删除 TCP 选项
问题描述
我正在使用 scapy 和 NetFilterQueue 来操作客户端和服务器之间的 IP 数据包。
我想删除 TCP 标头选项字段列表中的最后一个选项。删除 TCP 标头中的选项会更改数据包的大小,每当我更改数据包的大小时,都会导致客户端和服务器端的数据包丢失。
我试图重新计算 IP 和 TCP 的长度,但仍然不起作用。这是我的完整代码,我使用的是 scapy 版本 2.4.5。
#! /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 选项而不是删除它)。
解决方案
推荐阅读
- linux - 屏幕锁定时是否可以在 gnome 中创建给定工作区的快照?
- c# - 向默认构造函数添加断点
- mysql - 记录字段更改的审核历史记录
- python - 带有 Flask 的 pytest 找不到模块
- sql-server - SQL - 添加所有以前的列和当前列,没有滞后和领先
- java - Update the Key of a Map
- security - Directory permissions under /var/lib/kubelet/pods
- php - PDO SQL select from_user = user1 to_user = user2 反之亦然,例如 from_user = user2 to_user = user1?
- anylogic - How to simulate AGV charging time?
- tensorflow - Add data to tf.data.Dataset API in batches