2017-10-08 174 views
2

所以我試圖在python中創建隧道協議。我有tun接口設置,通過它路由所有的流量。 但是現在如何獲得正在重定向到我的程序中的tun接口的數據包以加密它們並將它們發送到服務器? 從我看到它是要麼是socket.bind()或socket.setsockopt()函數。 這是我的接口設置從python網絡接口讀取和處理數據包

而這個代碼,我使用的現在:

import os, sys 
from select import select 


f = os.open("/dev/tun0", os.O_RDWR) 
os.system("ifconfig tun0 add 10.6.0.1 10.6.0.2") 
os.system("ip route add 0/1 dev tun0") 
try: 
    while 1: 
     r = select([f],[],[])[0][0] 
     if r == f: 
      packet = os.read(f, 4000) 
      print(str(len(packet)) + " : " + str(packet)) 


except KeyboardInterrupt: 
    print ("Stopped by user.") 
    os.system("ip route delete 0/1 dev tun0") 

這從設備直接讀取。那麼有沒有辦法使用套接字庫分別讀取數據包?

謝謝。

OS:MacOS的塞拉利昂

回答

0

我會把囤接口爲混雜模式,這樣我可以聽每一個穿過包。

關於如何做到這一點,提出在以下SO後良好的開端:

Python Sockets: Enabling Promiscuous Mode in Linux

其他選項將是一個網絡接口,一個低級別的訪問或虛擬網卡驅動程序編寫蟒蛇。

+0

混雜模式可能不是要走的路,我的tun0接口設置了一個點對點,再看看我的問題,我添加了詳細信息 –

+0

爲什麼不呢?通過在混雜模式下的套接字和s.readfrom(),您可以獲得一個數據包並從中獲取數據。你將不得不有兩個嗅探器,一個捕獲TCP和一個捕獲UDP,但是它有什麼關係。你甚至可以使用asyncore來幫助你提高效率。但是,你選擇了低級別。我希望您必須知道如何手動讀取數據包標題,即您將需要TCP&UDP規格和附加設備協議。然後使用結構模塊提取元數據和內容。但首先我建議你去看看OpenVPN如何操作。 – Dalen

+0

爲結構使用新波士頓有一個很好的指導。如果struct版本不起作用,我會使用promisc模式。謝謝:-) –