我正在使用Python实现隧道程序。 我正在使用定期发送消息的设备测试此程序,并期望从我的笔记本电脑上运行的Python脚本回复。 Python脚本如下:
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
我在Python 2中有一个工作隧道版本。通过此隧道,设备正确发送到我的笔记本电脑,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的任何接口都会从流量中捕获流量,而在使用新隧道时,无流量会从流量中捕获。 来自/到流量的流量在由任何' -interface捕获时具有额外的linux熟捕获标头。不知道这是否相关。
答案 0 :(得分:0)
我找到了答案。 问题不在于隧道,而在于如何将数据包写入隧道。
在将数据包写入隧道之前,我应该添加或不需要隧道头。