Debian - Ein Netzwerk für Zielports verwenden

(Firma: tsx89) Persönliche Seite #7999622
Lesenswert?

Ich möchte einen öffentlichen Hotspot für HTTP(s) und FTP verwenden. (Dieser erlaubt keine anderen Server-Zielports und nur IPv4) - Währenddessen möchte ich 5G (mobiles Daten-Volumen) für "alle anderen" Server-Zielports erlauben. Dafür aber wiederum kein HTTP(s) oder FTP über das 5G. Ziel ist es, damit z.B. YouTube, Webradio oder Debian-Updates über den Hotspot laufen zu lassen - Und alles andere, wie geschäftliche Mail SMTP oder online Spielen parallel über das 5G zu fahren. Ich möchte das mobile Datenvolumen "schonen" und dafür - wo eben möglich - den öffentlichen Hotspot benutzen.

Ich habe schon einiges mit Routen versucht, aber es wird meistens die 5G Verbindung für alles benutzt (Metrik?) - oder es ging gar nichts mehr. Ich möchte vermeiden iptables zu installieren, außer es lässt sich nicht vermeiden. Es reicht, dies "per Session temporär" z.B. per Skript einmalig einzustellen bzw. auszuführen, und muss nicht "permanent" sein. Am besten wäre natürlich das per statischer Schnittstellenbezeichnung und nicht per temporär zugewiesener IP-Adressen zu konfigurieren. Ich hatte bisher keine Erfolge.

H/W 'wlp0' ist der Hotspot. Und 'enx0' das 5G Modem.

ip a (gekürzter Abschnitt)

1
wlp0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
2
    link/ether 0e:22:c2:ac:c3:75 brd ff:ff:ff:ff:ff:ff
3
    inet 10.101.91.184/21 brd 10.101.95.255 scope global dynamic noprefixroute wlp0
4
       valid_lft 40571sec preferred_lft 40571sec
5
    inet6 fe80::71e4:a667:90b5:fce8/64 scope link noprefixroute 
6
       valid_lft forever preferred_lft forever
7

8

9
enx0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UNKNOWN group default
10
    link/ether 5e:d2:e6:0d:61:17 brd ff:ff:ff:ff:ff:ff
11
    inet 10.209.138.155/24 brd 10.209.138.255 scope global dynamic noprefixroute enx0
12
       valid_lft 2370sec preferred_lft 2370sec
13
    inet6 2a02:3038:278:f1e3::176/128 scope global dynamic noprefixroute 
14
       valid_lft 83650sec preferred_lft 83650sec
15
    inet6 2a02:3038:278:f1e3:f977:1795:c7d7:f7a1/64 scope global noprefixroute 
16
       valid_lft forever preferred_lft forever
17
    inet6 fe80::e406:295c:5e90:8b96/64 scope link noprefixroute 
18
       valid_lft forever preferred_lft forever

ip r (routes)

1
default via 10.209.138.103 dev enx0 proto dhcp src 10.209.138.155 metric 100 
2
default via 10.101.88.1 dev wlp0 proto dhcp src 10.101.91.184 metric 600 
3
10.101.88.0/21 dev wlp0 proto kernel scope link src 10.101.91.184 metric 600 
4
10.209.138.0/24 dev enx0 proto kernel scope link src 10.209.138.155 metric 100

Vielleicht kann mir hier ja jemand helfen. Liebe Grüße, tsx

Persönliche Seite #7999635
Lesenswert?

mit Routing alleine wird das imho nicht gehen, weil das nur die IP berücksichtigt. Imho musst du den Paketfilter (netfilter) bemühen. Ich denke, du musst dort auch Masquerading machen, weil dir sowohl das Mobilfunknetz, also auch der Hotspot je eine IP-Adresse zuweist und du deinen Anwendungen vermutlich nicht direkt sagen kannst, welche IP-Adresse sie als Absender nehmen sollen.

Ich bin aus dem Netzwerkspiel allerdings seit langem raus, konkretere Tips kann ich dir leider nicht geben.

#7999662
Lesenswert?

Das wird alles warschl. nicht funktionieren weil immer eine andere IP vergeben wird und evtl. auch das GW sich ändert. Aber Policy Based Routing plus Browser "Umbiegung" sollte gehen. Ist nur temporär und echt ein gefrickel. Permanent ginge es wenn du beim booten die ip des enx0 ermittelst und den Rest in ein script packst könnte es gehen...

  1. default route f. enx0 entfernen ip r del default via 10.209.138.103 dev enx0

  2. Policy based routing f. enx0 erstellen echo "100 enx0" >> /etc/iproute2/rt_tables

  3. roules erstellen iptables -A INPUT -i enx0 -p tcp -m multiport --dports 22,443 -j ACCEPT # und die ports f. Mail etc. nicht vergessenn iptables -A INPUT -i enx0 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT iptables -A INPUT -i enx0 -j DROP

Zwei Browser für je f.d. getrennten Interfaces. Dem Browser Mitteilen, dass es mit der IP des enx0 raus gehen soll

chromium --bind-address=<ip von enx0>

Persönliche Seite #7999689
Lesenswert?

Tim S. schrieb:

Ich möchte vermeiden iptables zu installieren, außer es lässt sich nicht vermeiden.

Iptables (also das netfilter-Backend) ist Teil des Kernels und somit sowieso immer installiert, außer du hast einen eigenen Kernel ohne kompiliert. Der iptables-Befehl ist nur ein simples User Interface um den sowieso installierten netfilter zu konfigurieren.

#8000135
Lesenswert?

Für den unwahrscheinlichen Fall, dass Tim "systemd-networkd" verwendet:

Trag dem hotspot.network eine

[Route] Table=555 # Nummer egal, oder Namen vergeben

Und eine oder mehrere

[RoutingPolicyRule] DestinationPort=443 Table=555

ein. ggfs. noch Metric setzen.

Ersetzt das Gefrickel mit händisch angelegten Routing-Tables und Firewall-Rules (Ob wohl die da auch als PolicyRule gingen, "FirewallMark=") durch Gefrickel mit den systemd-config-Files, die auch nur marginal besser dokumentiert sind.

#8000354
Lesenswert?

Tim S. schrieb:

Ich möchte einen öffentlichen Hotspot für HTTP(s) und FTP verwenden. (Dieser erlaubt keine anderen Server-Zielports und nur IPv4) - Währenddessen möchte ich 5G (mobiles Daten-Volumen) für "alle anderen" Server-Zielports erlauben. Dafür aber wiederum kein HTTP(s) oder FTP über das 5G.

Okay, ich frage mal genauer.

Du befindest Dich in zwei Netzen, einem Hotspot und einem mobilen. Der Hotspot lässt aber nur Verbindungen zu bestimmten Zielports zu: HTTPS, HTTP und FTP. Diese Ports möchtest Du gerne über den Hotspot routen, alle anderen hingegen über Dein mobiles Netz. Wenn das soweit stimmt, würden ein Proxy und einige Environment-Variablen zweifellos helfen. :-)

#8000452
Lesenswert?

Sheeva P. schrieb:

Wenn das soweit stimmt, würden ein Proxy und einige Environment-Variablen zweifellos helfen.

Würde zwar gehen, (Proxy auf Source-IP für Outgoing Connections binden usw.), aber unpraktisch, wenn sich die IP, die er vom Hotspot kriegt, regelmäßig ändert.

Die Lösung über die Routing-Tables (egal über welches Tool eingerichtet) erlaubt über die Metric der default-Routes ein einigermaßen nahtloses Fallback. Wenn das Hotspot Interface down ist, greift einfach die zweite Route über 5G.

: Bearbeitet durch User
(Firma: tsx89) Persönliche Seite #8000652
Lesenswert?

Ich denke ich werde es vorerst "aufgeben" müssen! Nun fummel ich schon einige Tage immer mal wieder an einem Skript herum, und habe auch die Google-KI befragt, die auch eure entsprechenden Tipps wiedergeben hat. Das zuerst vorgeschlagene "Policy Based Routing" mit "modernen" Nftables, NAT, Masquerading und sogar im Kernel das "Routing" eingeschaltet - In vielen Variationen und Coding-Styles war alles dabei. Der Code sah auch sehr plausibel aus, aber das Skript hat immer das "Modem" bevorzugt.

Chrome und "--bind address" klingt sehr einfach, das werde ich dann noch versuchen. Oder hat jemand vielleicht noch eine Idee? Ich habe mal das letzte Skript mit "KI-Unterstützung" an gehangen. (Dort sind die Interface-Namen original ungekürzt)

Εrnst B. schrieb:

Die Lösung über die Routing-Tables (egal über welches Tool eingerichtet) erlaubt über die Metric der default-Routes ein einigermaßen nahtloses Fallback. Wenn das Hotspot Interface down ist, greift einfach die zweite Route über 5G.

Ja, dort wollte ich auch ansetzen. Wäre toll, wenn es "out of the box" mit Debian (ohne großartig weitere Pakete) funktionieren könnte... Bisher habe ich nichts installieren müssen.

Angehängte Dateien:
#8000712
Lesenswert?

Tim S. schrieb:

Ja, dort wollte ich auch ansetzen. Wäre toll, wenn es "out of the box" mit Debian (ohne großartig weitere Pakete) funktionieren könnte...

ich verwende networkd-systemd unter debian (wenn schon systemd, dann "all the way"). Aber das wäre was zum Nachinstallieren.

Config wäre in etwa:

mobilfunk.network

1
[Match]
2
Name=enx663e217cf456
3
[Network]
4
DHCP=ipv4
5
RouteMetric=2000 # Setzt die Metric der Routen, die per DHCP kommen, hier eigentlich egal.
6

7
# Bei dem Part bin ich mir nicht ganz sicher, ob der so klappt:
8
# Mobilfunk-Gateway auch als default-Route in der 555er-Table anlegen
9
[Route]
10
Gateway=_dhcp4
11
Table=555
12
Metric=3000

hotspot.network

1
[Match]
2
Name=wlp0s20f3
3

4
[Network]
5
DHCP=ipv4
6
RouteMetric=1000 # Höher priorisiert 
7
RouteTable=555 # DHCP-Gateway landet in dieser Table
8

9
[RoutingPolicyRule]
10
DestinationPort=443
11
Table=555
12

13
[RoutingPolicyRule]
14
DestinationPort=80
15
Table=555

Fertig. Der Teil mit dem Eintragen vom Mobilfunk-Gateway in die 555er Tabelle könnte auch unnötig sein. Systemd-Networkd sollte eigentlich die RoutingPolicyRules deaktivieren, wenn wlp0 down geht.

Aber ich will hier wirklich niemanden zu systemd drängen. Du verlierst die Option einfach per Klicki-Bunti-GUI das Netzwerk zu verkonfigurieren, die dir der NetworkManager bringt.

: Bearbeitet durch User
#8001035
Lesenswert?

Ein anderer Weg, den ich früher einmal für etwas ähnliches (AP der nur bestimmte Ports/Protokolle zulässt) genutzt habe ist ein VPN.

Evtl. einmal probieren einen VPN Server aufzusetzen, der auf Port 443 lauscht, wenn der AP die Verbindung darüber zulässt kann man den kompletten Datenverkehr durch den Tunnel schicken.

(Firma: tsx89) Persönliche Seite #8001305
Lesenswert?

Jemand hier macht mir bestimmt einen VPN-Server auf Port 443 IPv4 auf, und gibt mir die Adresse? TOR-Netzwerk funktioniert jedenfalls. Aber da ich eh nur bis morgen an dem Standort bin, wo dieses Thema eine Rolle spielt, ist es nicht mehr so wichtig... Solch ein funktionierendes Skript könnte ich künftig dennoch gut gebrauchen. Dankeschön trotzdem für die vielen Mühen! Liebe Grüße tsx

#8003420
Lesenswert?

Tim S. schrieb:

Jemand hier macht mir bestimmt einen VPN-Server auf Port 443 IPv4 auf, und gibt mir die Adresse?

Ich wüsste da was, aber um ehrlich zu sein, möchte ich hier nicht einmal den Namen nennen -- sonst werde ich am Ende noch Mittäter oder Mitstörer. Es hat etwas mit Weinflaschen zu tun, das Setup ist nicht völlig trivial und bedarf eines frei konfigurierbaren SSH-Servers. :-)

#8016894
Lesenswert?

Εrnst B. schrieb:

Sheeva P. schrieb:

Wenn das soweit stimmt, würden ein Proxy und einige Environment-Variablen zweifellos helfen.

Würde zwar gehen, (Proxy auf Source-IP für Outgoing Connections binden usw.), aber unpraktisch, wenn sich die IP, die er vom Hotspot kriegt, regelmäßig ändert.

Hmmm... Bitte entschuldige meine späte Antwort, aber wenn derartige Einwände von Dir kommen, denke ich lieber zweimal über eine kluge Antwort nach. :-)

Ein Proxy wie beispielsweise jener [1] (Artikel dazu: [2]) kann die Source-IP für jeden Request dynamisch vom System abfragen, und kann die Verbindung zum Webserver dann an diese Source-IP binden -- oder, wenn keine gefunden werden konnte, als Fallback einfach die 5G-Verbindung nehmen.

Alles, was dazu notwendig wäre, ist die Funktion GetIpByName() und die nötigen Imports aus dem Anhang mitzunehmen und die Funktion net.Dial() in Zeile 31 von Elis Code durch net.DialTCP() mit der von GetIpByName() erhaltenen net.TCPAddr als Parameter "laddr" zu benutzen, die "raddr" bleibt dabei nil und kommt vom DNS-Resolver des Systems.

Der Rest wäre dann simpel: Proxy starten, den Webbrowser mit

1
http_proxy=http://127.0.0.1:9999 https_proxy=http://127.0.0.1:9999 <browser>

starten, und der Drops ist zumindest für HTTP und HTTPS gelutscht.

Auf meinem Kubuntu 24.04.4 LTS kostet das Ermitteln der net.TCPAddr dann pro Request etwa 0,0002 Sekunden, daher wage ich zu bezweifeln, daß das größeren Einfluß auf die Benutzererfahrung hätte. Bedauerlicherweise habe ich gerade aber keine Möglichkeit, das ordentlich in der Praxis zu testen.

Die Vorteile meiner Lösung wären IMHO, daß sie direkt ohne Privilegien aus dem Userspace benutzt werden kann, und sie außerdem übersichtlich, einfach, robust und benutzerfreundlich ist und der Einfluß auf das System, seine Konfiguration und andere Software minimal bleibt. ;-)

[1] https://github.com/eliben/code-for-blog/blob/main/2022/go-and-proxies/connect-tunnel-proxy.go [2] https://eli.thegreenplace.net/2022/go-and-proxy-servers-part-2-https-proxies/

Angehängte Dateien:

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren