Існує загальна помилка між NAT (трансляція мережевих адрес) та PAT (переклад адрес порта), саме це ми використовуємо в домашніх маршрутизаторах.
NAT
Припустимо, у нас є мережа з такою топологією:
Private_Network <-------> Маршрутизатор <-------> The_Internet
Інтерфейс маршрутизатора, який підключений до Private_Network, має приватну IP-адресу , тобто ту, яка не є унікальною у The_Internet . З іншого боку, в разі NAT , маршрутизатор має кілька інтерфейсів , підключених до The_Internet . Кожен інтерфейс має унікальну IP-адресу в The_Internet . Тепер припустимо, що Host_A та Host_B перебувають у Private_Network, і вони обидва хочуть отримати доступ до Website_X у The_Internet одночасно. IP-адреси та порти Host_Aпакет буде:
Джерело IP: Host_A 's приватний IP
Source Port: Порт на Host_A
призначення IP: Website_X Загальнодоступна / унікальний IP
Destination Port: Порт , де Website_X сервер «s слухає
і таким же чином для пакета, що надходить від Host_B .
Якщо вихідний IP залишити без змін, Website_X відповість на приватну IP-адресу, тобто не унікальну, і тому пакет ніколи не зможе знайти його назад. Щоб вирішити цю проблему, маршрутизатор перевіряє, чи не використовується одна з його унікальних IP-адрес, підключених до The_Internet . Якщо це так, воно здійснює таке відображення:
Host_A «S приватний IP ======= Router's_unique_IP_K
і тепер пакет, який почався з Host_A, перейшов до Website_X і тепер залишає інтерфейс маршрутизатора, підключеного до The_Internet , матиме форму:
Джерело IP: Router's_unique_IP_K
Source Port: Порт на Host_A
призначення IP: Website_X Загальнодоступна / унікальний IP
порт призначення: порт , де Website_X 'сервер s слухає
Таким чином, ви можете зрозуміти, що існує приватна асоціація від приватних ІС до публічних ІС. Тому, коли пакет прибуває з Website_X до маршрутизатора , ця асоціація перевіряється і IP-адреса пункту призначення змінюється назад на приватну та успішно доставляється правильному хосту.
Як бачите, цей спосіб досить простий, але має один великий недолік: кожен приватний хост повинен мати унікальну IP-адресу, зарезервовану, що дорого, тому ми вибираємо менше унікальних IP-адрес, ніж хостів у приватній мережі. Тому якщо всі приватні хости намагаються отримати доступ до The_Internet одночасно, лише їх підмножина, що дорівнює кількості доступних загальнодоступних IP-адрес, які маршрутизаторматиме, матиме доступ, а решті буде відмовлено.
Щоб протистояти тому, що ми створили PAT .
PAT
PAT - це те, чим користується переважна більшість наших домашніх маршрутизаторів. Основне обмеження полягає в тому, що маршрутизатор має єдину унікальну IP-адресу, за допомогою якої він підключається до The_Internet , але ми все ще хочемо дозволити декільком хостам з приватної мережі одночасно отримати доступ до The_Internet .
Як ми це робимо, "схожий" з тим, як NAT робить це з ключовою різницею: замість того, щоб маршрутизатор тримав пул IP-адреси, він містить пул номерів портів. Точніше, пакет, що надходить на маршрутизатор з Host_A в Private_Network, призначений для Website_X вThe_Internet матиме такий формат:
Джерело IP: Host_A 's приватний IP
Source Port: Порт на Host_A
призначення IP: Website_X Загальнодоступна / унікальний IP
Destination Port: Порт , де Website_X сервер «s слухає
Тепер маршрутизатор виконає два завдання:
- Він змінить вихідний IP на унікальний загальнодоступний IP- маршрутизатор І
- Він змінить вихідний порт на порт з пулу, який підтримує маршрутизатор і не використовується, наприклад, Port_Z
і тепер пакет, який почався з Host_A, перейшов до Website_X і тепер залишає інтерфейс маршрутизатора, підключеного до The_Internet , матиме форму:
Джерело IP: Router's_unique_IP_K
Порт джерела: Port_Z
Destination IP: Website_X Загальнодоступна / унікальний IP
Destination Port: порт , де Website_X 'сервер s слухає
і маршрутизатор збереже таке відображення:
Host_A приватний IP «s і порт на Host_A ======= Port_Z
Чому це працює?
Тепер, коли пакет повертається, маршрутизатор просто перевіряє номер порту призначення та змінює IP-адресу призначення та номер порту призначення відповідно до згаданого відображення, і пакет буде успішно доставлений.
Що робити, якщо я запускаю кілька додатків на одному хості?
Різні програми матимуть різні порти за визначенням, таким чином вони будуть відображені в інший порт від маршрутизатора .
Що робити, якщо кілька хостів намагаються отримати доступ до The_Internet одночасно, і всі вони використовують один і той же додаток?
У різних хостів будуть різні приватні IP-адреси за визначенням, таким чином вони будуть відображені в інший порт від маршрутизатора .
PAT небезпечно балансує в сірому просторі поперечного шару. Номери портів є частиною транспортного протоколу, в той час як маршрутизатори можуть працювати відповідно до Інтернет-протоколу. Тож технічно кажучи, це те, що протоколи не дозволяють. Тому існують, принаймні теоретично, потенційні небезпеки: пул портів обмежений. Тому, якщо моя приватна мережа складається з 1000 хостів, і кожен з них працює port_pool / 10 додатків, у таблиці відображення на маршрутизаторі не вистачає доступних записів, і доступ до програм буде заборонено.
Ця відповідь значно перевищила мою заплановану тривалість, але я сподіваюся, що вона була корисною.