2013-03-14 49 views
0

編寫python代碼來與Linux系統上的iptables nfqueue進行交互。我能夠檢索隊列數據包並修改它們,但是我無法通過隊列接受它們。Python Scapy nfqueue

  payload.set_verdict_modified(nfqueue.NF_ACCEPT, str(p), len(p)) 

這是我的理解將允許它通過隊列的路線。 p是我創建的新數據包,有效載荷是原始隊列數據包。

真的沒有太多的文檔,所以任何幫助將不勝感激。 感謝

這是我如何創建包

def queue_callback(i, payload) 

    data = payload.get_data() 
    packet = IP(data) 

這是我創建的包。我做的包處理的一點點,這是我回吧

packet[TCP].payload = after; 

    return packet; 

後,我回到了包我嘗試使用以前的命令

  p = modify(packet) 
      print p[TCP].payload 
      payload.set_verdict_modified(nfqueue.NF_ACCEPT, str(p), len(p)) 

的修改功能是更新iptables中的nfqueue我在哪裏創建一個新數據包並將其返回。

+0

你能提供有關該問題的更多信息,以及你在哪裏創建'p'的代碼? – 2013-03-14 18:51:07

+0

我更新了帖子。感謝幫助順便說一句,真的沒有這個在線文檔。我看了很多。問題是,數據包正在得到修改,我想要的。 tcp有效負載是正確的,但我不知道如何重新接受新的數據包。數據包在iptables防火牆中排隊,然後我想更新數據包,然後允許它通過。謝謝 – CBaker 2013-03-14 19:11:24

回答

0

我不明白你在哪裏修改數據包。通常情況下你的數據包處理應該在回調函數:

def cb(payload): 
    data = payload.get_data() 
    p = IP(data) 
    #Here you can manipulate the packet and modify it as you want 
    p[IP].src = "10.2.0.2" #change the src address for exemple 

    payload.set_verdict_modified(nfqueue.NF_ACCEPT, str(p), len(p)) 

然後調用回調函數創建隊列後:

q.set_callback(cb) 
    q = nfqueue.queue() 
    q.open() 
    q.create_queue(0) #Same queue number of the iptables rule 
+0

你是否設法修改了有效載荷?因爲我不能,如果我這樣做,我收不到答案。我是否需要更改任何其他TCP/IP頭來完成它? – aDoN 2014-12-04 12:20:16

+0

我想如果你改變有效載荷,你應該重新計算校驗和。這可以通過使用'no p.checksum'去除舊的校驗和來完成,scapy會自動重新計算新的校驗和。 – HaTiMuX 2014-12-05 15:04:01