2017-03-21 3 views
0

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('') 

Répondre

0

la longueur changé, suivants, ack num sont différents, il a provoqué l'anormal lorsque la prise de fermeture, je sais toujours pas comment solution de contournement sur ce problème, mais il n » t affecter la transmission de la charge utile