Python 3 - IP Adressen

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Hallo,

    Ich möchte ein kleines Projekt umsetzen. Dazu benötige ich die Angaben folgender 3 Adressen.
    - eigene IP Adresse des Raspi,
    - IP Adresse des WLAN- AP = Router
    - externe IP Adresse, vom Internet Provider zugewiesen.

    Wie kann ich mit Python3 unter Bullseye dieser Adressen am einfachsten Ermitteln ?

    Danke

    es grüßt
    Andre

  • ... folgender 3 Adressen.
    - eigene IP Adresse des Raspi,
    - IP Adresse des WLAN- AP = Router
    - externe IP Adresse, vom Internet Provider zugewiesen.

    "Ohne Vorbereitung", mit Z. B.:

    Code
    >>> socket.gethostbyname(socket.getfqdn())
    >>> os.system("ip route | grep default | sed -r 's/\s+/ /g' | cut -f 3 -d ' '")
    >>> os.system("dig +short myip.opendns.com @208.67.222.222")

    The most popular websites without IPv6 in Germany.  IPv6-Ausreden

    Meine PIs

    PI4B/8GB (border device) OpenBSD 7.4 (64bit): SSH-Server, WireGuard-Server, ircd-hybrid-Server, stunnel-Proxy, Mumble-Server

    PI3B+ FreeBSD 14.0-R-p3 (arm64): SSH-Serv., WireGuard-Serv., ircd-hybrid-Serv., stunnel-Proxy, Mumble-Serv., ddclient

    PI4B/4GB Bullseye-lite (64bit; modifiziert): SSH-Server, WireGuard-Server, ircd-hybrid-Server, stunnel-Proxy, Mumble-Server, botamusique, ample

  • Hallo rpi444

    Danke für deine Ausführung.
    - mit der ersten Zeile deines Codes erhalte ich 127.0.0.1 aber keine IP Adresse des WLAN Interfaces.
    - die zweite Zeile funktionert soweit

    - die dritte Zeile liefert den Fehler

    Code
    sh: 1: dig: not found

    Mache ich ich jetzt etwas grundsätzlich verkehrt, oder muss ich noch irgendwelche Zusatzpakete installieren ?

    Danke

    es grüßt
    Andre

  • - mit der ersten Zeile deines Codes erhalte ich 127.0.0.1 aber keine IP Adresse des WLAN Interfaces.

    Evtl. hast Du keine gut funktionierende _lokale_ Namensauflösung (DNS). Wie sind die Ausgaben von:

    Code
    hostname -i
    hostname -I
    cat /etc/hosts
    cat /etc/nsswitch.conf

    ?

    ..., oder muss ich noch irgendwelche Zusatzpakete installieren ?

    Ja, z. B. dnsutils.

    Oder ein anderes/gleichwertiges dns-tool (mit seiner eigenen Syntax) benutzen.

    The most popular websites without IPv6 in Germany.  IPv6-Ausreden

    Meine PIs

    PI4B/8GB (border device) OpenBSD 7.4 (64bit): SSH-Server, WireGuard-Server, ircd-hybrid-Server, stunnel-Proxy, Mumble-Server

    PI3B+ FreeBSD 14.0-R-p3 (arm64): SSH-Serv., WireGuard-Serv., ircd-hybrid-Serv., stunnel-Proxy, Mumble-Serv., ddclient

    PI4B/4GB Bullseye-lite (64bit; modifiziert): SSH-Server, WireGuard-Server, ircd-hybrid-Server, stunnel-Proxy, Mumble-Server, botamusique, ample

  • AndrePi Mit dem `psutil`-Modul kann man sich mit der `net_if_addrs()`-Funktion die Interfaces und IPs geben lassen. "Die" IP gibt es so ja nicht, der Pi hat von Haus aus ja schon WLAN und Ethernet und heute gibt es in der Regel eine IPv4 und eine IPv6 IP pro Interface.

    Dir externe IP kann man in der Regel auch vom Router abfragen, dann ist man nicht auf externe Webseiten angewiesen.

    “Dawn, n.: The time when men of reason go to bed.” — Ambrose Bierce, “The Devil's Dictionary”

  • Dir externe IP kann man in der Regel auch vom Router abfragen, dann ist man nicht auf externe Webseiten angewiesen.

    Nicht wenn CGNAT ins Spiel kommt, leider.

    Code
    router:~$ ip -4 a s dev eth1
    3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000
        inet 100.119.129.33/16 brd 100.119.255.255 scope global eth1
           valid_lft forever preferred_lft forever
    
    router:~$ dig +short myip.opendns.com @208.67.222.222
    94.31.XX.YY

    Wenn du nichts zu sagen hast, sag einfach nichts.

    Einmal editiert, zuletzt von llutz (9. März 2023 um 14:06)

  • Hallo __blackjack__

    Danke. Mit der vor dir gennanten Funktion bekomme ich ein DICT geliefert. Schön und gut. Ich habe wirlich noch keine Ahnung wie ich damit an die IP Adresse das WLAN Interfaces komme. Könntest du mir bitte auf die Sprünge helfen ?

    Wie darf ich deine ergänzende Antwort verstehen ? Dazu müsste man doch wissen, welcher Router mit welchen Zugangsdaten sich am jeweiligen Standort befinden ? Oder habe ich hier auch schon wieder eine falsche Vorstellung ?

    es grüßt
    Andre

  • Jetzt mir der Nachinstallation von "dnsutils" erhalte ich mit dem dritten OS.SYSTEM Befehl eine Ausgabe.

    BTW: Evtl. kannst Du mit dig und hostname, auch die interne IPv4-Adresse bekommen (... wenn der DNS-Server vom Router/"default gateway" das _lokale_ (r)DNS macht). Z. B.:

    Code
    >>> os.system("dig -4 +short $(hostname) @$(ip route | grep default | sed -r 's/\s+/ /g' | cut -f 3 -d ' ')")
    192.168.178.13
    0

    EDIT: Das mit os.system ist aber keine "native" python-Vorgehensweise. D. h. die python-Experten können/werden dir was "Besseres" zeigen können.

    The most popular websites without IPv6 in Germany.  IPv6-Ausreden

    Meine PIs

    PI4B/8GB (border device) OpenBSD 7.4 (64bit): SSH-Server, WireGuard-Server, ircd-hybrid-Server, stunnel-Proxy, Mumble-Server

    PI3B+ FreeBSD 14.0-R-p3 (arm64): SSH-Serv., WireGuard-Serv., ircd-hybrid-Serv., stunnel-Proxy, Mumble-Serv., ddclient

    PI4B/4GB Bullseye-lite (64bit; modifiziert): SSH-Server, WireGuard-Server, ircd-hybrid-Server, stunnel-Proxy, Mumble-Server, botamusique, ample

    Einmal editiert, zuletzt von rpi444 (9. März 2023 um 14:51)

  • Dir externe IP kann man in der Regel auch vom Router abfragen, dann ist man nicht auf externe Webseiten angewiesen.

    BTW: Mit:

    Code
    dig +short myip.opendns.com @208.67.222.222   # oder
    dig -4 +tcp myip.opendns.com +short @208.67.222.222

    , ist kein Zugang zu einer externen Webseite erforderlich, sondern lediglich (per UDP oder per TCP) zu den DNS-Servern von OpenDNS.

    Zum Router hat man i. d. R. nur dann Zugang, wenn es der eigene Router ist. Bei einem fremden Router kann man nicht immer die externe/öffentliche IP-Adresse via/vom Router direkt abfragen, wenn man den Zugang zum Router nicht hat. Ist aber auch von der Art des Routers (... als "border device") abhängig.

    EDIT:

    BTW: Wenn man 2 Internetanschlüsse mit nativem IPv4 hat (oder einen guten Freund mit 24/7-Server und nativem IPv4-Internetamschluss), könnte man z. B. auch einen eigenen stun-Server installieren und von dort die eigene öffentliche IPv4-Adresse mit einem stun-Client, abfragen.

    https://pypi.org/project/pystun/

    Code
    apt policy stun-client stun-server

    Man kann aber auch öffentliche stun-Server benutzen. Z. B.:

    Code
    stun -v stun.ekiga.net 2>&1 1>/dev/null | grep MappedAddress | sed -e 's/.*MappedAddress = //' -e 's/:.*//' | uniq
    78.###.###.###

    Öffentliche stun-Server.

    The most popular websites without IPv6 in Germany.  IPv6-Ausreden

    Meine PIs

    PI4B/8GB (border device) OpenBSD 7.4 (64bit): SSH-Server, WireGuard-Server, ircd-hybrid-Server, stunnel-Proxy, Mumble-Server

    PI3B+ FreeBSD 14.0-R-p3 (arm64): SSH-Serv., WireGuard-Serv., ircd-hybrid-Serv., stunnel-Proxy, Mumble-Serv., ddclient

    PI4B/4GB Bullseye-lite (64bit; modifiziert): SSH-Server, WireGuard-Server, ircd-hybrid-Server, stunnel-Proxy, Mumble-Server, botamusique, ample

    3 Mal editiert, zuletzt von rpi444 (9. März 2023 um 16:01)

  • Nicht jeder Router hat ein aktives UPnP. Manche Router stellen Informationen via JSON oder XML bereit, aber die Routen unterscheiden sich und nicht jeder Router bietet so etwas an.

    Wenn man im Internet ist, ist man auf externe Ressourcen angewiesen, falls einem das Netzwerk nicht gehört.
    Man muss dann raten, welcher Dienst am unwahrscheinlichsten ausfällt.

    dnspython ist totaler Overkill, aber ich wollte zeigen, dass das auch ohne externe Programme funktioniert.

    PS: Kann kein IPv6

  • PS: Kann kein IPv6

    ja, aber bei IPv6 hat man (i. d. R.) das "Problem" mit der externen/öffentlichen IPv6-Adresse vom "border device" (Router) nicht, weil mit IPv6, jedes Gerät das im v6-Internet ist, "border device" ist und somit seine "eigene" externe/öffentliche IPv6-Adresse hat.

    Was es beim Zugang ins Internet via IPv6 aber geben kann, ist z. B. eine v6-Firewall und wenn man auf diese Firewall keinen Zugriff (oder gleichwertig) hat, ist man auf den admin dieser v6-Firewall angewiesen.

    The most popular websites without IPv6 in Germany.  IPv6-Ausreden

    Meine PIs

    PI4B/8GB (border device) OpenBSD 7.4 (64bit): SSH-Server, WireGuard-Server, ircd-hybrid-Server, stunnel-Proxy, Mumble-Server

    PI3B+ FreeBSD 14.0-R-p3 (arm64): SSH-Serv., WireGuard-Serv., ircd-hybrid-Serv., stunnel-Proxy, Mumble-Serv., ddclient

    PI4B/4GB Bullseye-lite (64bit; modifiziert): SSH-Server, WireGuard-Server, ircd-hybrid-Server, stunnel-Proxy, Mumble-Server, botamusique, ample

  • Ganz vergessen, dass IPv6 ja auch die öffentliche IP ist. In dem Fall ist es ja ziemlich einfach zu prüfen, ob es sich um eine globale IP handelt. Die Erreichbarkeit wird damit aber nicht geprüft.

  • Hallo rpi444,

    und all die anderen.

    Danke kann ich nur sagen, doch es bringt mich kein Stück weiter. Es ist schön das ihr hier einen solchen umfangreichen Erfahrungsaustausch pflgt, nur
    Jetzt wieder auf die Ausgangsfrage zurück.
    Mit diener Antwort @#9 komme ich kein Stück weiter, als Rückgabe werte herhalte ich eine leere Tuple.

    Code
    ()

    Daher noch einmal die Frage zum Lösungsvorschlag aus @#6 mit "psutil.net_if_addrs()" hier erhalte ich einen DICT, der die Namenselemente 'Io', 'wlan0' und 'eth0' enthält. Diesen sind wieder functionen zugeordnet wo es einen Eintrag mit "address" gibt.
    Wie löse ich nun aus diesem DICT für das Interface "wlan0" die IP Adresse als String heraus ?

    es grüßt
    Andre

  • Mit diener Antwort @#9 komme ich kein Stück weiter, ...

    Der hostname deines PI ist "raspberrypi". Hast Du mehrere PIs im Subnetz deines Routers, mit dem default-hostname "raspberrypi"?

    Welchen Router hast Du? Wird dem PI, die interne IPv4-Adresse per DHCP zugewiesen und wenn ja, teilt der dhcp-Client deines PIs, dem Router/DHCP-/DNS-Server den jetzigen hostname (d. h. z. Zt. "raspberrypi") mit?

    The most popular websites without IPv6 in Germany.  IPv6-Ausreden

    Meine PIs

    PI4B/8GB (border device) OpenBSD 7.4 (64bit): SSH-Server, WireGuard-Server, ircd-hybrid-Server, stunnel-Proxy, Mumble-Server

    PI3B+ FreeBSD 14.0-R-p3 (arm64): SSH-Serv., WireGuard-Serv., ircd-hybrid-Serv., stunnel-Proxy, Mumble-Serv., ddclient

    PI4B/4GB Bullseye-lite (64bit; modifiziert): SSH-Server, WireGuard-Server, ircd-hybrid-Server, stunnel-Proxy, Mumble-Server, botamusique, ample

  • Hallo

    Der hostname deines PI ist "raspberrypi".

    Ja

    Hast Du mehrere PIs im Subnetz deines Routers, mit dem default-hostname "raspberrypi"?

    3 + 7 ESP32 ( was wohl unrelevant ist )

    Welchen Router hast Du?

    Nur ein alter Digitus WLAN Router, nur für meine Bastelecke. WAN = DHCP IN von einer O2 Starterbox. Alle Geräte ( PC + RasPi + ESP32 ) erhalten ihre IP von dem Digitus WLAN-Router.

    Wird dem PI, die interne IPv4-Adresse per DHCP zugewiesen und wenn ja, teilt der dhcp-Client deines PIs, dem Router/DHCP-/DNS-Server den jetzigen hostname (d. h. z. Zt. "raspberrypi") mit?

    Ja nur IPv4 und in der Clientliste des Router werden nur MAC-Adressen und die dazugehörigen vergebenen IP Adressen angezeit.

    es grüßt
    Andre

  • Ja

    3 + 7 ESP32 ( was wohl unrelevant ist )

    Naja, relevant ist das schon, wenn deine 3 Pis den gleichen Hostnamen haben. Aber OK, wenn Du das so willst, kannst Du die IPv4-Adresse vom Interface (hier "eth0") lesen. Z. B.:

    Code
    >>> import os
    >>> os.system("ip -4 a s dev eth0 | grep -i inet | awk {'print $2'} | grep -Eo '\<[[:digit:]]{1,3}(\.[[:digit:]]{1,3}){3}\>'")

    The most popular websites without IPv6 in Germany.  IPv6-Ausreden

    Meine PIs

    PI4B/8GB (border device) OpenBSD 7.4 (64bit): SSH-Server, WireGuard-Server, ircd-hybrid-Server, stunnel-Proxy, Mumble-Server

    PI3B+ FreeBSD 14.0-R-p3 (arm64): SSH-Serv., WireGuard-Serv., ircd-hybrid-Serv., stunnel-Proxy, Mumble-Serv., ddclient

    PI4B/4GB Bullseye-lite (64bit; modifiziert): SSH-Server, WireGuard-Server, ircd-hybrid-Server, stunnel-Proxy, Mumble-Server, botamusique, ample

  • Hallo,

    Du die IPv4-Adresse vom Interface

    Abgeänert auf wlan0 erhalze ich diese Ausgabe

    setze ich eine Variable davor
    IP = und deine lange Befehlsfole, dann hat die Variable IP den Inhalt von 0.
    Für eine Ausgabe auf einem sekundären eigenständigen Display nützt mir das wenig.

    es grüßt
    Andre

  • setze ich eine Variable davor
    IP = und deine lange Befehlsfole, dann hat die Variable IP den Inhalt von 0.
    Für eine Ausgabe auf einem sekundären eigenständigen Display nützt mir das wenig.

    Ja, der Inhalt von 0 ist der Rückgabewert. Als Pythonprogrammierer musst Du schauen, ob Du den Rückgabewert für die os.system()-Funktion unterdrücken kannst und wenn nicht, dann ignorieren lassen und nur die 1. Ausgabe (IPv4-Adresse) "verwerten"/benutzen.

    The most popular websites without IPv6 in Germany.  IPv6-Ausreden

    Meine PIs

    PI4B/8GB (border device) OpenBSD 7.4 (64bit): SSH-Server, WireGuard-Server, ircd-hybrid-Server, stunnel-Proxy, Mumble-Server

    PI3B+ FreeBSD 14.0-R-p3 (arm64): SSH-Serv., WireGuard-Serv., ircd-hybrid-Serv., stunnel-Proxy, Mumble-Serv., ddclient

    PI4B/4GB Bullseye-lite (64bit; modifiziert): SSH-Server, WireGuard-Server, ircd-hybrid-Server, stunnel-Proxy, Mumble-Server, botamusique, ample

  • In der Shell parsed man ip-Ausgaben am einfachsten im json-Format (ip -j ... | jq ..). Das geht doch analog dazu bestimmt auch nativ in python3.

    Zitat

    $ ip -4 -j a | jq -r '.[] | select(.ifname == "eth1") | .addr_info[].local'

    192.168.33.201

    Wenn du nichts zu sagen hast, sag einfach nichts.

    Einmal editiert, zuletzt von llutz (10. März 2023 um 15:32)

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!