«Трансляция адресов портов (PAT) разрешает конфликты, возникающие, когда несколько хостов используют один и тот же номер исходного порта для установления различных внешних соединений в одно и то же время. Затем PAT может назначить соединению номер порта изпул доступных портов, вставив этот номер порта в поле исходного порта.
https://en.wikipedia.org/wiki/Перевод_сетевого_адреса
А что если у нас есть десятки высокомасштабируемых серверов, которые принимают тысячи запросов? Исчерпание портов кажется очень простым пределом (64k), которого мы легко достигнем.
Как отрасль справляется с такими сценариями?
решение1
В конце концов, NAT на самом деле сводится к таблице поиска на устройстве NAT, содержащей сопоставления того, какие соединения куда идут. Однако эти записи таблицы создаются наза сеансоснова.
Пример. Если у меня есть хост в10.10.10.10, желающий связаться с сервером в Интернете по адресу8.8.8.8, через мой интернет-шлюз, публичный IP-адрес которого1.1.1.1, когда происходит это взаимодействие, мой интернет-шлюз может создать пару записей, выглядящих примерно так:
Источник | Спорт | Место назначения | Дпорт | Действия |
---|---|---|---|---|
10.10.10.10 | 20000 | 8.8.8.8 | 80 | SNAT 10.10.10.10:20000 --> 1.1.1.1:40000 |
8.8.8.8 | 80 | 1.1.1.1 | 40000 | ДНКАТ 1.1.1.1:40000 --> 10.10.10.10:20000 |
Хотя может показаться, что1.1.1.1:40000теперь занято для этого сеанса, теперь оставляя ~63999 портов, это не совсем так. Поскольку эти записи на основе сеанса, было бы совершенно разумно, чтобы последующие коммуникации происходили и выстраивали таблицу следующим образом:
Источник | Спорт | Место назначения | Дпорт | Действия |
---|---|---|---|---|
10.10.10.10 | 20000 | 8.8.8.8 | 80 | SNAT 10.10.10.10:20000 --> 1.1.1.1:40000 |
8.8.8.8 | 80 | 1.1.1.1 | 40000 | ДНКАТ 1.1.1.1:40000 --> 10.10.10.10:20000 |
10.10.10.10 | 20001 | 8.8.8.8 | 81 | SNAT 10.10.10.10:20001 --> 1.1.1.1:40000 |
8.8.8.8 | 81 | 1.1.1.1 | 40000 | ДНКАТ 1.1.1.1:40000 --> 10.10.10.10:20001 |
10.10.10.10 | 20002 | 8.8.4.4 | 80 | SNAT 10.10.10.10:20002 --> 1.1.1.1:40000 |
8.8.4.4 | 80 | 1.1.1.1 | 40000 | ДНКАТ 1.1.1.1:40000 --> 10.10.10.10:20002 |
10.10.10.10 | 20003 | 8.8.4.4 | 81 | SNAT 10.10.10.10:20003 --> 1.1.1.1:40000 |
8.8.4.4 | 81 | 1.1.1.1 | 40000 | ДНКАТ 1.1.1.1:40000 --> 10.10.10.10:20003 |
Итак, на публичном интерфейсе (где обычно возникает беспокойство по поводу исчерпания NAT) мы видим, что фактически существует 4 сеанса:
1.1.1.1:40000 --> 8.8.8.8:80
1.1.1.1:40000 --> 8.8.8.8:81
1.1.1.1:40000 --> 8.8.4.4:80
1.1.1.1:40000 --> 8.8.4.4:81
но эти 4 сеанса не полностью используют 4 порта, и устройство NAT точно знает, куда следует направлять трафик, принадлежащий любому из этих 4 сеансов.
Так что, хотя может показаться, что существует ограничение на порт в 64k, на самом деле это больше похоже на 64k на сокет назначения (с некоторыми оговорками). Не неисчерпаемый, но, безусловно, более масштабируемый, чем плоские 64k.