Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Need help for troubleshooting traceroute in Unix

I have a traceroute Python program for a Unix system that prints out the path the packets take to get from the local machine to a destination — that is, the sequence of routers that the packets go through. The problem is I get an output which displays:

traceroute to yahoo.co.in (68.180.206.184), 30 hops max, 60 byte packets

 1  * * *
 2  * * *
 3  * * *
 4  * * *
 5  * * *
 6  * * *
 7  * * *
 8  * * *
 9  * * *
 .
 .
 .
 30  * * *

I have a DSL connection. The program works great with the Windows command-line (cmd.exe). What is the exact reason for the above output?

The code looks like this:

#!/usr/bin/python
import socket
def main(dest_name):
    dest_addr = socket.gethostbyname(dest_name)
    port = 33434
    max_hops = 30
    icmp = socket.getprotobyname('icmp')
    udp = socket.getprotobyname('udp')
    ttl = 1
    while True:
        recv_socket = socket.socket(socket.AF_INET, socket.SOCK_RAW, icmp)
        send_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, udp)
        send_socket.setsockopt(socket.SOL_IP, socket.IP_TTL, ttl)
        recv_socket.bind(("", port))
        send_socket.sendto("", (dest_name, port))
        curr_addr = None
        curr_name = None
        try:
            _, curr_addr = recv_socket.recvfrom(512)
            curr_addr = curr_addr[0]
            try:
                curr_name = socket.gethostbyaddr(curr_addr)[0]
            except socket.error:
                curr_name = curr_addr
        except socket.error:
            pass
        finally:
            send_socket.close()
            recv_socket.close()
        if curr_addr is not None:
            curr_host = "%s (%s)" % (curr_name, curr_addr)
        else:
            curr_host = "*"
        print "%d\t%s" % (ttl, curr_host)
        ttl += 1
        if curr_addr == dest_addr or ttl > max_hops:
            break
if __name__ == "__main__":
    main('yahoo.co.in')**
like image 963
minnie Avatar asked Dec 28 '25 01:12

minnie


1 Answers

traceroute/tracert act differently on Linux and Windows.

Linux will send a UDP packet with a decreasing TTL and listen for ICMP responses. Windows sends ICMP echo requests and listens for ICMP responses.

The Python version is failing because the UDP packets are being blocked.

On Unix-like operating systems, the traceroute utility by default uses User Datagram Protocol (UDP) datagrams with destination port numbers from 33434 to 33534. The traceroute utility usually has an option to specify use of ICMP echo request (type 8) instead, as used by the Windows tracert utility.

http://en.wikipedia.org/wiki/Traceroute

like image 183
Mike Ryan Avatar answered Dec 30 '25 14:12

Mike Ryan



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!