utilisant Netfilter la file d'attente et scapy changer la charge utile TCP, client de test envoyer un msg pour le serveur de test:comment changer la charge utile TCP et la longueur par la file d'attente netfilter et scapy
règle iptables dans le serveur de test: iptables -A SORTIE -p TCP -d [test client ip] -j NFQUEUE --queue-num 1
Après avoir modifié la charge utile TCP, si la longueur est la même après la modification, et juste remplacer les chaînes, tous se comportent correctement.
mais si la longueur est différente, le programme est anormal:
si la longueur de la charge utile est plus courte: client peut recevoir la charge utile modifiée, mais la prise ne peut pas fermer normalement, le client envoie une connexion RST Si la charge utile est plus longue: client peut également recevoir la charge utile modifiée, mais le serveur à plusieurs reprises pour envoyer le paquet plusieurs fois, le socket ne peut pas fermer normalement, le socket du serveur est «FERMETURE», et la prise client est 'FIN_WAIT1' ou 'TIME_WAIT' la file d'attente du système est enfin 14, normal est 6:
cat/proc/net/netfilter/nfnetlink_queue
1 7888 0 2 4016 0 0 14 1
de l'affichage de tcpdump, il y a beaucoup de "retransmission tcp"
quelqu'un me aider? merci, ci-dessous est le code de test:
from netfilterqueue import NetfilterQueue
from scapy.layers.inet import IP,TCP
from scapy.packet import Packet,Raw
def print_and_accept(pkt):
msg = IP(pkt.get_payload())
try:
if msg.haslayer(TCP) and msg.haslayer(Raw):
print msg[IP].show()
_Data = 'for the hook test'
msg[TCP].remove_payload()
msg[TCP].add_payload(_Data)
#msg[Raw].load = _Data
msg[IP].len = len(msg)
del msg[IP].chksum
del msg[TCP].chksum
msg = msg.__class__(str(msg))
pkt.set_payload(str(msg))
#new_msg = IP(pkt.get_payload())
#print new_msg[TCP].payload
#print new_msg[IP].show()
print msg[IP].show()
print 'End!!!'
pkt.accept()
else:
pkt.accept()
except Exception, err:
print err
pkt.accept()
nfqueue = NetfilterQueue()
nfqueue.bind(1, print_and_accept)
try:
nfqueue.run()
except KeyboardInterrupt:
print('')