Pourquoi les connexions TCP IPv4 s'affichent-elles en tant que TCP6?


30

Voici la sortie de netsat -tupnsur mon serveur Debian Jessie:

Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 10.0.0.12:445           10.0.0.20:49729         ESTABLISHED 26277/smbd      
tcp        0      0 10.0.0.12:443           10.0.0.21:44162         ESTABLISHED 1400/nginx: worker 
tcp        0      0 10.0.0.12:445           10.0.0.21:46650         ESTABLISHED 23039/smbd      
tcp        0      0 10.0.0.12:443           10.0.0.20:54584         ESTABLISHED 1400/nginx: worker 
tcp        0      0 10.0.0.12:139           10.0.0.225:10425        ESTABLISHED 23701/smbd      
tcp        0      0 10.0.0.12:445           10.0.0.217:49179        ESTABLISHED 21535/smbd      
tcp        0      0 10.0.0.12:445           10.0.0.217:49178        ESTABLISHED 21534/smbd      
tcp        0      0 10.0.0.12:445           10.0.0.20:64636         ESTABLISHED 21470/smbd      
tcp        0      0 10.0.0.12:443           10.0.0.21:44198         ESTABLISHED 1400/nginx: worker 
tcp        0      0 10.0.0.12:2049          10.0.0.16:752           ESTABLISHED -               
tcp        0      0 10.0.0.12:222           10.0.0.21:55514         ESTABLISHED 23111/sshd: redacted
tcp6       0      0 10.0.0.12:4243          10.0.0.20:64702         ESTABLISHED 31307/java      
tcp6       0      0 10.0.0.12:48932         162.222.40.93:443       ESTABLISHED 31307/java      
tcp6       0      0 10.0.0.12:49093         216.17.8.47:443         ESTABLISHED 31307/java 

Le PID 31307 est le moteur de sauvegarde CrashPlan , version Java 1.7.0_45. Les deux adresses IPv4 non RFC1918 sont les serveurs de CrashPlan et 10.0.0.20:64702mon ordinateur exécute le client.

Pourquoi les trois dernières connexions s'affichent-elles comme tcp6 alors qu'elles sont des adresses IPv4?

Réponses:


33

Cela se produit car par défaut, les sockets AF_INET6 fonctionnent réellement pour IPv4 et IPv6. Voir section 3.7 - Compatibilité avec les nœuds IPv4 de RFC 3493 - Extensions d'interface de socket de base pour IPv6

Voici un court exemple de code qui peut produire ce genre de situation:

#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>

#define TEST_PORT 5555

#define xstr(s) str(s)
#define str(x) #x

int main (int argc, char **argv)
{
    int v6server;
    int v4client;
    int rc;

    struct sockaddr_in6 s6addr = {
        .sin6_family = AF_INET6,
        .sin6_flowinfo = 0,
        .sin6_port = htons(TEST_PORT),
        .sin6_addr = in6addr_any
    };

    struct sockaddr_in c4addr = {
        .sin_family = AF_INET,
        .sin_port = htons(TEST_PORT),
        .sin_addr = inet_addr("127.0.0.1")
    };

    // Open an IPv6 listener
    v6server = socket(AF_INET6, SOCK_STREAM, 0);
    if (v6server < 0) perror("socket()");

    rc = bind(v6server, (struct sockaddr *)&s6addr, sizeof(s6addr));
    if (rc != 0) perror("bind()");

    rc = listen(v6server, 0);
    if (rc != 0) perror("listen()");

    // Connect to the listener with an IPv4 socket
    v4client = socket(AF_INET, SOCK_STREAM, 0);
    if (v4client < 0) perror("socket()");

    rc = connect(v4client, (struct sockaddr *)&c4addr, sizeof(c4addr));
    if (rc != 0) perror("connect()");

    // inspect open sockets
    system("netstat -tan | grep " xstr(TEST_PORT));

    close(v4client);
    close(v6server);
}

La sortie sur ma machine Ubuntu est:

$ make v4v6
cc     v4v6.c   -o v4v6
$ ./v4v6 
tcp        0      0 127.0.0.1:46518         127.0.0.1:5555          ESTABLISHED
tcp6       0      0 :::5555                 :::*                    LISTEN     
tcp6       0      0 127.0.0.1:5555          127.0.0.1:46518         ESTABLISHED
$ 
  • L' tcp6 LISTENentrée est pour le socket écoutant sur le port 5555. Notez qu'il s'agit d'un socket AF_INET6, il acceptera donc les connexions entrantes IPv4 et IPv6.
  • L' tcp ESTABLISHEDentrée est le résultat de la connexion d'un socket AF_INET4 à l'écouteur (connexion active).
  • L' tcp6 ESTABLISHEDentrée concerne la connexion passive générée à partir du socket d'écoute. Il apparaît comme tcp6, car il est généré par un tcp6auditeur; cependant, il représente une connexion à partir d'un IPv4.

Il convient de noter les éléments suivants:

  • Ce comportement est spécial pour les sockets AF_INET6. Les sockets AF_INET (IPv4) ne peuvent tout simplement pas et ne traiteront rien IPv6.
  • Ce comportement peut être remplacé par l' option de socket IPV6_V6ONLY . La définition de cette option entraînera le socket à gérer uniquement IPv6 et n'autorisera rien IPv4.
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.