IP-Trace mit Python?

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
genrich
User
Beiträge: 91
Registriert: Sonntag 27. Juni 2004, 17:46

Donnerstag 12. August 2004, 20:20

Ich hab zwar gesucht, aber nichts passendes gefunden...

Ist ein IP-Trace per Python.cgi möglich? Oder nur unter richtig viel Aufwand?

Da fällt mir gerade ein, man könnte natürlich versuchen online die ApacheLogFiles zu durchsuchen... Aber das wird viel frickelei, schätze ich...
s. Scratchy is an Apache Web Server log parser and HTML report generator written in Python: http://scratchy.sourceforge.net
fs111
User
Beiträge: 170
Registriert: Samstag 15. November 2003, 11:42
Kontaktdaten:

Donnerstag 12. August 2004, 23:47

Was genau stellst Du Dir denn vor? Die Remote-Adresse bekommst Du ja via cgi. Mit der könntest Du dann ja traceroute starten, und dessen Ausgabe zum Browser umleiten, oder stellst Du Dir etwas ganz anderes vor?

fs111
Pydoc-Integration in vim - Feedback willkommen: http://www.vim.org/scripts/script.php?script_id=910
genrich
User
Beiträge: 91
Registriert: Sonntag 27. Juni 2004, 17:46

Freitag 13. August 2004, 07:26

Genau das will ich machen, einen Traceroute.
Aber das muß in Python geschehen, denn ich hab leider keine Möglichkeiten Programme auf der Shell zu starten :(
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

Freitag 13. August 2004, 08:19

Hi. Wesentlich leiter hättest du es dann aber, du müsstest schließlich nur die ausgabe umleiten:

Code: Alles auswählen

import os
ci,co,ce=os.popen3("tracert www.yahoo.de")
ci.close()
e=ce.read()
if not e:
    print co.read()
else:
    print e
ce.close()
co.close()
So musst du es allerdings schaffen, ICMP Pakete mit einer variablen TTL zu versenden. Ein ICMP Paket wird in seinem TTL Wert von jedem Host um eins verringert und wenn es gleich 0 ist wird es gelöscht. Damit kannst du "messen" (das Grundprinzip von traceroute). Schau dir mal dieses PDF an, da hab ich was hübsches drin gesehen. Vielleicht bekommst du es damit hin. Ebenfalls interessant wäre vielleicht pycap.
Zuletzt geändert von Milan am Freitag 13. August 2004, 09:20, insgesamt 1-mal geändert.
joerg
User
Beiträge: 188
Registriert: Samstag 17. August 2002, 17:48
Wohnort: Berlin
Kontaktdaten:

Freitag 13. August 2004, 09:06

Hallo genrich,

schon mal nach 'traceroute.py' gegoogelt? Bei mir klappt's! ;-)

Gruß!
Jörg
"Sie sind nicht berechtigt, unrechtmäßige Kopien dieses Datenträgers zu erstellen." - Microsoft-Weisheit auf einer CD von MS-VisualC++-6.0
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

Freitag 13. August 2004, 09:28

Hi ein wenig buggy, wenn die Pakete mal ne andere Strecke nehmen :wink: und der TTL-Wert dadurch anders fällt:

Code: Alles auswählen

>>> traceroute("www.wikipedia.de")
Tracing route to 207.142.131.236 (www.wikipedia.de)
 1    2.1     1.8     1.8  192.168.6.1      
 2   63.5    61.8    62.4  217.5.98.77      
 3   59.5    59.0    33.1  216.109.118.73   p10.www.dcn.yahoo.com
 4  146.4   147.1   147.5  62.154.14.53     nyc-e5.NYC.US.net.DTAG.DE
 5  145.6   147.5   146.6  65.59.192.5      
 6  147.1   147.4   146.6  64.159.1.181     ge-0-3-0.bbr1.NewYork1.Level3.net
 7  163.1    15.5   163.3  209.247.11.198   as-0-0.mp2.Tampa1.Level3.net
 8  185.0   186.8   187.1  209.247.11.218   ge-9-1.hsa1.Tampa1.Level3.net
 9  186.4   187.1   186.4  63.208.0.94      unknown.Level3.net
10        *   100.4         *  216.109.118.73   p10.www.dcn.yahoo.com
11  163.9         *   183.8  216.109.118.73   p10.www.dcn.yahoo.com
12        *   168.8         *  216.109.118.73   p10.www.dcn.yahoo.com
13  165.8         *   169.8  216.109.118.73   p10.www.dcn.yahoo.com
14        *   166.1         *  216.109.118.73   p10.www.dcn.yahoo.com
15  166.2   583.1   395.8  216.109.118.73   p10.www.dcn.yahoo.com
16  633.9    55.5    62.8  217.5.98.77      
17  681.0         *   182.1  216.109.118.73   p10.www.dcn.yahoo.com
18        *   170.6         *  216.109.118.73   p10.www.dcn.yahoo.com
19  139.1    12.9         *  216.109.118.73   p10.www.dcn.yahoo.com
20  167.2   181.5   194.9  209.247.11.198   as-0-0.mp2.Tampa1.Level3.net
21  585.8   362.9   181.7  209.247.11.218   ge-9-1.hsa1.Tampa1.Level3.net
22  159.8   256.6   726.3  63.208.0.94      unknown.Level3.net
23  159.3    74.8   100.5  63.208.0.94      unknown.Level3.net
24        *    50.7         *  216.109.118.73   p10.www.dcn.yahoo.com
25  164.0         *   171.6  216.109.118.73   p10.www.dcn.yahoo.com
26        *   170.1         *  216.109.118.73   p10.www.dcn.yahoo.com
27  155.2         *   180.7  216.109.118.73   p10.www.dcn.yahoo.com
28        *   171.8         *  216.109.118.73   p10.www.dcn.yahoo.com
29  168.1         *   180.0  216.109.118.73   p10.www.dcn.yahoo.com
30        *   165.4         *  216.109.118.73   p10.www.dcn.yahoo.com
Ich würde das unbedingt umbauen, sodass gespeichert wird, wo das Paket schon war. Außerdem würde ich die Ausgabe rausnehmen und extra machen, ein Iterator über die Routenabschnitte wäre nicht schlecht. Ich mach mich nachher mal ans werkeln...
genrich
User
Beiträge: 91
Registriert: Sonntag 27. Juni 2004, 17:46

Freitag 13. August 2004, 12:26

joerg hat geschrieben: schon mal nach 'traceroute.py' gegoogelt? Bei mir klappt's! ;-)
Verdammt ich hab immer nach "Python traceroute" u.ä. gesucht...

Thx...


Doch es funktioniert auf dem Server nicht, Traceback:

Code: Alles auswählen

    s2 = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_ICMP)
socket.error: (1, 'Operation not permitted')
Kann ich davon ausgehen, das es gesperrt wurde, oder das tryceroute.py nicht richtig funktioniert?

Etwas stutzig machen mich die Zeile mit "if sys.platform in ['win32']:"

Code: Alles auswählen

            s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
            if sys.platform in ["win32"]:
                s.setsockopt(socket.SOL_SOCKET, socket.SO_RCVTIMEO, 300)
            s.setsockopt(socket.SOL_IP, socket.IP_TTL, ttl)

            s2 = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_ICMP)
            s2.bind(('',qport))
            if sys.platform in ["win32"]:
                s2.setsockopt(socket.SOL_SOCKET, socket.SO_RCVTIMEO, 300)
(Vollständige Listing unter http://mail.python.org/pipermail/python ... 54753.html )




In einer Antwort ( http://mail.python.org/pipermail/python ... 54755.html ) steht das man bei Linux Root rechte benötigt um einen solchen socket zu öffnen.... Scheiße...
genrich
User
Beiträge: 91
Registriert: Sonntag 27. Juni 2004, 17:46

Freitag 13. August 2004, 12:38

Ha! :lol:

Was ich suchte hab ich durch das Skript doch herrausgefunden... Und es ist wieder so einfach :oops:

Code: Alles auswählen

import os,socket
REMOTE_ADDR     =os.environ["REMOTE_ADDR"]
print REMOTE_ADDR," - ",socket.gethostbyaddr(REMOTE_ADDR)
Das war die Information die ich eigentlich haben wollte und das klappt auch auf dem Server! :D
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

Freitag 13. August 2004, 12:52

Um den Domainnamen rauszubekommen würde ich lieber socket.getfqdn nehmen, das ist besser... Versuch mal folgende IP auflösen zu lassen "217.5.98.77" :wink: Aber ansonsten frag mal besser beim nächsten mal direkt, auch wenn man hier über traceroute einiges mehr lernt. :lol: :lol:
genrich
User
Beiträge: 91
Registriert: Sonntag 27. Juni 2004, 17:46

Freitag 13. August 2004, 13:42

Hm!

Mit socket.getfqdn() erhalte ich die IP-Adresse zurück und mit socket.gethostbyaddr() erhalte ich ein "socket.herror: (11004, 'host not found')"

Liefert getfqdn() automatich einfach die IP-Adresse zurück, statt eines Fehlers? Also im Prinzip das selbe, wenn man den Fehler bei gethostbyaddr() abfangen würde? Oder steckt da mehr hinter?

Und vorallem, warum ist das bei dieser IP-Adresse?
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

Freitag 13. August 2004, 15:20

Hi. Die Docu dazu sollte eigentlich alles sagen:
getfqdn([name])
Return a fully qualified domain name for name. If name is omitted or empty, it is interpreted as the local host. To find the fully qualified name, the hostname returned by gethostbyaddr() is checked, then aliases for the host, if available. The first name which includes a period is selected. In case no fully qualified domain name is available, the hostname is returned. New in version 2.0.
Versucht einen Hostnamen zu name (als name oder Adresse) zu finden und gibt bei Misserfolg name selbst zurück. Es gibt IP-Adressen, die haben keinen Domainnamen, den man per DNS erfragen könnte. So zum Beispiel mein Router (intern) oder der obige Server von T-Online. Das heißt aber nicht, dass es solche Adressen nicht gibt, sonst könnte ich z.B. nicht im Internet surfen. gethostbyaddr geht aber davon aus, dass es einen Domainname gibt und gibt deswegen eine Fehler, wenn das nicht der Fall ist. Schau dir dazu ruhig den Quellcode von getfqdn an :wink: .
Antworten