我需要從我的python腳本發送一個數據包。 我有一個目標IP地址。 我需要:
- 這通常是默認的路由出口接口名(我需要它嗅探響應)
- IP地址的接口(我需要使用它在我的應用有效載荷)
python:如何檢查出口接口
如何我從python做到這一點?
感謝,
我需要從我的python腳本發送一個數據包。 我有一個目標IP地址。 我需要:
- 這通常是默認的路由出口接口名(我需要它嗅探響應)
- IP地址的接口(我需要使用它在我的應用有效載荷)
python:如何檢查出口接口
如何我從python做到這一點?
感謝,
Pynetinfo似乎是你最好的選擇。這是我機器上的一個小樣本。你的結果會有所不同,但你當然會有一個默認網關。
>>> import netinfo
>>> netinfo.get_routes()
({'dest': '0.0.0.0', 'netmask': '0.0.0.0', 'gateway': '192.168.0.1', 'dev': 'wlan1'},
{'dest': '169.254.0.0', 'netmask': '255.255.0.0', 'gateway': '0.0.0.0', 'dev': 'wlan1'},
{'dest': '192.168.0.0', 'netmask': '255.255.255.0', 'gateway': '0.0.0.0', 'dev': 'wlan1'})
>>> default_gateway =
...[route for route in netinfo.get_routes() if route['dest'] == '0.0.0.0'][0]
>>> default_gateway['gateway']
'192.168.0.1'
>>> default_gateway['dev']
'wlan1'
至於獲得該接口的IP地址...
>>> import netifaces
>>> netifaces.ifaddresses(default_gateway['dev'])[netifaces.AF_INET]
[{'broadcast': '192.168.0.255', 'netmask': '255.255.255.0', 'addr': '192.168.0.9'}]
爲了得到一個IP數據包將與給定目標使用,我的Linux系統上的接口。我不確定另一種方式。
>>> dst = "127.0.0.1"
>>> p = subprocess.Popen(["ip", "route", "get", dst], stdout=subprocess.PIPE)
>>> p.stdout.read()
'local 127.0.0.1 dev lo src 127.0.0.1 \n cache <local> \n'
謝謝,看起來不錯,但我有很多路由表中的條目(因爲許多接口和動態路由)。默認路線不會總是被選中。你知道任何方法來輕鬆地執行路由查找選擇正確的路由條目/接口嗎? (我知道目標IP,需要找到最好/最具體的匹配項) – user2913139
增加了兩段代碼。讓我知道你的想法。 – RyPeck
RyPeck - 你是我的男人:)謝謝 - 它解決了我所有的問題:) – user2913139
我知道scapy的conf.route - 但我需要很多代碼才能找出使用哪一個。我希望重用已經存在的代碼(可能在scapy中)。 – user2913139
LOL出口 - 是那些非母語英語人士將永遠不會谷歌:) – Bohdan