Como fazer 'nc' escutar em uma porta sem configurar 'SO_REUSEPORT'

1

Eu quero que um comando nc ouça em uma porta TCP, então fiz:

nc -lv 8888

Em seguida, em outro console, verifiquei se outro programa que tentasse escutar na mesma porta receberia um tipo de erro Address already in use , então emiti o mesmo comando novamente:

nc -lv 8888

Para minha surpresa, o segundo comando também teve sucesso. Investigando como dois programas podem estar escutando na mesma porta TCP, descobri que isso é possível se o socket de escuta for aberto com a opção SO_REUSEPORT , então imagino nc está usando.

Como posso fazer com que nc não permita que outros programas usem a mesma porta? Eu gostaria que ele ouvisse na porta 8888 e tenha certeza de que é o único programa que estará escutando naquela porta.

Até agora eu consegui fazer o que eu quero, introduzindo socat ao longo de nc da seguinte forma:

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

Porque socat impede que qualquer outro programa ouça na mesma porta.

Mas é possível realizar isso apenas com nc ?

    
por MondKin 11.05.2018 / 19:13

1 resposta

2

Olhando para um dos códigos-fonte do netcat netcat.c no método 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

Em seguida, para modificar o comportamento, você precisa modificar o código.

No entanto, fiz um teste com o netcat-openbsd 1.105-7 que faz parte do Ubuntu Xenial e parece construído sem definir SO_REUSEPORT. Como definiu SO_REUSEADDR, mas não SO_REUSEPORT (sob um kernel > 3.9), funciona como se você esperasse recusar executar uma segunda intance na mesma porta.

    
por 11.05.2018 / 23:02