Seite 1 von 1

IP-Trace mit Python?

Verfasst: Donnerstag 12. August 2004, 20:20
von genrich
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

Verfasst: Donnerstag 12. August 2004, 23:47
von fs111
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

Verfasst: Freitag 13. August 2004, 07:26
von genrich
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 :(

Verfasst: Freitag 13. August 2004, 08:19
von Milan
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.

Verfasst: Freitag 13. August 2004, 09:06
von joerg
Hallo genrich,

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

Gruß!
Jörg

Verfasst: Freitag 13. August 2004, 09:28
von Milan
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...

Verfasst: Freitag 13. August 2004, 12:26
von genrich
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...

Verfasst: Freitag 13. August 2004, 12:38
von genrich
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

Verfasst: Freitag 13. August 2004, 12:52
von Milan
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:

Verfasst: Freitag 13. August 2004, 13:42
von genrich
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?

Verfasst: Freitag 13. August 2004, 15:20
von Milan
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: .