Routing in Netzwerk namespace
Hallo. Ich habe ein problem. Bzw komme ich einfach nicht weiter.
Mein vorhaben: um meine Internetleitung zu entlasten möchte ich ein Programm über eine Andere Netzwerkschnittstelle ins internet gehen lassen.
um das zu erreichen habe ich einen Netzwerk namespace namens "mobilfunk" erstellt.
Hier der script was beim hochfahren ausgeführt wird:
danach wir dann das Programm gestartet und eine weboberfläsche ist unter dem port 6666 erreichbar.
gehe ich in das netzwerk vom mobilfunkrouter kann ich die oberfläsche öffnen und bedienen. Das bringt mir aber leider nix da weitere anwendungen zugriff auf die oberfläsche brauchen.
wo das Programm noch ohne Namespace gelaufen ist habe ich in den anderen Programmen die Adresse 127.0.0.1 verwendet.
hier nochmal die Zusammenfassung:
1 Server mit 2 Lan karten (eth0 -> IP 192.168.220.xx und eth1 -> IP 192.168.8.xx)
eth0 -> ist im hauptnetz , alle clients haben über diese schnittstelle zugriff auf den Server
eth1 -> hängt an einem mobilfunkrouter und befindet sich in einem Namespace namens "mobilfunk"
das Programm "xyz" wird im NS ausgeführt und geht übers mobilfunknetz ins internet, die weboberfläsche hat den port 6666
das Programm "abc" wird normal ausgeführt und braucht irgendwie zugriff zum programmm "xyz"
Vermutlich benötige ich ein veth um dann irgendwie beide netze "verbinden" zu können. Habe einige Anleitungen mal ausprobiert aber leider hat das nicht zum erfolg geführt.
z.b. das hier
Mein vorhaben: um meine Internetleitung zu entlasten möchte ich ein Programm über eine Andere Netzwerkschnittstelle ins internet gehen lassen.
um das zu erreichen habe ich einen Netzwerk namespace namens "mobilfunk" erstellt.
Hier der script was beim hochfahren ausgeführt wird:
#!/bin/bash
nsname=mobilfunk
NIC=eth1
Gateway=192.168.8.1
IPAddr=192.168.8.10
DNS=9.9.9.9
#alte netns löschen
if [ -f /var/run/netns/${nsname} ];
then
echo "INFO:::: "${nsname}" wird gelöscht."
ip netns del ${nsname}
else
echo "INFO:::: "${nsname}" nicht vorhanden."
fi
#ip -all netns delete
ip netns add ${nsname} && echo ${nsname}" erstellt"
ip link set dev ${NIC} netns ${nsname} && echo ${NIC} " wurde " ${nsname} "zugeordnet."
ip netns exec ${nsname} ifconfig ${NIC} ${IPAddr}/24 up && echo ${NIC} " wurde " ${IPAddr} "zugewiesen."
ip netns exec ${nsname} ifconfig lo 127.0.0.1/8 up && echo "lokale schleige wurde erstellt."
ip netns exec ${nsname} route add default gw ${Gateway} && echo "Gateway " ${Gateway} " erstellt."
#ip netns exec ${nsname} dhcpcd ${NIC} && echo "dhcpcd ausgeführt"
#DNS Server hinzufügen
if [ -d /etc/netns/ ];
then
echo "INFO:::: ""netns-Ordner vorhanden."
else
echo "INFO:::: ""netns-Ordner fehlt!"
mkdir /etc/netns
fi
if [ -d /etc/netns/${nsname}/ ];
then
echo "INFO:::: "${nsname}"-Ordner vorhanden"
echo "nameserver "${DNS} > /etc/netns/${nsname}/resolv.conf && echo "nameserver "${DNS} " in Datei /etc/netns/"${nsname}"/resolv.conf geschrieben"
else
echo "INFO:::: "${nsname}"-Ordner fehlt"
mkdir /etc/netns/${nsname}
echo "nameserver "${DNS} > /etc/netns/${nsname}/resolv.conf
fi
exit 0;
danach wir dann das Programm gestartet und eine weboberfläsche ist unter dem port 6666 erreichbar.
gehe ich in das netzwerk vom mobilfunkrouter kann ich die oberfläsche öffnen und bedienen. Das bringt mir aber leider nix da weitere anwendungen zugriff auf die oberfläsche brauchen.
wo das Programm noch ohne Namespace gelaufen ist habe ich in den anderen Programmen die Adresse 127.0.0.1 verwendet.
hier nochmal die Zusammenfassung:
1 Server mit 2 Lan karten (eth0 -> IP 192.168.220.xx und eth1 -> IP 192.168.8.xx)
eth0 -> ist im hauptnetz , alle clients haben über diese schnittstelle zugriff auf den Server
eth1 -> hängt an einem mobilfunkrouter und befindet sich in einem Namespace namens "mobilfunk"
das Programm "xyz" wird im NS ausgeführt und geht übers mobilfunknetz ins internet, die weboberfläsche hat den port 6666
das Programm "abc" wird normal ausgeführt und braucht irgendwie zugriff zum programmm "xyz"
Vermutlich benötige ich ein veth um dann irgendwie beide netze "verbinden" zu können. Habe einige Anleitungen mal ausprobiert aber leider hat das nicht zum erfolg geführt.
z.b. das hier
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 1618062033
Url: https://administrator.de/contentid/1618062033
Ausgedruckt am: 21.11.2024 um 22:11 Uhr
38 Kommentare
Neuester Kommentar
Vermutlich benötige ich ein veth um dann irgendwie beide netze "verbinden" zu können.
Nö du musst deinem Namespace auch die Route zu deinem 220er Netz mitteilen denn die legst du dort ja gar nicht an, ergo versucht der Namespace die 220er IPs über das GW 192.168.8.1 aufzulösen welches das Netz 192.168.220.0/24 aber gar nicht kennt Zitat von @FlorianHe:
Okay. Und wie Teile ich dem namespace das mit . Bzw. Wie würde der Befehl dann lauten ?
Okay. Und wie Teile ich dem namespace das mit . Bzw. Wie würde der Befehl dann lauten ?
Na wie fügt man denn wohl Routen hinzu?!
ip route add --help
https://www.cyberciti.biz/faq/linux-route-add/
Das ganze macht's du für deinen Namespace feddisch. Du sagst damit einfach der Routing Tabelle des Namespace an welchem Interface dein 220er Netz erreichbar ist und schon ist das asynchrone Routing Vergangenheit 😉🖖
Komisch, im ersten Versuch hat doch alles wunderbar geklappt...?! 🤔
Zitat von @FlorianHe:
Also so
?
Nein, du musst der route sagen an welchem Interface sie in dem Fall anliegt.Also so
ip netns exec mobilfunk ip route add 192.168.220.0/24 via 192.168.8.10
Mus ich dann auf dem Hostsystem auch eine Route hinzufügen?
Nein das kennt beide Netze durch die Standard-Routing-Tabellle, ganz im Gegensatz zur Routing-Tabelle deines Namespace dem musst du das mit der Route erst mal mitteilen, denn sonst schickt der Namespace wie gesagt Traffic an 192.168.220.0/24 über sein Default GW und das ist im Namespace der Mobilfunkrouter der das Netz eben nicht kennt und somit die Pakete im Internet-Nirvana landen. .ip netns exec mobilfunk ip route add 192.168.220.0/24 dev eth0
Also dann mal zu Fuß.
Du brauchst erst mal auf dem Host ein veth das mit einem weiteren veth in dem Namespace verbunden wird.
Dann musst du das veth1 Interface als erstes dem Namespace zuweisen denn jetzt ist es ja noch dem globalen Namespace zugewiesen:
Dann musst du das veth0 zusammen mit dem eth0 des Hosts in eine Bridge packen (Man kann auch über eine separate IP routen, aber das lass ich jetzt mal).
Jetzt braucht der Namespace für das veth1 Interface noch eine neue IP-Adresse aus dem Netz von eth0 des Hosts (nehme ich einfach mal die .34)
Nun sollte ein Ping aus dem Namespace heraus in das 220er Netz funktionieren
Ebenso sollte vom Host bzw. im 220er Netz ein Ping auf 192.168.220.34 funktionieren.
Hier wird das ganze auch nochmal beschrieben
https://blog.scottlowe.org/2013/09/04/introducing-linux-network-namespac ...
Habe ich hier auch nochmal einwandfrei getestet, funktioniert wie gewünscht.
Bildlich dargestellt sieht das geschilderte dann so aus:
Der Namespace ist also über die veth mit dem HOST verbunden und da veth0 in einer Bridge mit eth0 liegt lässt sich dem Namespace auch eine IP aus dem Netz von eth0 verpassen weil die Interfaces in einer gemeinsamen Layer-2 Domain liegen.
Du brauchst erst mal auf dem Host ein veth das mit einem weiteren veth in dem Namespace verbunden wird.
ip link add veth0 type veth peer name veth1
ip link set veth1 netns Mobilfunk
# bridge erstellen
ip link add br0 type bridge
# eth0 des Hosts zur Bridge hinzufügen
ip link set eth0 master br0
# veth0 zur Bridge hinzufügen
ip link set veth0 master br0
# link aktivieren
ip netns exec Mobilfunk ip link set veth1 up
# ip zu veth1 im Namespace zuweisen
ip netns exec Mobilfunk ip address add 192.168.220.34/24 dev veth1
Nun sollte ein Ping aus dem Namespace heraus in das 220er Netz funktionieren
ip netns exec Mobilfunk ping 192.168.220.1
Hier wird das ganze auch nochmal beschrieben
https://blog.scottlowe.org/2013/09/04/introducing-linux-network-namespac ...
Habe ich hier auch nochmal einwandfrei getestet, funktioniert wie gewünscht.
Bildlich dargestellt sieht das geschilderte dann so aus:
Der Namespace ist also über die veth mit dem HOST verbunden und da veth0 in einer Bridge mit eth0 liegt lässt sich dem Namespace auch eine IP aus dem Netz von eth0 verpassen weil die Interfaces in einer gemeinsamen Layer-2 Domain liegen.
Zitat von @FlorianHe:
un ab dem Befehl bricht die ssh verbindung ab und der Server ist nicht mehr erreichbar.
Wenn du über die selbe Verbindung rein kommst sägst du dir natürlich erst mal den Ast ab auf dem du sitzt, das ist normal .un ab dem Befehl
ip link set eth0 master br0
habe dann den Befehl in geändert und dann wurde der Befehl richtig ausgeführt
War ein Typo sorry is oben korrigiert.sudo ip netns exec Mobilfunk ip link set dev veth1 up
ich habe dann noch die ip-Adresse vergeben und dann die netzwerkverbindung getestet. Leider ist der Server immer noch nicht erreichbar.
woran kann das liegen ? kann das sein das die Brücke noch aktiviert werden muss und vom dhcp ne ip adresse braucht ?
Der Brücke muss natürlich dann die IP-Adresse zugewiesen werden die vorher eth0 hatte, wenn du dessen Dienste darüber von Remote anprichst, korrekt denn die Brücke ist nun die Verbindung zur Außenwelt für den Host.woran kann das liegen ? kann das sein das die Brücke noch aktiviert werden muss und vom dhcp ne ip adresse braucht ?
Dachte zumindest diese Grundlagen wären vorhanden, wohl falsch gedacht .
Zitat von @FlorianHe:
wie bekomme ich das hin das die brücke sich die ip adresse vom dhcp server holt ?
find im internet nur den weg über /etc/network/interfaces aber gibts doch bestimmt auch einen Befehl oder ?
Im Normalfall konfiguriert man sowas ja nicht per Skript sondern hinterlegt die Konfiguration fest einmalig im Networkmanager seiner Wahl dann ist Skripting hier überflüssig und auch zuverlässiger.wie bekomme ich das hin das die brücke sich die ip adresse vom dhcp server holt ?
find im internet nur den weg über /etc/network/interfaces aber gibts doch bestimmt auch einen Befehl oder ?
Wenn man
dhcpcd
einsetzt dann kann man natürlich auch auf der Shell manuell nachhelfen# release lease
dhcpcd -k eth0
# request new lease on br0
dhcpcd -n br0
Wenn's das dann war bitte auf gelöst setzen. Danke.
Gruß /h
Zitat von @FlorianHe:
wenn ich ganz normal auf dem Hostsystem den Befehl
eigebe wird die Seite bzw der Html code der Seite angezeigt
führe ich den Befehl im Namespace aus kommt der Fehler:
curl: (7) Failed to connect to xxxxxxxxxx.ddns.net port 10000: Verbindungsaufbau abgelehnt
Das komische ist wenn ich eine Seite im Namespace mit curl aufrufe ohne angabe des Ports funktioniert es.
Ich kann also im namespace keine urls aufrufen die auf einem anderen port liegen.
wo liegt da der Fehler?
Kann ich hier nicht nachstellen, klappt hier beim Nachstellen problemlos. Vermutlich sperrt dein anderer Anbieter den Port oder du hast eine Firewall die den Port im NS sperrt oder du hast in der Firewall des Ziels den Source Address Range des anderen Anbieters geblockt , oder du hast dir ein Loopback(Hairpin)-NAT Problem gebaut wenn die Dienste die du via dyndns erreichen willst in dein eigenes Netz zeigen. Ein tcpdump oder wireshark trace sollte dir zeigen was Sache ist.wenn ich ganz normal auf dem Hostsystem den Befehl
curl https://xxxxxxxxxxxxx.ddns.net:10000/
führe ich den Befehl im Namespace aus kommt der Fehler:
curl: (7) Failed to connect to xxxxxxxxxx.ddns.net port 10000: Verbindungsaufbau abgelehnt
Das komische ist wenn ich eine Seite im Namespace mit curl aufrufe ohne angabe des Ports funktioniert es.
Ich kann also im namespace keine urls aufrufen die auf einem anderen port liegen.
wo liegt da der Fehler?
Theoretisch muss ich im Router die Ports 11000 12000 usw freigeben.
Ausgehend sollten diese im Normalfall nicht geblockt werden wenn du nichts verstellt hast. Natürlich solltest du auch erst mal ohne Namespace prüfen ob über die Mobilfunkverbindung deines Providers die Ports auch nicht blockiert sind. Ich würde dir aber raten das ganze über ein VPN abzufackeln dann ist die Nutzung von non standard ports im LTE Netz nicht mehr nötig weil alles getunnelt über die VPN Verbindung läuft.hab ich den lte router am netz kann die vpn verbindung nicht aufgebaut werden.
Das kann sehr gut sein, denn im LTE Netz werden bei Billigprovidern immer im Internet nicht routebare RFC 1918 oder RFC 6598 v4 IP Adressen eingesetzt mit zentralem CGN (DS-Lite). Damit ist ein VPN zumindestens als Dialin mit IPv4 technisch unmöglich.Kannst du ganz einfach klären wenn du im Huawei Dashboard mal auf die zugeteilte WAN IP siehst.
Die FritzBox nutzt vermutlich xDSL mit einer öffentlichen IP. Leider machst du dazu keine oder nur sehr oberflächliche Aussagen um das zielführend beurteilen zu können.
Man bekommt das aber in der regel einfach gefixt indem man einen anderen APN nutzt im Mobilnetz. Bei den meisten Billigprovidern geht das aber mit einem Tarifwechsel einher. Hängt also von deinen Vertragsoptionen ab.
ipv4. 10.112.xx.xxx
Wie es zu erwarten war... Im Internet nicht geroutete RFC 1918 IP. Damit ist ein v4 VPN technisch unmöglich ! Zumindestens mit dem Mobilfunk Vertrag den du hast. Da hast du völlig falsche Vertragsoptionen abgeschlossen. Auf sowas achtet man doch logischerweise immer VORHER. Siehe dazu auch:https://de.wikipedia.org/wiki/IPv6#Dual-Stack_Lite_(DS-Lite)
https://www.heise.de/ct/ausgabe/2013-6-Internet-Dienste-trotz-DS-Lite-nu ...
Du kannst aber problemlos IPv6 nutzen für das VPN. Das ist eine öffentliche v6 Adresse !
in den Fritzboxeinstellungen die zugangsprofile so geändert habe das alles zugelassen ist (vorher war "nur surfen und mailen" aktiviert)
Logisch, denn VPN Traffic ist eben nicht nur TCP 80, 443 bzw. Email Ports. Sagt einem aber auch schon der gesunde IT Verstand. die ip-Adresse ist bei beiden die selbe.
Es ging logischerweise nur um das Webserver Ziel und die Hops dahinzukommen. Irgendwo muss ja im Hop Pfad zu wttr.in etwas TCP 80 oder 443 blocken. DNS spielt doch da kein Rollo !!Das Google und wttr.in dasselbe sein soll gehört wohl ins Reich der Märchen...
Tip:
Traceroute auf dem Mac sollte man wegen der Vergleichbarkeit zu anderen Plattformen besser immer mit "-I" laufen lassen ansonsten macht der kein ICMP wie andere Endgeräte sondern TCP Pings.
Weißt du eig ob das routen vom hostsystem ins namespacenetz möglich ist?
Steht doch oben, einfach nur die Brücke weglassen und veth0 und veth1 jeweils eine eigene IP aus dem gleichen Subnetz vergeben, feddisch ist der Käse. Mit der Brücke hast du ja schon Kontakt zum Namespace weil dieser dann mit einem Bein im lokalen Netz und mit dem anderen Bein am LTE Netz hängt.
Nein! Der Host kennt das Netz dann bereits weil er eine Adresse davon besitzt, eine Route hinzufügen ist also Blödsinn!
Außerdem solltest du ein separates Subnetz dafür nehmen nicht das das am Host ins lokale Netz führt sondern ein anderes, also bspw. 192.168.230.0/30, da ja eh nur zwei Devices beteiligt sind reicht hier dann ein 30er Subnetz, 192.168.230.1/30 für den Host und 192.168.230.2/30 für den Namespace.
Das sind jetzt aber absolute Routing Grundlagen min Jung.
Gehen wir mal davon aus das veth0 192.168.220.31 hat und veth1 die 32 dann muss die Route so lauten? :
Du brauchst keine Route, weil die Interfaces direkt am Host existieren und dieser das Netz durch die dem Interface zugewiesenen Adressen bereits kennt und in der Routing-Tabelle bereits die Einträge automatisch hinzugefügt werden wenn man den Interfaces eine IP zuweist!Außerdem solltest du ein separates Subnetz dafür nehmen nicht das das am Host ins lokale Netz führt sondern ein anderes, also bspw. 192.168.230.0/30, da ja eh nur zwei Devices beteiligt sind reicht hier dann ein 30er Subnetz, 192.168.230.1/30 für den Host und 192.168.230.2/30 für den Namespace.
Das sind jetzt aber absolute Routing Grundlagen min Jung.
woher weis der dann wenn ich z.b. ping 192.168.8.112
Den kompletten Pfad kennt er nicht, zumindestens nicht bei statischem Routing. Der gesamte Pfad ergibt sich nach den an den Hops eingetragenen Routen. Der Routing Weg wird immer Hop für Hop entschieden.Der Host auf dem du den Ping absetzt sieht also zuerst in seine eigene Routing Tabelle und wählt dort die Route aus. Dabei gilt bei mehrfachen Routen zum Ziel immer der best longest prefix match sprich also die Route mit dem größten Prefix (Netzmaske) die den Weg zum Ziel definiert.
An das Gateway schickt der Ping Host das Paket und an dem Gateway wird dann wieder wie oben neu entschieden usw. bis zum Ziel.
Ganz einfach Logik wo man sich nun wahrlich nicht schwer tun muss.
ich habe jetzt 2 virtuelle netzwerke angelegt veth3(192.168.230.1) und veth4(192.168.230.2)
Das ist jetzt aber dreist gelogen, denn das sind wie man ja unschwer sehen kann keine 2 IP Netze sondern 2 Hostadressen im gleichen IP Netz !Normal funktioniert das so NICHT auf Interfaces die nicht per Layer 2 Bridging miteinander verbunden sind, denn die erzwingen immer einzigartige Netzwerk Adressen. Klar, denn sonst wäre eine eindeutige Wegefindung ja unmöglich. Bei virtuellen Interfaces sollte das ähnlich sein.