Перш ніж у нас почали вичерпуватися адреси IPv4, ми не (широко) використовували NAT. Кожен комп'ютер, підключений до Інтернету, мав би свою унікальну глобальну адресу. Коли NAT був вперше представлений, він повинен був перейти від надання клієнтам ISP 1 реальної адреси на пристрій, який користувач / користувач використовував, до надання 1 клієнту 1 реальної адреси. Це вирішило проблему на деякий час (роки), коли ми повинні були перейти на IPv6. Замість переходу на IPv6 (здебільшого) всі чекали, коли всі перемкнуться, і тому (в основному) ніхто не скачував IPv6. Зараз ми знову стикаємося з тією ж проблемою, але цього разу розгортається другий шар NAT (CGN), щоб провайдери могли ділитися 1 реальною адресою між декількома клієнтами.
Виснаження IP-адреси не є великою справою, якщо NAT не страшний, в тому числі, коли кінцевий користувач не має над ним контролю (Carrier Grade NAT або CGN).
Але я заперечую, що NAT жахливий, особливо у випадку, коли кінцевий користувач не має над ним контролю. І (як людина, робота якої - мережева інженерія / адміністрування, але має ступінь інженерії програмного забезпечення), я стверджую, що, розгорнувши NAT замість IPv6, адміністратори мережі перенесли вагу вирішення вичерпання адреси зі свого поля та на кінцевих користувачів та розробників додатків.
Отже (на мій погляд), чому НАТ - страшна, зла справа, якої слід уникати?
Давайте подивимось, чи можу я зробити це справедливим, пояснюючи, що це порушує (і які проблеми це спричиняє, що ми так звикли, що навіть не усвідомлюємо, що може бути краще)
- Незалежність мережевого шару
- Зв'язки однорангових
- Послідовне іменування та розташування ресурсів
- Оптимальна маршрутизація трафіку, хости знають свою реальну адресу
- Відстеження джерела шкідливого трафіку
- Мережеві протоколи, які розділяють дані та контролюють окремі з'єднання
Подивимось, чи можу я пояснити кожен із цих пунктів.
Незалежність мережевого шару
Постачальники провайдерів повинні просто проходити навколо пакетів 3 рівня і не хвилюватись, що знаходиться в шарах вище цього. Якщо ви обходите TCP, UDP чи щось краще / більш екзотичне (можливо, SCTP? Або навіть якийсь інший протокол, який кращий, ніж TCP / UDP, але незрозумілий через відсутність підтримки NAT), ваш ISP не повинен турбота; все це повинно просто виглядати як дані для них.
Але це не так - не тоді, коли вони реалізують "другу хвилю" NAT, "Carrier Grade" NAT. Тоді вони обов'язково повинні переглядати та підтримувати протоколи 4 рівня, які ви хочете використовувати. Зараз це практично означає, що ви можете використовувати лише TCP та UDP. Інші протоколи будуть або просто заблоковані / скинуті (переважна більшість випадків у моєму досвіді), або просто передані останньому хосту "всередині" NAT, який використовував цей протокол (я бачив 1 реалізацію, яка робить це). Навіть пересилання до останнього хоста, який використовував цей протокол, не є справжнім виправленням - як тільки два хости використовують його, воно порушується.
Я думаю, що є деякі протоколи заміни TCP & UDP там, які наразі не перевірені та не використовуються саме через цю проблему. Не зрозумійте мене неправильно, TCP & UDP були вражаюче добре розроблені, і дивно, як вони обидва змогли змінити масштаби до того, як ми сьогодні використовуємо Інтернет. Але хто знає, що ми пропустили? Я читав про SCTP, і це звучить добре, але ніколи його не використовував, оскільки це було непрактично через NAT.
Підключення однорангових
Це великий. Власне, найбільший на мій погляд. Якщо у вас є два кінцевих користувача, обидва позаду власного NAT, незалежно від того, хто з них намагається підключитися першим, NAT іншого користувача відкине їхній пакет і з'єднання не вдасться.
Це впливає на ігри, голосовий / відеочат (наприклад, Skype), розміщення власних серверів тощо.
Є обхідні шляхи. Проблема полягає в тому, що ці способи вирішення коштують або час розробника, час та незручності для кінцевого користувача, або вартість інфраструктури послуг. І вони не дурні і іноді ламаються. (Дивіться коментарі інших користувачів про перебої в роботі Skype.)
Одне вирішення - переадресація портів, де ви запрограмуєте пристрій NAT для пересилання певного вхідного порту на певний комп'ютер за пристроєм NAT. Існують цілі веб-сайти, присвячені тому, як це зробити для всіх NAT-пристроїв. Дивіться https://portforward.com/ . Зазвичай це коштує часу кінцевого користувача і розчарування.
Іншим вирішенням є додавання підтримки для таких речей, як пробивання дірок у програмах, та підтримка серверної інфраструктури, яка не відстає від NAT, для впровадження двох клієнтів NATed. Зазвичай це коштує часу на розробку і ставить розробників у позицію потенційно підтримувати інфраструктуру сервера там, де раніше цього не потрібно було б.
(Пам'ятаєте, що я говорив про розгортання NAT замість IPv6, перенесення ваги проблеми з мережевих адміністраторів на кінцевих користувачів та розробників додатків?)
Послідовне іменування / розташування мережевих ресурсів
Оскільки інший адресний простір використовується на внутрішній стороні NAT, а потім на зовнішній стороні, будь-яка послуга, запропонована пристроєм всередині NAT, має декілька адрес, щоб дістатися до неї, і правильний, який потрібно використовувати, залежить від того, звідки клієнт отримує доступ до нього. . (Це все ще є проблемою навіть після того, як переадресація портів працює.)
Якщо у вас є веб-сервер всередині NAT, скажімо, на порт 192.168.0.23 порт 80, а ваш пристрій NAT (маршрутизатор / шлюз) має зовнішню адресу 35.72.216.228, і ви налаштували переадресацію портів для порту TCP 80, тепер ваш Доступ до веб-сервера можна використовувати, використовуючи порт 192.168.0.23 80 АБО 35.72.216.228 порт 80. Той, який ви повинні використовувати, залежить від того, ви знаходитесь всередині або поза NAT. Якщо ви перебуваєте за межами NAT і використовуєте адресу 192.168.0.23, ви не потрапите туди, де вас очікують. Якщо ви перебуваєте всередині NAT, і ви використовуєте зовнішній адресу 35.72.216.228, ви могли б отримати , де ви хочете, якщо ваша реалізація NAT є передовою один , який підтримує шпильку, але тоді веб-сервер, який обслуговує ваш запит, побачить запит як з вашого NAT-пристрою. Це означає, що весь трафік повинен проходити через NAT-пристрій, навіть якщо за мережею NAT є коротший шлях в мережі, і це означає, що журнали на веб-сервері стають набагато менш корисними, оскільки всі вони перераховують пристрій NAT як джерело з'єднання. Якщо ваша реалізація NAT не підтримує шпильки, то ви не потрапите туди, де розраховували піти.
І ця проблема загострюється, як тільки ви використовуєте DNS. Раптом, якщо ви хочете, щоб усе працювало належним чином для чогось, що знаходиться за NAT, ви хочете дати різні відповіді на адресу служби, розміщеної всередині NAT, виходячи з того, хто запитує (AKA split horizon DNS, IIRC). Гидота.
І це все, припускаючи, що у вас є хтось обізнаний про переадресацію портів та шпильку NAT та розділений DNS горизонту. Що з кінцевими користувачами? Які шанси налагодити все це правильно, коли вони купують маршрутизатор споживача та якусь камеру безпеки IP і хочуть, щоб він "просто працював"?
І це призводить мене до:
Оптимальна маршрутизація трафіку, хости знають свою реальну адресу
Як ми бачили, навіть при просунутій шпильці NAT трафік не завжди проходить, хоча й оптимальний шлях. Це навіть у тому випадку, коли досвідчений адміністратор налаштовує сервер і має шпильку NAT. (Дозволений, розділений горизонт DNS може призвести до оптимальної маршрутизації внутрішнього трафіку в руках мережевого адміністратора.)
Що відбувається, коли розробник додатків створює таку програму, як Dropbox, і поширює її кінцевим користувачам, які не спеціалізуються на налаштуванні мережевого обладнання? Зокрема, що трапляється, коли я розміщую 4 Гб файл у своєму спільному файлі, а потім намагаюся отримати доступ до наступного комп’ютера? Чи він безпосередньо передається між машинами, чи мені доводиться чекати, коли він завантажиться на хмарний сервер через повільне WAN-з'єднання, а потім чекати вдруге для завантаження через той же повільний WAN-з'єднання?
Для наївної реалізації вона буде завантажена і потім завантажена, використовуючи серверну інфраструктуру Dropbox, яка не відстає від NAT в якості посередника. Але якби дві машини могли зрозуміти, що вони знаходяться в одній мережі, вони могли просто безпосередньо перенести файл набагато швидше. Отож, для нашої першої менш наївної спроби впровадження ми можемо запитати ОС, якими IP-адресами (v4) є машина, а потім перевірити, чи немає інших машин, зареєстрованих у цьому ж акаунті Dropbox. Якщо він знаходиться в тому ж діапазоні, що і ми, просто перенесіть файл безпосередньо. Це може спрацювати у багатьох випадках. Але навіть тоді виникає проблема: NAT працює лише тому, що ми можемо повторно використовувати адреси. Що робити, якщо адреса 192.168.0.23 та 192.168.0. 42 адреса, зареєстрована в одному обліковому записі Dropbox, насправді є в різних мережах (наприклад, у вашій домашній мережі та у вашій робочій мережі)? Тепер вам доведеться відмовитися від використання інфраструктури сервера Dropbox для посередництва. (Зрештою, Dropbox намагався вирішити проблему, передаючи кожному клієнту Dropbox трансляцію в локальній мережі в надії знайти інших клієнтів. Але ці трансляції не перетинають жодних маршрутизаторів, які у вас можуть бути за NAT, це означає, що це не повне рішення ,особливо у випадку CGN .)
Статичні IP-адреси
Крім того, оскільки перший дефіцит (і хвиля NAT) трапився, коли багато споживчих з'єднань не завжди були на з'єднаннях (наприклад, комутований комунікатор), провайдери могли краще використовувати їх адреси, виділяючи лише публічні / зовнішні IP-адреси, коли ви насправді були підключені. Це означало, що підключившись, ви отримали будь-яку адресу, замість того, щоб завжди отримувати ту саму. Це набагато важче запускає ваш власний сервер, і це ускладнює розробку програм однорангових програм, оскільки їм потрібно мати справу з однолітками, які рухаються, а не за фіксованими адресами.
Затуплення джерела шкідливого трафіку
Оскільки NAT переписує вихідні з'єднання так, ніби вони надходять із самого NAT-пристрою, вся поведінка, добре чи погано, перекочується в одну зовнішню IP-адресу. Я не бачив жодного NAT-пристрою, який записує кожне вихідне з'єднання за замовчуванням. Це означає, що за замовчуванням джерело минулого шкідливого трафіку можна простежити лише на пристрої NAT, через який він пройшов. Хоча обладнання більше корпоративного чи операторського класу може бути налаштоване для реєстрації кожного вихідного з'єднання, я не бачив жодного споживача маршрутизаторів, які це роблять. Я, звичайно, думаю, що буде цікаво дізнатися, чи (і на який термін) провайдери будуть зберігати журнал усіх TCP та UDP-з'єднань, здійснених через CGN, під час їх розгортання. Такі записи знадобляться для розгляду скарг на зловживання та скарги на захист DMCA.
Деякі люди думають, що NAT підвищує безпеку. Якщо це так, то це робиться через незрозумілість. Падіння вхідного трафіку за замовчуванням, яке NAT робить обов'язковим, таке ж, як і справний брандмауер. Наскільки я розумію, що будь-яке обладнання, здатне виконувати відстеження з'єднання, необхідне для NAT, повинно мати змогу запускати потужний брандмауер, тому NAT насправді не заслуговує на це жодних очок.
Протоколи, які використовують друге з'єднання
Такі протоколи, як FTP і SIP (VoIP), як правило, використовують окремі з'єднання для контролю та фактичного вмісту даних. Кожен протокол, який це робить, повинен мати програмне забезпечення, яке називається ALG (шлюз рівня додатків) на кожному пристрої NAT, через який він проходить, або вирішити проблему з допомогою якогось посередника або пробивання отворів. На моєму досвіді, КЗП рідко, якщо взагалі колись оновлюються, і були причиною хоча б пари питань, з якими я розглядався із залученням SIP. Кожного разу, коли я чую, щоб хтось повідомляв, що VoIP не працює для них, оскільки звук працював лише в один бік, я моментально підозрюю, що десь є NAT-шлюз, який скидає пакети UDP, і він не може зрозуміти, що з цим робити.
Підсумовуючи, NAT має тенденцію до порушення:
- альтернативні протоколи до TCP або UDP
- однорангові системи
- доступ до чогось, що знаходиться за NAT
- такі речі, як SIP та FTP. ALGs для вирішення цього питання все ще спричиняє випадкові та дивні проблеми, особливо з SIP.
По суті, шаруватий підхід, який застосовує мережевий стек, порівняно простий і елегантний. Спробуйте пояснити це комусь новому в мережі, і вони неминуче припускають, що їх домашня мережа - це, мабуть, добра, проста мережа, яку намагаються зрозуміти. Я бачив це в декількох випадках, що призводить до досить цікавих (надмірно складних) ідей про те, як працює маршрутизація через плутанину між зовнішніми та внутрішніми адресами.
Я підозрюю, що без NAT VoIP був би всюдисущим та інтегрованим з PSTN, і що дзвінки з мобільного телефону чи комп’ютера були б безкоштовними (за винятком Інтернету, за який ви вже платили). Зрештою, навіщо мені платити за телефон, коли ми з вами можемо просто відкрити потік 64K VoIP, і він працює так само добре, як і PSTN? Схоже, сьогодні проблема №1 з розгортанням VoIP проходить через NAT-пристрої.
Я підозрюю, що ми зазвичай не усвідомлюємо, наскільки простішими можуть бути багато речей, якби у нас була кінцева зв'язок, яку NAT порушив. Люди все ще надсилають по електронній пошті (або Dropbox) файли, тому що якщо основна проблема потребує посередника, коли два клієнта стоять за NAT.