私は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の両方がそのメッセージと応答をキャプチャ、スクリーンショットを参照してください。
動作中のトンネルの他のバージョンでは、Python 3では、デバイスのメッセージしか受信しません。 Wiresharkによると、画像を見ると、このメッセージは同じ(ペイロードとチェックサムには耐えない)と同じですが、私のスクリプトはそれに応答しません。
私はなぜそうなのか、総損失でいます。古いトンネルと新しいトンネルの両方がかなり大きなコードであるため、潜在的に関連する部分をここに配置することは困難です。デバッガを使用して、デバイスからメッセージを受け取ったときに両方が次のことを行ったことを確認できました。その後、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を実行してトンネルが似ているかどうかを確認します。一番上は旧トンネル、一番下は新トンネルです。
編集: 私はまた、新しいトンネルを使用したときに、古いトンネルとなしトラフィックを使用した場合のwiresharkの「any'-インタフェースは/からのトラフィックに捉えていることに気づいています。 from/toトラフィックには、anyインターフェイスでキャプチャされたときに追加のlinux cookedキャプチャヘッダーがあります。これが関連しているかどうかは分かりません。