[Linux] [MASQUERADING] Les ports, c'est quoi ?
Daniel Huhardeaux
daniel.huhardeaux@::1
Mer 18 Aou 18:41:25 CEST 2021
Complément
Le 18/08/2021 à 14:55, Antoine Delaporte a écrit :
> [...]
>> . si je prends un poste IP SNOM il sort systematiquement avec le port
>> 2048 comme port source de l'IP publique.
>
> Bon, ca c'est plus sérieux, on tape dans mon acculturation : Selon une
> légende que j'ai entendu (ie, jamais pris le temps de regarder, ni
> comprendre comment ça marche) mais il existerais un mécanisme qui
> permettrais a un équipement Internet de se faire natter a l’extérieur
> sur un port particulier. Cela me dérange bcp intellectuellement (coté
> sécu c'est pas GG, c'est plutôt LéGé, pour LaGaffe Gaston)
>
> Donc si quelqu'un un jour s'ennuie, je ne suis pas contre un bon pointeur.
Si déjà je m'ennuie, que ce soit pour la bonne cause :D
dh@::1:~$ sudo cat /proc/sys/net/ipv4/ip_local_port_range
32768 60999
J'ai réalisé le test sur Debian 10, Ubuntu 20 et RHEL8, même valeurs.
Info donnée par la liste NetFilter.
En fait il semble que ce soit la source et non le NAT qui décide du port
source externe. qui sera rectifié par le FW si pas libre.
Extraits:
1) Are you talking about SNAT/MASQUERADE?
It will try to use whatever port is used. If the source address
replacement results in a collision, it tries to pick a different source
port between 1024 and 65535. The initiator is free to pick whatever
source port they like
2) the port number for outgoing NATted connections is chosen from the
emphemeral port number range, which can be read and configured via the
/proc/sys/net/ipv4/ip_local_port_range file.
While one probably could use NAT rules to force an outgoing connection
to use a particular source port, it would not make sense to do so
because that would lead to problems when two hosts on the internal
network would try to connect to the same outside service, since the port
tuple for both connections would be identical, which means that they
would be mapped to the same connection.
I'm guessing that on the system that establishes an outgoing connection,
i.e. a SNOM phone, one can chose to use a fixed source port
programmatically by setting a port number in the sockaddr_in structure
that's passed to the connect() syscall. I'm presuming you'd get a
EADDRNOTAVAIL error when that port is already in use. You can probably
look this up in Stevens' TCP/IP Illustrated.
3) a tuple is "src-ip:src-port dst-ip:dst-port" and as long there is no
collision it's 1:1, if there is a collison a random port is used -
that's what conntrack is for
4) bind() fails for listener socket, connect() fails for outgoing (if
everything is full). On conntrack machine, connection tracking table
gets queried after SNAT to see if the new tuple is still unique.
Ca te va ;) ?
--
Daniel
Plus d'informations sur la liste de diffusion linux