4 votes

Comment faire en sorte que `nc` écoute sur un port sans définir `SO_REUSEPORT`

Je veux que la commande nc écoute sur un port TCP, donc j'ai fait :

nc -lv 8888

Ensuite, dans une autre console, j'ai vérifié si un autre programme tentant d'écouter sur le même port obtiendrait une erreur de type Adresse déjà utilisée, donc j'ai émis à nouveau la même commande :

nc -lv 8888

À ma grande surprise, la deuxième commande a également réussi. En enquêtant sur la façon dont 2 programmes peuvent écouter sur le même port TCP, j'ai découvert que c'est possible si le socket d'écoute est ouvert avec l'option SO_REUSEPORT, donc je imagine que nc l'utilise.

Comment puis-je faire en sorte que nc interdise à d'autres programmes d'utiliser le même port ? Je voudrais qu'il écoute sur le port 8888 et m'assurer que c'est le seul programme qui écoutera sur ce port.

Jusqu'à présent, j'ai réussi à faire ce que je veux en introduisant socat avec nc de cette manière :

socat TCP-LISTEN:8888,fork TCP:localhost:4444
nc -lv 4444

Parce que socat interdit à tout autre programme d'écouter sur le même port.

Mais est-il possible d'accomplir cela avec uniquement nc ?

5voto

Spencer Berry Points 21

En regardant l'un des codes sources de netcat netcat.c dans la méthode local_listen :

        ret = setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &x, sizeof(x));
        if (ret == -1)
            err(1, NULL);

# if defined(SO_REUSEPORT)
        ret = setsockopt(s, SOL_SOCKET, SO_REUSEPORT, &x, sizeof(x));
        if (ret == -1)
            err(1, NULL);
# endif

Ensuite, pour modifier le comportement, vous devez modifier le code.

Cependant, j'ai fait un test avec netcat-openbsd 1.105-7 qui fait partie d'Ubuntu Xenial et il semble être construit sans avoir défini SO_REUSEPORT. Comme il a défini SO_REUSEADDR mais pas SO_REUSEPORT (sous un noyau > 3.9), il fonctionne comme vous vous attendez en refusant d'exécuter une deuxième instance sur le même port.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X