NAT отлично справляется со своей задачей, но переадресация портов выполняет другую работу. Чтобы понять это, важно помнить разницу между входящими и исходящими соединениями.
Предположим, что у нас с тобой будет телефонный разговор. Я могу позвонить вам, или вы можете позвонить мне. В любом случае мы сможем отправлять сообщения (предложения) туда и обратно, но есть разница в том, кто начинает вызов. Если я позвоню вам, это исходящее соединение для меня и входящее соединение для вас. Чтобы это было возможно, мне нужно сначала узнать ваш номер телефона. Когда вы берете трубку, вы получаете мой номер звонящего (это мой номер телефона). В целях объяснения позвольте нам сделать вид, что вам нужно знать мой номер телефона, чтобы поговорить со мной.
Теперь представьте, что наши телефонные звонки маршрутизируются через два других телефона (маршрутизатора), которые связаны со многими людьми:
You <----> Router 1 <----> Router 2 <----> Me
^ ^
| |
v v
Many Many
Others Others
Чтобы усложнить ситуацию, я знаю только номер телефона маршрутизатора 1, а не ваш личный номер. И наоборот, вы знаете только номер телефона маршрутизатора 2, а не мой личный номер. Когда я звоню тебе, у нас две проблемы:
- Маршрутизатор 1 каким-то образом должен знать, что вызов должен идти к вам, а не к одному из множества других, с которыми он соединяется.
- Маршрутизатор 2 каким-то образом должен знать, что когда вы отвечаете, предложение должно быть отправлено мне, а не кому-то другому.
Переадресация порта решает проблему 1. Вызов Super User - это услуга, которая по соглашению осуществляется через порт 42. Вы говорите маршрутизатору 1 переадресовывать вам все вызовы о суперпользователе, поэтому, когда я вызываю маршрутизатор 1 через порт 42, я могу поговорить с вами. Если вы не указали явно Маршрутизатору 1 сделать это, мы не сможем позвонить.
NAT решает проблему 2. Маршрутизатор 2 притворяется вызывающим абонентом, потому что ни вы, ни Маршрутизатор 1 не займитесь телефоном, если идентификатор звонящего неизвестен (мой номер телефона). Затем он вспоминает, что я фактический вызывающий абонент, поэтому, когда маршрутизатор 2 получает ответ от маршрутизатора 1, он знает, чтобы отправить его мне.
Ситуация в интернете практически такая же. Вам просто нужно мысленно заменить телефоны компьютерами, номера телефонов и идентификаторы звонящих по IP-адресам, а неизвестные номера телефонов зарезервированными IP-адресами (например, 192.168.*.* спектр).