Quando você configura um soquete de escuta, pode escolher a qual endereço local está vinculado. Isso é feito com a chamada de sistema bind (2). (Você também pode optar por vinculá-lo a 0.0.0.0, o que significa ouvir em todos os endereços locais).
Você disse ao netcat para escutar no localhost. Por isso, chamou bind (2) com 127.0.0.1 (ou similar) como o endereço do soquete. Então, o kernel ligou o socket de escuta apenas a esse endereço.
Quando um pedido de conexão chegou ao 192.168.44.182:20000, o kernel examinou a lista de soquetes de escuta e não encontrou nenhum. Então o kernel recusou a conexão.
Quando uma requisição chegar em 127.0.0.1:20000, o kernel encontrará o soquete de escuta, e o syscall accept (2) informará ao netcat sobre ele.
Para que o netcat ouça todas as interfaces, omita o host: nc -l -p 20000
ou, como alternativa, especifique 0.0.0.0: nc -l 0.0.0.0 -p 20000
. Você também pode especificar o endereço IP específico que deseja ouvir (192.168.44.182), mas é claro que nc localhost 20000
será rejeitado.
(A ligação ao host local geralmente é feita quando você deseja permitir apenas conexões da mesma máquina, por exemplo, por motivos de segurança).