2017-07-18 15 views
0

私はPythonでトンネルプログラムを実装しようとしています。 私は定期的にメッセージを送信し、私のラップトップで実行されているPythonスクリプトからの返信を期待するデバイスでこのプログラムをテストしています。次のように ザ・Pythonスクリプトは次のとおりです。私はこのトンネルではPython 2の作業トンネルのバージョンを持っているPython3スクリプト:Wiresharkがパケットを検出してもトンネルが動作しない

from socket import socket, AF_INET6, SOCK_DGRAM 

# receiving 
UDP_in_IP = "::" 
UDP_in_PORT = 61624 

sock_in = socket(AF_INET6, # Internet 
         SOCK_DGRAM) # UDP 
sock_in.bind((UDP_in_IP, UDP_in_PORT)) 

# forwarding 
UDP_out_PORT = 61624 

sock_out = socket(AF_INET6, # Internet 
         SOCK_DGRAM) # UDP 
numb = 0 
while True: 
    data, addr = sock_in.recvfrom(1024) # buffer size is 1024 bytes 
    my_bytes = bytearray() 
    my_bytes.append(numb) 
    my_bytes.append(69 & 0xff) 
    my_bytes.append(69 >> 8) 
    reply = my_bytes 
    sock_out.sendto(reply, (addr[0], UDP_out_PORT)) 
    print("forwarding message:", reply, addr) 
    numb = numb +1 

、デバイスが正しく私のラップトップに送信し、Wiresharkの両方がそのメッセージと応答をキャプチャ、スクリーンショットを参照してください。 enter image description here

動作中のトンネルの他のバージョンでは、Python 3では、デバイスのメッセージしか受信しません。 Wiresharkによると、画像を見ると、このメッセージは同じ(ペイロードとチェックサムには耐えない)と同じですが、私のスクリプトはそれに応答しません。

enter image description here

私はなぜそうなのか、総損失でいます。古いトンネルと新しいトンネルの両方がかなり大きなコードであるため、潜在的に関連する部分をここに配置することは困難です。デバッガを使用して、デバイスからメッセージを受け取ったときに両方が次のことを行ったことを確認できました。その後、Wiresharkがデバイスメッセージを取得します。古いトンネルで

、Pythonの2:新しいトンネルで

def send(self,data): 
    self.log.debug('Sent to network') 
    string = chr(0)+chr(0)+chr(134)+chr(221)+data 
    os.write(self.virtualIf,chr(0)+chr(0)+chr(134)+chr(221)+data) 

、Pythonの3:

def send(self,data): 
    # add 4B tun header 
    formatted_data = bytes(chr(134)+chr(221), encoding='utf-8') + data 
    print('[NetworkSideThread] Sent packet to network \n') 

    os.write(self.virtualIf, formatted_data) 

誤って何が起こっているかを任意の手がかり?

編集:補遺、ifconfigを実行してトンネルが似ているかどうかを確認します。一番上は旧トンネル、一番下は新トンネルです。

enter image description here

編集: 私はまた、新しいトンネルを使用したときに、古いトンネルとなしトラフィックを使用した場合のwiresharkの「any'-インタフェースは/からのトラフィックに捉えていることに気づいています。 from/toトラフィックには、anyインターフェイスでキャプチャされたときに追加のlinux cookedキャプチャヘッダーがあります。これが関連しているかどうかは分かりません。

答えて

0

答えが見つかりました。 問題はトンネルではなく、パケットがどのようにトンネルに書き込まれたかで問題になりました。

パケットをトンネルに書き込む前に、トンネルヘッダーを追加する必要があります(必須ではありません)。

関連する問題