tMC tMC - 4 months ago 20
Linux Question

Python Linux route table lookup

I posted Python find first network hop about trying to find the first hop and the more I thought about it, the easier it seemed like it would be a process the routing table in python. I'm not a programmer, I don't know what I'm doing. :p

This is what I came up with, the first issue I noticed is the loopback interface doesn't show up in the /proc/net/route file- so evaluating will give you the default route... for my application, that doesn't matter.

Anything else major I'm overlooking? Is parsing

ip route get <ip>
still a better idea?

import re
import struct
import socket

Read all the routes into a list. Most specific first.
# eth0 000219AC 04001EAC 0003 0 0 0 00FFFFFF ...
def _RtTable():
_rt = []
rt_m = re.compile('^[a-z0-9]*\W([0-9A-F]{8})\W([0-9A-F]{8})[\W0-9]*([0-9A-F]{8})')
rt = open('/proc/net/route', 'r')
for line in'\n'):
if rt_m.match(line):

return _rt

Create a temp ip (tip) that is the entered ip with the host
section striped off. Matching to routers in order,
the first match should be the most specific.

If we get as the next hop, the network is likely(?)
directly attached- the entered IP is the next (only) hop
def FindGw(ip):
int_ip = struct.unpack("I", socket.inet_aton(ip))[0]
for entry in _RtTable():
tip = int_ip & int(entry[2], 16)
if tip == int(entry[0], 16):
gw_s = socket.inet_ntoa(struct.pack("I", int(entry[1], 16)))
if gw_s == '':
return ip
return gw_s

if __name__ == '__main__':
import sys
print FindGw(sys.argv[1])


In the man page of proc file system it is given that.

          various net pseudo-files, all of which give the status of some part of
          the networking layer.  These files contain ASCII structures and  are,
          thereā€fore, readable with cat(1).
          However, the standard netstat(8) suite provides much 
          cleaner access to these files.

Just rely on the tools designed for those purposes. Use netstat, traceroute or any other standard tool. Wrap those commands cleanly using subprocess module and get the information for what you are looking for.