Python3脚本:虽然Wireshark检测到数据包

时间:2017-07-18 09:17:37

标签: python networking

我正在使用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都捕获其消息和响应,请参见屏幕截图。 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的任何接口都会从流量中捕获流量,而在使用新隧道时,流量会从流量中捕获。 来自/到流量的流量在由任何' -interface捕获时具有额外的linux熟捕获标头。不知道这是否相关。

1 个答案:

答案 0 :(得分:0)

我找到了答案。 问题不在于隧道,而在于如何将数据包写入隧道。

在将数据包写入隧道之前,我应该添加或不需要隧道头。