Linux: Blockieren Sie IPv6 für bestimmte Anwendungen / Hostnamen

8

Problem und Ziel

Wir bekommen kein IPv6 von unserem ISP, daher habe ich einen IPv6-Tunnel, der gut funktioniert, aber natürlich nicht sehr schnell ist. Und nicht wirklich zuverlässig. Ich möchte IPv6 "nur für den Fall" zur Verfügung haben, möchte aber, dass bestimmte Hosts (Domänen) nur mit IPv4 verbunden werden.

Standardprotokoll

Es scheint mir, dass alle Anwendungen zuerst IPv6 versuchen; Dies ist wahrscheinlich eine glibc-Einstellung. Es wäre in Ordnung, wenn diese Standardeinstellung umgekehrt würde (für alle Anwendungen).

Netzfilter

Es wäre möglich, IPv6-Adressen / Netzwerke mit Netfilter zu blockieren, aber es gibt zwei Probleme:

  1. Würde dies zu einer Verzögerung führen, da die App auf ein IPv6-Timeout wartet, bevor sie IPv4 versucht?
  2. Einige Domänen scheinen gemischt zu sein, dass es wie Chaos aussieht. Das Trennen von google.com und youtube.com scheint etwas zu sein, das Sie nicht tun möchten, wenn Sie es vermeiden können.

Ich stelle nur fest, dass in der Manpage ip routefür den Routing-Typ Folgendes angegeben ist unreachable:

Die lokalen Absender erhalten einen EHOSTUNREACH-Fehler.

Passiert das auch mit Netfilter DROPs oder REJECTs? Ein solcher Fehler sollte keine relevante Verzögerung verursachen.

DNS-Filterung

Eine andere Lösung (ziemlich einfach, wenn dies möglich ist) wäre das Filtern von AAAA-Datensätzen für bestimmte Domänen. Wenn dies nicht (einfach) möglich ist: Ist es möglich, den DNS-Server und Netfilter so zu verbinden, dass ich weiß, dass "IP-Adresse X zur Domäne Y gehört", damit ich sie zu Netfilter hinzufügen kann? Was ist eleganter, als alles zu protokollieren und das Protokoll zu erfassen?

Der Weg, den man gehen sollte?

Welche (anderen) Möglichkeiten gibt es und welche ist die einfachste?

Hauke ​​Laging
quelle
2
Sie werden wirklich nichts bemerken, was Happy Eyeballs ( RFC 6555 ) implementiert , wie beispielsweise moderne Webbrowser.
Michael Hampton
DNS ist nicht wirklich so konzipiert. In jedem Fall können Sie einen zuverlässigeren Tunnelservice versuchen.
Michael Hampton

Antworten:

16

Sie können die Adressauswahl mit steuern /etc/gai.conf. Die Konfigurationsdatei ist gut dokumentiert und enthält bereits die Standardeinstellungen, sodass Sie einfach mit dem Optimieren beginnen können.

Die interessanten Standardeinstellungen hier sind:

label  ::1/128       0
label  ::/0          1
label  2002::/16     2
label ::/96          3
label ::ffff:0:0/96  4
precedence  ::1/128       50
precedence  ::/0          40
precedence  2002::/16     30
precedence ::/96          20
precedence ::ffff:0:0/96  10

In der letzten Zeile werden alle IPv4-Adressen am wenigsten bevorzugt.

Wenn Sie allen IPv4 eine höhere Präferenz geben möchten, können Sie dies ändern in:

precedence ::ffff:0:0/96  100

Wenn Sie nur bestimmten IPv4-Adressen oder -Blöcken eine höhere Präferenz geben möchten, können Sie diese ebenfalls angeben. Denken Sie daran, dass Sie ein IPv4-zugeordnetes IPv6 in hex verwenden müssen.

Um 203.0.113.0/24 gegenüber allen IPv6-Versionen zu bevorzugen, fügen Sie Folgendes hinzu:

label ::ffff:cb00:7100/120 5
precedence ::ffff:cb00:7100/120 100

Starten Sie laufende Anwendungen neu, damit sie die von Ihnen vorgenommenen Änderungen übernehmen.


Auf von Debian abgeleiteten Systemen /etc/gai.confist bereits vorhanden. Auf von Red Hat abgeleiteten Systemen fehlt es, aber eine Beispieldatei befindet sich unter /usr/share/doc/glibc-common-*/gai.conf; kopiere es einfach nach /etc.

Michael Hampton
quelle
Noch nie davon gehört; toller Hinweis, obwohl es keine DNS-Lösung ist.
Hauke ​​Laging
Sie fragten nach der einfachsten Methode ... :)
Michael Hampton
4

OK, hier ist eine ganz andere Antwort.

Platzieren Sie die fehlerhaften Hosts mit beschissener IPv6-Konnektivität /etc/hostsmit der entsprechenden IPv4-Adresse.

Zum Beispiel:

199.7.53.74 whois.verisign-grs.com

Denken Sie daran, sie zu entfernen, wenn sich ihre (in diesem Fall) oder Ihre IPv6-Konnektivität verbessert.

Michael Hampton
quelle
1
Das wäre für einen einzelnen Host mit einer einzelnen IP einfach. Wie ich bereits erwähnte, handelt es sich um **. Youtube.com. Daher sind viele Hostnamen betroffen. Theoretisch wäre dies mit DNS einfach: "AAAA-Einträge für alles in .youtube.com blockieren". Ihr Ansatz wäre es, alle diese Adressen einzugeben (wahrscheinlich ändern sie weder ihre Domänenstruktur noch ihre IPs häufig und es wäre in Ordnung, dies jeden Tag durch ein Skript überprüfen zu lassen) /etc/hosts. Wenn niemand auf "DNS-Serversoftware XY kann auf diese Weise filtern !!" Ich werde wahrscheinlich damit enden.
Hauke ​​Laging
Ich bin mit fast jedem bekannten DNS- Serverpaket vertraut , und keiner macht das, was Sie zu wollen scheinen, einfach oder überhaupt nicht. Wenn Sie jetzt Ihren eigenen benutzerdefinierten Code schreiben möchten, besteht die eigentliche Lösung natürlich darin, Ihre IPv6-Konnektivität zu verbessern. Versuchen Sie es mit einem anderen Tunnelbroker?
Michael Hampton