
- •Тема 1. Мережеві операційні системи, ос FreeBsd
- •Контрольні питання
- •Література
- •Тема 2. Ядро ос FreeBsd і управління програмним забезпеченням
- •Література
- •Тема 3. Мережева підсистема FreeBsd
- •Література
- •Тема 4. Маршрутизація трафіку в ос FreeBsd
- •Література
- •Тема 5. Динамічне налаштування мережевих інтерфейсів
- •Література
- •Тема 6. Засоби фільтрації трафіку
- •Література
- •Тема 7. Трансляція мережевих адрес
- •Література
- •Тема 8. Служба доменних імен
- •Література
- •Тема 9. Поштові служби. Протоколи smtp, pop3
- •Література
- •Тема 10. Протокол imap
- •Література
- •Тема 11. Обмін файлами у мережах. Протокол ftp
- •Література
- •Тема 12. Обмін файлами у мережах. Nfs, smb, BitTorrent
- •Література
- •Тема 13. Веб-сервер на основі ос FreeBsd
- •Література
- •Тема 14. Проксі –сервер. Сервіси моніторингу
- •Література
- •Тема 15. Захищені віртуальні канали. Стек протоколів ipSec
- •Література
Література
Дэвид В. Чепмен, мл., Энди Фокс Брандмауэры Cisco Secure PIX = Cisco® Secure PIX® Firewalls. – М.: «Вильямс», 2003. – С. 384. – ISBN 1-58705-035-8
Тема 7. Трансляція мережевих адрес
Технологія NAT
NAT (від англ. Network Address Translation – «перетворення мережевих адрес») - це механізм в мережах TCP/IP, що дозволяє перетворювати IP-адреси транзитних пакетів (див. рисунок 7.1). Також має назви IP Masquerading, Network Masquerading і Native Address Translation.
Рисунок 7.1 – Принцип роботи NAT
Перетворення адрес методом NAT може проводитися майже будь-яким маршрутизуючого пристроєм – маршрутизатором, сервером доступу, міжмережевим екраном. Найбільш популярним є SNAT, суть механізму якого полягає в заміні адреси джерела (англ. source) при проходженні пакета в один бік і зворотного заміні адреси призначення (англ. destination) у відповідному пакеті. Поряд з адресами джерело/призначення можуть також замінюватися номери портів джерела і призначення.
Приймаючи пакет від локального комп'ютера, роутер дивиться на IP-адресу призначення. Якщо це локальний адресу, то пакет пересилається іншому локальному комп'ютеру. Якщо ні, то пакет треба переслати назовні в Інтернет. Але ж зворотною адресою у пакеті вказано локальний адресу комп'ютера, який з Інтернету буде недоступний. Тому роутер «на льоту» виробляє трансляцію IP-адреси і порту і запам'ятовує цю трансляцію у себе в тимчасовій таблиці. Через деякий час після того, як клієнт і сервер закінчать обмінюватися пакетами, роутер зітре у себе в таблиці запис про n-ий порт за строком давності.
Крім source NAT (надання користувачам локальної мережі з внутрішніми адресами доступу до мережі Інтернет) часто застосовується також destination NAT, коли звернення ззовні транслюються міжмережевим екраном на комп'ютер користувача в локальній мережі, що має внутрішній адресу і тому недоступний ззовні мережі безпосередньо (без NAT).
Існує 3 базових концепції трансляції адрес: статична (Static Network Address Translation), динамічна (Dynamic Address Translation), маскарадний (NAPT, NAT Overload, PAT).
Статичний NAT – Відображення незареєстрованого IP-адреси на зареєстрований IP-адресу на підставі один до одного. Особливо корисно, коли пристрій повинен бути доступним зовні мережі.
Динамічний NAT – Відображає незареєстрований IP-адресу на зареєстровану адресу від групи зареєстрованих IP-адрес. Динамічний NAT також встановлює безпосереднє відображення між незареєстрованим та зареєстрованим адресою, але відображення може мінятися залежно від зареєстрованої адреси, доступного в пулі адрес, під час комунікації.
Перевантажений NAT (NAPT, NAT Overload, PAT, маськарадінг) – форма динамічного NAT, який відображає кілька незареєстрованих адрес в єдиний зареєстрований IP-адреса, використовуючи різні порти. Відомий також як PAT (Port Address Translation). При перевантаженні кожен комп'ютер у приватній мережі транслюється в той же самий адресу, але з різним номером порту.
Механізм NAT визначений в RFC 1631, RFC 3022.
NAT виконує три важливі функції:
Дозволяє заощадити IP-адреси (тільки у випадку використання NAT в режимі PAT), транслюючи декілька внутрішніх IP-адрес в один зовнішній публічний IP-адресу (або в декілька, але меншою кількістю, ніж внутрішніх). За таким принципом побудована більшість мереж в світі: на невеликий район домашньої мережі місцевого провайдера або на офіс виділяється 1 публічний (зовнішній) IP-адресу, за яким працюють і отримують доступ інтерфейси з приватними (внутрішніми) IP-адресами.
Дозволяє запобігти або обмежити обіг зовні до внутрішніх хостам, залишаючи можливість звернення зсередини назовні. При ініціації з'єднання зсередини мережі створюється трансляція. Відповідь пакети, вступники зовні, відповідають створеної трансляції і тому пропускаються. Якщо для пакетів, що надходять зовні, відповідної трансляції не існує (а вона може бути створеною при ініціації з'єднання або статичної), вони не пропускаються.
Дозволяє приховати певні внутрішні сервіси внутрішніх хостів/серверів. По суті, виконується та ж зазначена вище трансляція на певний порт, але можливо підмінити внутрішній порт офіційно зареєстрованої служби (наприклад, 80-й порт TCP (HTTP-сервер) на зовнішній 54055-й). Тим самим, зовні, на зовнішньому IP-адресі після трансляції адрес на сайт (або форум) для обізнаних відвідувачів можна буде потрапити за адресою http://example.org:54055, але на внутрішньому сервері, що знаходиться за NAT, він працюватиме на звичайному 80-му порту. Підвищення безпеки і приховування «непублічних» ресурсів.
Як недоліки можна визначити таке:
Старі протоколи. Протоколи, розроблені до масового впровадження NAT, не в змозі працювати, якщо на шляху між взаємодіючими хостами є трансляція адрес. Деякі міжмережеві екрани, які здійснюють трансляцію IP-адрес, можуть виправити цей недолік, відповідним чином замінюючи IP-адреси не тільки в заголовках IP, але і на більш високих рівнях (наприклад, в командах протоколу FTP). Див Application-level gateway.
Ідентифікація користувачів. Через трансляції адрес «багато в один» з'являються додаткові складнощі з ідентифікацією користувачів і необхідність зберігати повні логи трансляцій.
Ілюзія DoS-атаки. Якщо NAT використовується для підключення багатьох користувачів до одного і того ж сервісу, це може викликати ілюзію DoS-атаки на сервіс (безліч успішних і неуспішних спроб). Наприклад, надмірна кількість користувачів ICQ за NAT призводить до проблеми з підключенням до сервера деяких користувачів через перевищення допустимої швидкості підключень. Частковим вирішенням проблеми є використання пулу адрес (групи адрес), для яких здійснюється трансляція.
Пірінгові мережі. У NAT-пристроях, що не підтримують технологію Universal Plug & Play, в деяких випадках, необхідна додаткова настройка (див. Трансляція порт-адреса) при роботі з пірінговимі мережами і деякими іншими програмами, в яких необхідно не тільки ініціювати вихідні з'єднання, але також брати вхідні.
NAT Traversal (проходження або автонастройка NAT) – це набір можливостей, що дозволяють мережевим додаткам визначати, що вони знаходяться за пристроєм, що забезпечує NAT, дізнаватися зовнішній IP-адресу цього пристрою і виконувати зіставлення портів для пересилання пакетів з зовнішнього порту NAT на внутрішній порт, використовуваний додатком; все це виконується автоматично, користувачеві немає необхідності вручну налаштовувати зіставлення портів або вносити зміни в якісь інші параметри. Однак існують запобіжні заходи у довірі до таких додатків – вони отримують обширний контроль над пристроєм, з'являються потенційні уразливості.
Шляхи реалізації трансляції адрес у FreeBSD
Технологія NAT входить до поняття маршрутизації, тому реалізується в програмах які керують цією маршрутизацією, а саме мережевими фільтрами. Так, як в FreeBSD є три вбудованих мережеві фільтри (IPFW, PF, IPFILTER) кожен з них має вбудовану підтримку NAT. Для простого налаштування NAT бажано використовувати PF або IPFILTER, так як їхній функціонал не досить великий, але якщо він і не потрібен то і немає смислу шукати ускладненні шляхи реалізації. В IPFW з версії FreeBSD 7.0 додатково до традиційного демону natd через IPDIVERT з’явився ядерний NAT IPFIREWALL_NAT який має як перевага так і недоліки, але розробники рекомендують використовувати саме його. Додатковий параметр IPDIVERT створено не тільки для демона natd, він може передавати пакети на обробку будь-якій сторонній програмі.
Технологія NAT з часом витісняється новим протоколом IPv6, тому розробники не дуже ставлять акцент на покращення і розвитку трансляції адрес.
Демон natd, використання пакетних фільтрів ipfw та pf
Даемон перетворення мережевих адрес (Network Address Translation) під FreeBSD, широко відомий як natd, є демоном, який приймає вхідні IP-пакети, змінює адресу відправника на адресу локальної машини і повторно відправляє ці пакети в потоці вихідних пакетів. natd робить це, змінюючи IP-адреса відправника і порт таким чином, що коли дані приймаються назад, він може визначити розташування джерела початкових даних і переслати їх машині, яка запитувала дані спочатку.
Найчастіше NAT використовується для організації так званого спільного використання Інтернет.
Через вичерпання адресного простору адрес в IPv4 і збільшення кількості користувачів високошвидкісних каналів зв'язку, таких, як кабельне підключення або DSL, необхідність в рішенні по Спільному Використанню Інтернет зростає. Можливість підключити декілька комп'ютерів через єдине з'єднання і IP-адреса робить natd відповідним рішенням.
Найчастіше у користувача є машина, підключена до кабельному каналу або каналу DSL з одним IP-адресою і є бажання використовувати цей єдиний підключений комп'ютер для організації доступу в Інтернет інших комп'ютерів у локальній мережі.
Для цього машина FreeBSD, що знаходиться в Інтернет, повинна виступати в ролі шлюзу. Ця шлюзова машина повинна мати два мережевих адаптера – один для підключення до маршрутизатора Інтернет, а інший для підключення до ЛОМ. Всі машини в локальній мережі підключаються через мережевий концентратор або комутатор.
Існує багато способів під'єднати локальну мережу до Інтернет через шлюз FreeBSD. Приклад на рисунку 7.2 показує шлюз c двома мережевими картами.
Рисунок 7.2 – Поширена схема використання NAT
Подібна конфігурація часто використовується для спільного використання доступу до Інтернету. Одна з підключених до локальної мережі машин підключається до Інтернет. Решта машин працюють з Інтернет за допомогою цієї «шлюзовий» машини.
У файлі конфігурації ядра повинні бути присутніми наступні параметри:
options IPFIREWALL
options IPDIVERT
Додатково, якщо це потрібно, можна додати наступне:
options IPFIREWALL_DEFAULT_TO_ACCEPT
options IPFIREWALL_VERBOSE
У файлі /etc/rc.conf повинні бути такі рядки:
gateway_enable="YES"
firewall_enable="YES"
firewall_type="OPEN"
natd_enable="YES"
natd_interface="fxp0"
natd_flags=""
gateway_enable – вказує машині виступати в якості шлюзу. Виконання команди sysctl net.inet.ip.forwarding=1 приведе до того ж самого результату.
firewall_enable – при завантаженні включає використання правил брандмауера з файлу /etc/rc.firewall.
firewall_type – тут задається визначений набір правил брандмауера, який дозволяє все. Подивіться файл /etc/rc.firewall для знаходження додаткових типів.
natd_interface – вказує, через який інтерфейс передавати пакети (інтерфейс, підключений до Інтернет).
natd_flags – будь-які додатковий параметри, передані при запуску демону natd.
При використанні вищевказаних параметрів у файлі /etc/rc.conf при завантаженні буде запущена команда natd-interface fxp0. Цю команду можна запустити і вручну.
Якщо для передачі natd набирається дуже багато параметрів, можливо також використовувати конфігураційний файл. У цьому випадку ім'я конфігураційного файлу має бути задане додаванням наступного рядка в /etc/rc.conf:
natd_flags="-f /etc/natd.conf"
Файл /etc/natd.conf буде містити перелік конфігураційних параметрів, по одному в рядку. Наприклад, для прикладу з наступного розділу буде використовуватися такий файл:
redirect_port tcp 192.168.0.2:6667 6667
redirect_port tcp 192.168.0.3:80 80
Для отримання більш повної інформації про конфігураційному файлі прочитайте сторінку довідки за man natd щодо параметра -f.
Кожній машині і інтерфейсу в ЛОМ має бути призначений IP-адрес з адресного простору приватних мереж, як це визначено в RFC 1918, а в якості маршрутизатора за замовчуванням повинен бути заданий IP-адреса машини з natd з внутрішньої мережі.
Наприклад, клієнти A і B в ЛОМ мають IP-адреси 192.168.0.2 і 192.168.0.3, а інтерфейс машини з natd в локальній мережі має IP-адресу 192.168.0.1. Маршрутизатором за замовчуванням для клієнтів A і B повинна бути призначена машина з natd, тобто 192.168.0.1. Зовнішній, або Інтернет-інтерфейс машини з natd не вимагає особливих налаштувань для роботи natd.
Мінусом використання natd є те, що машини в локальній мережі недоступні з Інтернет. Клієнти в ЛОМ можуть виконувати вихідні з'єднання в зовнішній світ, але не можуть обслуговувати вхідні. Це є проблемою при запуску служб Інтернет на клієнтських машинах в локальній мережі. Простим рішенням є перенаправлення деяких портів Інтернет машини з natd на клієнта локальної мережі.
Нехай, наприклад, сервер IRC запущений на клієнті A, а Web-сервер працює на клієнті B. Щоб це працювало, з'єднання, що приймаються на портах 6667 (IRC) і 80 (Web), повинні перенаправлятися на відповідні машини.
Програмі natd повинна бути передана команда -redirect_port з відповідними параметрами. Синтаксис наступний:
-redirect_port proto targetIP:targetPORT[-targetPORT]
[aliasIP:]aliasPORT[-aliasPORT]
[remoteIP[:remotePORT[-remotePORT]]]
У прикладі вище аргументи повинен бути такими:
-redirect_port tcp 192.168.0.2:6667 6667
-redirect_port tcp 192.168.0.3:80 80
При цьому будуть перенаправлені відповідні порти tcp на клієнтські машини в локальній мережі.
Аргумент -redirect_port може використовуватися для вказівки діапазонів портів, а не конкретного порту. Наприклад, tcp 192.168.0.2:2000-3000 2000-3000 буде перенаправляти всі з'єднання, що приймаються на портах від 2000 до 3000, на порти від 2000 до 3000 клієнта A.
Ці параметри можна вказати при безпосередньому запуску natd, помістити їх в параметр natd_flags="" файлу /etc/rc.conf, або передати через конфігураційний файл.
Перенаправлення адреси корисно, якщо є декілька адрес IP, і вони повинні бути на одній машині. У цій ситуації natd може призначити кожному клієнту ЛОМ свій власний зовнішній IP-адресу. Потім natd перетворює виходять від клієнтів локальної мережі пакети, замінюючи IP-адреси на відповідні зовнішні, і перенаправляє весь трафік, що входить на деякий IP-адреса, назад конкретному клієнтові локальної мережі. Це також називають статичним NAT. Наприклад, нехай IP-адреси 128.1.1.1, 128.1.1.2 і 128.1.1.3 належать шлюзовий машині natd. 128.1.1.1 може використовуватися як зовнішній IP-адреси шлюзовий машини natd, тоді як 128.1.1.2 і 128.1.1.3 перенаправлятимуться назад до клієнтів ЛОМ A і B.
Синтаксис для -redirect_address такий:
-redirect_address localIP publicIP
localIP – внутрішній IP-адресу клієнта локальної мережі.
publicIP – зовнішній IP, відповідний клієнту локальної мережі.
У прикладі цей аргумент буде виглядати так:
-redirect_address 192.168.0.2 128.1.1.2
-redirect_address 192.168.0.3 128.1.1.3
Як і для -redirect_port, ці аргументи також поміщаються в рядок natd_flags="" файлу /etc/rc.conf або передаються через конфігураційний файл. При перенаправлення адрес немає потреби в перенаправлення портів, тому що перенаправляються всі дані, що приймаються для конкретного IP-адреси.
Зовнішні IP-адреси машини з natd повинні бути активізовані і бути синонімами для зовнішнього інтерфейсу. Зверніться до rc.conf, щоб це зробити.
За перенаправлення пакетів до демона natd відповідає скрипт з правилами за замовченням /etc/rc.firewall якщо його змінити то ці правила треба вказувати в новоствореному скрипті, строчка яка передає пакети демону виглядає так:
ipfw add divert natd all from any to any via fxp0
При використанні ядерного NAT IPFW використовувати демон natd не потрібно, що набагато спрощує налаштування. Щоб його ввімкнути необхідна задати такі обов’язкові параметри до ядра:
options IPFIREWALL
options IPFIREWALL_NAT
options LIBALIAS
Також можна включити додаткові опції якщо виникне потреба в цьому. Або включення без перезбирання, як модуль (але так менше можливостей для конфігурації) в /etc/rc.conf:
firewall_nat_enable="YES"
Налаштування подібне до демона natd, розглянемо приклад.
Найпростіший випадок (див. рисунок 7.3): маршрутизатор з двома мережними адаптерами підключеними в локальну мережу і в Інтернет. Адреса в локальній мережі 192.168.1.1 (мережевий адаптер fxp0), адреса в Інтернеті 1.2.3.4 (мережевий адаптер em0).
Завдання: "роздавати Інтернет" для локальної мережі, забезпечити кидок портів для внутрішніх адрес, дозволити проходження трафіку на окремі порти самого маршрутизатора.
Рисунок 7.3 – Поширена схема використання NAT
Конфігурація:
/etc/rc.conf:
gateway_enable="YES"
ifconfig_em0="inet 1.2.3.4 netmask 255.255.255.0 -rxcsum"
ifconfig_fxp0="inet 192.168.1.1 netmask 255.255.255.0"
defaultrouter="1.2.3.254"
firewall_enable="YES"
firewall_type="/etc/firewall"
/etc/firewall:
nat 1 config log if em0 reset same_ports deny_in \
redirect_port tcp 1.2.3.4:6881 6881 \
redirect_port udp 1.2.3.4:4444 4444 \
redirect_port tcp 192.168.1.24:25 25
add nat 1 ip from any to any via em0
Всі параметри такі самі як і при використанні демона, єдина відмінність це синтаксис. Команда add nat 1 ip from any to any via em0 загортає увесь трафік на інтерфейс em0 з попередньою заміною адреси на адресу і порт зовнішнього інтерфейсу.
В PF також реалізовано NAT, і для більшості системних адміністраторів цей варіант є найпростішим в FreeBSD. Розглянемо докладний приклад використання. Для початку дозволимо запуск PF, для цього в /etc/rc.conf задамо:
gateway_enable="YES" # Дозволяє серверу бути шлюзом
pf_enable="YES" # Запуск pf
pflog_enable="YES" # не обов'язково, можливість писати логи pf
pf_rules="/etc/pf.conf" # Шлях до правил pf
pf_program="/sbin/pfctl" # Шлях до програми управління pf
pf_flags="" # Необхідно для pfctl
defaultrouter="192.168.1.254" # Шлюз провайдера
Можна і перезібрати ядро, з підтримкою pf (при цьому вищенаведені параметри можна не задавати), щоб pf не сварився на відсутність ALTQ (обмежувати пропускну здатність каналу) або для його використання
No ALTQ support in kernel
ALTQ related functions disabled
Задамо такі параметри ядра:
device pf
device pflog
device pfsync
options ALTQ
options ALTQ_CBQ # Class Bases Queuing (CBQ)
options ALTQ_RED # Random Early Detection (RED)
options ALTQ_RIO # RED In/Out
options ALTQ_HFSC # Hierarchical Packet Scheduler (HFSC)
options ALTQ_PRIQ # Priority Queuing (PRIQ)
options ALTQ_NOPCC # Required for SMP build
Після установки ядра треба змінити правила /etc/pf.conf:
ext_if="em0" # Зовнішній інтерфейс (дивиться до провайдера WAN)
int_if="fxp0" # Внутрішній інтерфейс (дивиться в нашу мережу LAN)
set skip on lo0 # пропускаємо перевірку на петлі
scrub in all # збираємо всі частини пакета перед відправкою
nat on $ext_if from$ int_if: network to any -> ($ext_if)
block all # заборонимо всі звідусіль
pass in on $int_if from any to any # дозволяємо всі з локальної мережі
pass out on $ext_if from $ext_if to any # дозволяємо серверу доступ в Інтернет
pass in on $ext_if proto tcp from any to $ext_if port ssh # дозволяємо ssh
pass in inet proto icmp all icmp-type echoreq # дозволяємо ping
Тепер можна завантажити ці правила командою:
pfctl -f /etc/pf.conf
pfctl -e # Увімкнути pf
pfctl -d # Вимкнути pf
Для того щоб використовувати NAT лише для окремого списку IP /etc/pf.conf необхідно привести до такого вигляду:
ext_if="em0" # Зовнішній інтерфейс (дивиться до провайдера WAN)
int_if="fxp0" # Внутрішній інтерфейс (дивиться в нашу мережу LAN)
table <pf-allow-pc> file "/etc/pf-allow-pc"
set skip on lo0 # пропускаємо перевірку на петлі
scrub in all # збираємо всі частини пакета перед відправкою
nat on $ext_if from <pf-allow-pc> to any -> ($ext_if)
block all # заборонимо всі звідусіль
pass in on $int_if from any to any # дозволяємо всі з локальної мережі
pass out on $ext_if from $ext_if to any # дозволяємо серверу доступ в Інтернет
pass in on $ext_if proto tcp from any to $ext_if port ssh # дозволяємо ssh
pass in inet proto icmp all icmp-type echoreq # дозволяємо ping
І додати ip адреси в /etc/pf-allow-pc (у рядку повинен бути один адреса) тих кому дозволено ходити в Інтернет:
192.168.0.2
192.168.0.3
192.168.0.5