2016-07-25 73 views
2

這是我第一次使用原始套接字(是的,我需要使用它們,因爲我必須修改網絡標頭內的字段),並且我所閱讀的所有文檔或教程都描述了一個嗅探數據包的解決方案,但這不完全是我需要。我需要創建一個攔截數據包的腳本,對其進行處理並將其發送到目的地,即數據包不應到達目的地,除非我的腳本決定這樣做。我可以使用原始套接字攔截網絡數據包嗎(不僅是嗅探)?

爲了學習,我創建了一個小型原型,它檢測ping並僅打印「PING」。我希望ping不能正常工作,因爲我攔截了數據包,並且不包含將它們發送到目的地的邏輯。然而,ping正在工作(再次,它似乎只是嗅探/鏡像數據包)。我的目標是ping數據包在我的腳本中「被困」,我不知道該怎麼做。這是我在我目前的Python腳本做(我避免編寫我該怎麼辦解碼爲簡單起見)

sock = socket.socket(socket.AF_PACKET, socket.SOCK_RAW, socket.ntohs(0x0003)) 
sock.bind((eth0, 0)) 
packet = sock.recvfrom(65565) 
decode_eth(packet) 
decode_ip(packet) 

if (ipheader.ip_proto == 1): 
      print("\nPING") 

有人能解釋我如何能實現我的目標或指向我正確的文件?

回答

0

您的描述似乎與您的標題建議不同。我的理解是,您希望接收,修改並可能丟棄傳入的網絡數據包。這是要在Linux上完成的。在這種情況下,我建議你使用netfilter prerouting鉤子,這會讓事情變得簡單得多(並且可能更穩定)。 Netfilter有很好的文檔記錄,可以看到一個很好的概述,其中包括與您的要求相關的信息here。要使用的重要函數是nf_register_hook(),請閱讀this問題的答案,以瞭解如何設置問題。

0

我想你的Linux機器被配置成一個路由器(不是網橋)。數據包將通過您的Linux,因爲您已啓用IP轉發。所以有兩個解決辦法:

解決方案1:

禁用IP轉發,然後從一個接口接收數據包,並做相應的任務(轉發到另一個接口或刪除它)。

解決方案2:

使用NetFilterQueue

在你的Linux機器(於Debian/Ubuntu在我的例子)安裝:

apt-get install build-essential python-dev libnetfilter-queue-dev 

使用iptables發送從輸入接口(在我的例子爲eth0)來包:

iptables -I INPUT -i eth0 -j NFQUEUE --queue-num 1 

運行此腳本處理轉發到隊列No.1的數據包:

from netfilterqueue import NetfilterQueue 

def print_and_accept(pkt): 
    print pkt 
    pkt.accept() 

nfqueue = NetfilterQueue() 
nfqueue.bind(1, print_and_accept) 
try: 
    nfqueue.run() 
except KeyboardInterrupt: 
    print 

請注意pkt.drop()導致丟棄數據包。你也應該接受/放棄每一個數據包。