Traceroute-套接字有时会失败

时间:2018-12-06 20:32:40

标签: python python-3.x sockets traceroute

我正在用Python3编写traceroute作为练习。它工作得很好,但是跟踪有时会无法从某个跃点接收到应答,并且无法在没有得到响应的情况下继续增加TTL。常规的Linux traceroute程序不会遇到此问题,因此它必须在我的代码中。

我尝试了不同的变体,但是它们都遇到相同的问题。我将在8.8.8.8上运行跟踪,并在5次中运行4次,它运行良好。

我尝试使用上下文管理器(套接字为...)创建套接字,也尝试手动创建套接字。

import os
import random
import socket
import sys
import time

class Traceroute:
def __init__(self, dest, maxhops=30, port=random.randrange(33434,33534), host=''):
    self.dest = dest
    self.maxhops = maxhops
    self.port = port
    self.host = host
    self.hops = []

# Function for creating new sockets
def get_socket(self,type,proto=0):
    s = socket.socket(
        family=socket.AF_INET,
        type=type,
        proto=proto
    )
    s.bind((self.host,self.port))
    return s

# Do the trace and store hop information for later use
def get_path(self):
    try:
        self.dest_ip = socket.gethostbyname(self.dest)
        self.dest_name = socket.gethostbyaddr(self.dest)[0]
    except socket.gaierror as e:
        print(f'Error: {self.dest} - {e}')

    address = ['']
    ttl = 1
    while ttl < self.maxhops +1 and address[0] != self.dest_ip:
            receiver_socket = self.get_socket(socket.SOCK_RAW,socket.getprotobyname('icmp'))
            receiver_socket.settimeout(2)
            sender_socket = self.get_socket(socket.SOCK_DGRAM,socket.getprotobyname('udp'))
            sender_socket.setsockopt(socket.SOL_IP,socket.IP_TTL,ttl)
            sender_socket.sendto(b'',(self.dest_ip,self.port))
            tries = 3
            while tries > 0:
                starttime = time.time()
                try:
                    data, address = receiver_socket.recvfrom(1024)
                    latency = [round((time.time()-starttime)*1000,2)]
                    try:
                        hostname = socket.gethostbyaddr(address[0])[0]
                    except socket.herror as e:
                        hostname = address[0]
                    self.hops.append({
                        'address':address[0],
                        'hostname':hostname,
                        'latency': latency
                    })
                    tries = 0
                except socket.error:
                    tries -= 1
                    if tries == 0:
                        self.hops.append({
                            'address':None,
                            'hostname':ttl,
                            'latency':None
                            })
                finally:
                    receiver_socket.close()
                    sender_socket.close()
            ttl += 1
            os.system('clear')
            self.draw()

def draw(self):
    name = f'{self.dest_ip} - {self.dest_name}' if self.dest_name != self.dest_ip else self.dest_ip
    print(f'Traceroute to {name}')
    # Print the full hop list, for debugging
    for hop in self.hops:
        print(hop)
    # Print the hops in a readable fashion
    for hop in self.hops:
        if hop['address'] is None:
            print(f"{self.hops.index(hop)+1} - {'*':<50} - {'*':<50} - {'*':<50}")
        else:
            latencylen = len(hop['latency'])
            latencyavg = str(round(sum(hop['latency'])/latencylen,2)) + 'ms'
            name = f'{hop["address"]} - {hop["hostname"]}' if hop['address'] != hop['hostname'] else hop['address']
            print(f'{self.hops.index(hop)+1} - {name:<50} - {latencyavg:<50} - LEN:{latencylen:<50}')

def main():
if len(sys.argv) < 2:
    print('Please enter a destination')
else:
    trace = Traceroute(sys.argv[1])
    trace.get_path()

if __name__ == '__main__':
main()

这是完全错误的输出:

self.hops是词典列表。

{brackets}中的内容是跳字典本身。我添加它用于调试。 请注意,跃点2和3相同。因此,踪迹不知何故遇到了此跃点两次。该行开头的数字是列表索引,它也表示TTL。我通常会在第9跳之前达到8.8.8.8,但在这种情况下,它会一直保持下去,将TTL递增直到达到最大值。

Traceroute to 8.8.8.8 - google-public-dns-a.google.com
{'address': '192.168.1.1', 'hostname': '_gateway', 'latency': [8.21]}
{'address': '104.195.128.122', 'hostname': '104-195-128-122.cpe.teksavvy.com', 'latency': [1572.38]}
{'address': '104.195.128.122', 'hostname': '104-195-128-122.cpe.teksavvy.com', 'latency': [15.97]}
{'address': '104.195.129.9', 'hostname': '104-195-129-9.cpe.teksavvy.com', 'latency': [27.22]}
{'address': '206.248.155.92', 'hostname': 'ae10-0-bdr01-tor2.teksavvy.com', 'latency': [20.05]}
{'address': '206.248.155.10', 'hostname': 'ae12-0-bdr01-tor.teksavvy.com', 'latency': [27.2]}
{'address': None, 'hostname': 7, 'latency': None}
{'address': None, 'hostname': 8, 'latency': None}
{'address': None, 'hostname': 9, 'latency': None}
{'address': None, 'hostname': 10, 'latency': None}
{'address': None, 'hostname': 11, 'latency': None}
{'address': None, 'hostname': 12, 'latency': None}
{'address': None, 'hostname': 13, 'latency': None}
{'address': None, 'hostname': 14, 'latency': None}
{'address': None, 'hostname': 15, 'latency': None}
1 - 192.168.1.1 - _gateway                             - 8.21ms                                             - LEN:1                                                 
2 - 104.195.128.122 - 104-195-128-122.cpe.teksavvy.com - 1572.38ms                                          - LEN:1                                                 
3 - 104.195.128.122 - 104-195-128-122.cpe.teksavvy.com - 15.97ms                                            - LEN:1                                                 
4 - 104.195.129.9 - 104-195-129-9.cpe.teksavvy.com     - 27.22ms                                            - LEN:1                                                 
5 - 206.248.155.92 - ae10-0-bdr01-tor2.teksavvy.com    - 20.05ms                                            - LEN:1                                                 
6 - 206.248.155.10 - ae12-0-bdr01-tor.teksavvy.com     - 27.2ms                                             - LEN:1                                                 
7 - *                                                  - *                                                  - *                                                 
8 - *                                                  - *                                                  - *                                                 
9 - *                                                  - *                                                  - *                                                 
10 - *                                                  - *                                                  - *                                                 
11 - *                                                  - *                                                  - *                                                 
12 - *                                                  - *                                                  - *                                                 
13 - *                                                  - *                                                  - *                                                 
14 - *                                                  - *                                                  - *                                                 
15 - *                                                  - *                                                  - *            

谢谢

0 个答案:

没有答案