Was wären die Nachteile / Risiken bei der Verwendung von AF_UNSPEC?

8

Von Beej's Guide zur Netzwerkprogrammierung

  

Sie können die Verwendung von IPv4 oder IPv6 im Feld ai_family erzwingen oder es als AF_UNSPEC belassen, um was auch immer zu verwenden. Das ist cool, weil Ihr Code IP-Versionsunabhängig sein kann.

Wie der Titel sagt - was wären die Nachteile (oder Risiken, falls überhaupt), dass immer AF_UNSPEC verwendet wird, anstatt IPv4 oder IPv6 anzugeben?

Oder nur aus einem Grund - wenn die Version angegeben ist, garantiert dies, dass diese und nur diese Version unterstützt wird?

Ein kleiner Hintergrund - Ich denke über das Hinzufügen von Unterstützung für IPv6 in Client-Server (C ++) Anwendungen und beide Versionen sollten unterstützt werden. Also habe ich mich gefragt, ob es besser ist AF_UNSPEC zu benutzen oder es ist besser, die Adresse aus der Zeichenkette zu "erkennen" und AF_INET6 oder AF_INET zu benutzen, abhängig von der Adresse.

    
Kiril Kirov 16.11.2011, 09:49
quelle

3 Antworten

3

Sie müssen zwischen Client- und Serveranwendungen unterscheiden.

Auf dem Client ist es einfach: Rufen Sie einfach getaddrinfo() auf und versuchen Sie jede der Antworten nacheinander, bis Sie eine Verbindung erhalten.

Auf dem Server sind die Dinge etwas schwieriger:

  • Es gibt Systeme, deren IPv4- und v6-Stacks miteinander verbunden sind, da reicht es aus, IPv6 zu hören. Vielleicht muss der Socket aktiviert sein, um beide zu hören.
  • Andere Systeme, wie Windows XP, haben Stacks getrennt, wo diese Verbindung nicht möglich ist. Dort müsste man mit mehreren Sockeln gleichzeitig arbeiten. Lassen Sie mich mich auf die folgenden konzentrieren.

Auch auf Servern kann getaddrinfo() verwendet werden. Dort benutzt du das Flag AI_PASSIVE in den Hints. Dann bekommst du Ergebnisse. Auf diesen müssen Sie nur zuhören und vielleicht die IPV6_V6ONLY -Flagge aktivieren.

accept() sollte entweder nicht blockierend oder mit select() oder poll() ausgeführt werden (nicht sicher, ob Letzteres möglich ist).

    
glglgl 16.11.2011, 15:34
quelle
3

Wie die Dinge sein sollten:

Anwendungen sollten Layer-3-Agnostiker sein. Die Verbindung zu einem anderen System sollte über den Namen erfolgen. Der Name sollte in eine oder mehrere Adressen aufgelöst werden, und die Anwendung sollte eine Verbindung zu ihnen herstellen, ohne auf das tatsächlich verwendete Protokoll zu achten. Auf diese Weise liegt die Netzwerkkonfiguration in der Verantwortung der Netzwerk- und Systemadministratoren. Wenn IPv6 in einem Netzwerk eingeführt wird, funktioniert die Anwendung weiter, ohne den Unterschied zu bemerken.

Einige reale Probleme:

Manchmal ist IPv6 schlecht konfiguriert, eine Firewall weiß nicht, wie man mit IPv6 umgeht, IPv6 wird nur im lokalen Netzwerk ohne Verbindung zum Internet usw. verwendet. Dies sollte kein Problem sein, aber manchmal begegnet man einem schlechte Implementierung oder Konfiguration Um damit fertig zu werden, arbeitet die IETF an einem Entwurf namens happy-eyeballs . Es stellt sicher, dass der Benutzer solche Probleme nicht bemerkt. Schauen Sie sich diesen Entwurf an. Mit den in diesem Entwurf angegebenen Techniken stellen Sie sicher, dass Ihre Anwendung für alle Benutzer gut funktioniert.

    
Sander Steffann 16.11.2011 11:02
quelle
-1

Eines der Risiken bei der Verwendung von AF_UNSPEC besteht darin, dass Sie den Client größeren Antworten von einem böswilligen DNS-Server aussetzen, der versucht, CVE-2015-7547 zu verwenden, um einen Stapelpufferüberlauf zu verursachen und bösartigen Code auszuführen der Kunde. In der Tat ist eine vorgeschlagene Abhilfe für den bekannten Fehler in getaddrinfo die Verwendung von AF_UNSPEC als detaillierte hier zu verhindern im Fehlerbericht. Der Überlauffehler für DNS-Antworten größer als 2K wirkt sich auf glibc ab 2.9 aus und ist in 2.23 behoben. Dies betrifft die meisten derzeit installierten Linux-Distributionen.

    
ClearCrescendo 17.02.2016 18:59
quelle