Linux: Bloquer IPv6 pour certaines applications / noms d'hôte

8

Problème et objectif

Nous n'obtenons pas IPv6 de notre FAI, j'ai donc un tunnel IPv6 qui fonctionne bien mais qui, bien sûr, n'est pas très rapide. Et pas vraiment fiable. J'aime avoir IPv6 disponible "juste au cas où" mais je veux que certains hôtes (domaines) soient connectés avec IPv4 uniquement.

Protocole par défaut

Il me semble que toutes les applications essaient d'abord IPv6; il s'agit probablement d'un paramètre glibc. Je serais bien si ce défaut était inversé (pour toutes les applications).

Netfilter

Il serait possible de bloquer les adresses / réseaux IPv6 avec Netfilter mais il y a deux problèmes:

  1. Cela entraînerait-il un retard lorsque l'application attend un délai IPv6 avant d'essayer IPv4?
  2. Certains domaines semblent être mixtes, cela ressemble à du chaos. Séparer google.com et youtube.com semble être quelque chose que vous ne voulez pas faire si vous pouvez l'éviter.

Je note simplement que la page de manuel de ip routeindique le type de routage unreachable:

Les expéditeurs locaux obtiennent une erreur EHOSTUNREACH.

Est-ce la même chose avec les DROP ou REJETS de Netfilter? Une telle erreur ne devrait pas entraîner de retard significatif.

Filtrage DNS

Une autre solution (plutôt facile si possible) serait de filtrer les enregistrements AAAA pour certains domaines. Si ce n'est pas (facilement) possible: est-il possible de connecter le serveur DNS et Netfilter pour que je sache que "l'adresse IP X appartient au domaine Y" afin de pouvoir l'ajouter à Netfilter? Quelque chose de plus élégant que de tout enregistrer et de saluer le journal?

Le chemin à parcourir?

Quelles (autres) possibilités existent et quelle est la plus simple?

Hauke ​​Laging
la source
2
Vous ne remarquerez vraiment rien avec ce qui implémente Happy Eyeballs ( RFC 6555 ), comme les navigateurs Web modernes.
Michael Hampton
Le DNS n'est pas vraiment conçu pour fonctionner de cette façon. Dans tous les cas, vous pouvez essayer un service de tunnel plus fiable.
Michael Hampton

Réponses:

16

Vous pouvez contrôler la sélection d'adresse avec /etc/gai.conf. Le fichier de configuration est bien documenté et contient déjà les valeurs par défaut, vous pouvez donc simplement commencer à peaufiner.

Les valeurs par défaut intéressantes sont les suivantes:

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

La dernière ligne donne la préférence la plus basse à toutes les adresses IPv4.

Si vous souhaitez donner une préférence plus élevée à tous les IPv4, vous pouvez le changer en:

precedence ::ffff:0:0/96  100

Si vous souhaitez uniquement donner une préférence plus élevée à des adresses ou blocs IPv4 spécifiques, vous pouvez également les spécifier. N'oubliez pas que vous devez utiliser un IPv6 mappé IPv4 en hexadécimal.

Donc, pour donner la préférence à 203.0.113.0/24 sur tout IPv6, vous ajouteriez:

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

Redémarrez les applications en cours d'exécution pour qu'elles reprennent les modifications que vous apportez.


Sur les systèmes dérivés de Debian, /etc/gai.confest déjà présent. Sur les systèmes dérivés de Red Hat, il est absent, mais un exemple de fichier se trouve à /usr/share/doc/glibc-common-*/gai.conf; il suffit de le copier /etc.

Michael Hampton
la source
Jamais entendu parler de ça avant; excellent indice même s'il ne s'agit pas d'une solution DNS.
Hauke ​​Laging
Vous avez demandé la méthode la plus simple ... :)
Michael Hampton
4

OK, voici une réponse complètement différente.

Placez les hôtes incriminés avec une connectivité IPv6 pourrie /etc/hostsavec leur adresse IPv4 correspondante.

Par exemple:

199.7.53.74 whois.verisign-grs.com

N'oubliez pas de les supprimer lorsque leur (dans ce cas) ou votre connectivité IPv6 s'améliore.

Michael Hampton
la source
1
Ce serait facile pour un seul hôte avec une seule IP. Comme je l'ai mentionné, il s'agit de **. Youtube.com. Ainsi, de nombreux noms d'hôtes sont affectés. En théorie, cela serait facile avec DNS: "Bloquer les enregistrements AAAA pour tout sur .youtube.com". Votre approche serait de mettre toutes ces adresses (probablement elles ne changent pas souvent leur structure de domaine ni leurs IPs et ce serait bien d'avoir un script qui vérifie cela tous les jours) /etc/hosts. Si personne ne propose "le logiciel de serveur DNS XY peut filtrer de cette façon !!" Je vais probablement finir avec ça.
Hauke ​​Laging
Je connais presque tous les packages de serveurs DNS connus, et aucun ne fait ce que vous semblez vouloir, facilement ou pas du tout. Maintenant, si vous voulez écrire votre propre code personnalisé ... mais la vraie solution est bien sûr d'améliorer votre connectivité IPv6. Essayez un autre courtier en tunnels?
Michael Hampton