would it hurt the kernel to "borrow" the port from the TCP port pool when it becomes actively masqueraded?
Eu acho que a resposta é "não, mas não importa muito".
Eu assumi incorretamente que R usava apenas o endereço de transporte de destino do pacote de resposta para dizer se ele estava indo para A ou em si. Na verdade, parece usar toda a tupla de endereços de transporte de destino-origem para identificar uma conexão. Portanto, é normal que o NAT crie várias conexões usando a mesma porta ( R propriedade); isso não cria confusão. Conseqüentemente, os pools de portas TCP / UDP não importam.
É bem óbvio agora que penso nisso.
I then tried to open the following client on R:
nc -4 192.0.2.8 60000 -p 50000
. I sent messages, nothing happens. No packets can be seen on R's tcpdump.
Esta é a parte das experiências em que eu errei.
A falha ocorre porque os endereços de transporte de destino e de origem são os mesmos, não apenas porque o endereço de origem é o mesmo.
Se eu, digamos, nc -4 192.0.2.8 60001 -p 50000
, realmente funciona. Mesmo se estiver usando a mesma porta que uma máscara de NAT.
I feel the NAT's behaviour is wrong. I could accidentally configure a port for both masquerading (particularly, by not specifying
--to-ports
during the iptables rule) and a service, and the kernel will drop connections silently.
Não, porque as conexões mascaradas e as conexões iniciadas por R provavelmente terão destinos diferentes.
Because the masquerade rule exists, or at least because it's active, I would have expected R's nc to fail with the error message "nc: Address already in use", which is what happens if I bind two ncs to the same port.
Eu ainda estou procurando uma resposta à prova de balas para isso, mas tudo parece apontar para "é uma consequência adversa de como ela é implementada, e é tão pequena que estamos dispostos a conviver com isso".