2017-10-08 12 views
2

私は、Pythonでトンネリングプロトコルを作成しようとしています。私はtunインターフェイスのセットアップを持って、それを通してすべてのトラフィックをルーティングします。 しかし、プログラムのtunインターフェイスにリダイレクトされているパケットを暗号化してサーバーに送信するにはどうすればよいですか? 私が見たところでは、socket.bind()またはsocket.setsockopt()関数のいずれかです。 これは私が今のところ使用したコードの私のインターフェイスのセットアップネットワークインタフェースからのパケットを読み込み、処理するために

そして、これです:

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

私が通過するすべてのパケットをリッスンできるように、私は、プロミスキャスモードにTUNインターフェイスを置きます。

それは以下のSOポストに提示されて行う方法について

良いスタート:

Python Sockets: Enabling Promiscuous Mode in Linux

その他のオプションはで書かれたネットワーク・インタフェースへの低レベルアクセスしたり、仮想ネットワークカードのドライバになりますPython。

+0

promiscuousモードではないかもしれませんが、私のtun0インターフェイスはポイントツーポイント設定です。私の質問をもう一度見てください。詳細を追加しました。 –

+0

どうしてですか?無差別モードのソケットとs.readfrom()を使用すると、パケットを取得し、それが誰から来たのかを知ることができます。 2つのスニッファ、1つはTCPと1つの捕捉UDPを持っていなければなりませんが、それは重要です。あなたは効率を助けるためにasyncoreを使用することもできます。しかし、OK、あなたは低レベルを選択しました。手動でパケットヘッダーを読み取る方法、つまりTCP&UDP仕様と追加のデバイスプロトコルが必要になることを知っておく必要があります。次に、structモジュールを使用してメタデータとコンテンツを抽出します。しかし、まずOpenVPNがどのようにそのトリックをするのか見てみることをお勧めします。構造体の使用のために – Dalen

+0

thenewbostonには非常に良いガイドがあります。構造体のバージョンが機能しない場合、私はプロミスモードを使用します。ありがとうございます:-) –

関連する問題