Компоненти міжмережевого екрана
Реалізація міжмережевого екрана в OpenWrt — це механізм фільтрації мережевого трафіку, що проходить через маршрутизатор. На високому рівні можливі три результати обробки пакета: - він відкидається (dropped) без відповіді, - відхиляється (rejected) з повідомленням про помилку джерелу, - або приймається (accepted) і передається до пункту призначення.
Зверніть увагу, що сам маршрутизатор може бути пунктом призначення, наприклад для доступу до його інтерфейсу керування або моніторингу.
OpenWrt побудований на базі Linux-проєкту netfilter. Основні компоненти фаєрволу OpenWrt:
- застосунок firewall3
- набір netfilter hooks у мережевих стека ядра
- набір модулів ядра Linux, які виконують перевірку мережевих пакетів
- параметри налаштування ядра (через sysctl) для конфігурації мережевого стека та фаєрволу
Ця документація ґрунтується на версії OpenWrt 18.06.0. Більшість прикладів перевірено на цій версії з використанням тестової мережі.
Firewall3 (fw3)
Застосунок fw3 — головна утиліта для конфігурації фаєрволу в OpenWrt. Вона розроблена командою OpenWrt спеціально для цього проєкту.
Netfilter hooks у ядрі
У кожному мережевому стеку ядра реалізовані так звані hooks (точки перехоплення), які викликаються у визначених місцях. Коли пакет проходить через стек, кожен хук виконує перевірку на відповідність правилам netfilter, прив’язаним до цього хука.
Код хуків netfilter використовує набір макросів `NF_HOOK`. Кожен хук приймає наступні аргументи:
- Протокол мережі: unspec (усі), ipv4, ipv6, arp, bridge, decnet
- Номер хука: PRE_ROUTING, LOCAL_IN, FORWARD, LOCAL_OUT, POST_ROUTING
- Структура мережі: контекст мережевого стеку
- Сокет: BSD-сокет, пов’язаний з пакетом
- Пакет: буфер сокета (socket buffer)
- Вхідний інтерфейс: звідки пакет надійшов
- Вихідний інтерфейс: куди пакет буде надісланий
- Колбек-функція: викликається, якщо пакет проходить перевірку
Модулі ядра netfilter
Модулі netfilter завантажуються при старті системи згідно з конфігурацією. Зазвичай використовується близько 35 модулів для підтримки стандартного функціоналу, але кількість може зрости в залежності від потреб. Наприклад, використання ipset додає ~16 додаткових модулів.
Більшість модулів невеликі та реалізують одну конкретну функцію. Приклади:
- `ipt_REJECT` — реалізує ціль REJECT
- `xt_multiport` — виконує відповідність по портах (match)
- `xt_TCPMSS` — змінює максимальний розмір TCP-сегмента (MSS) у таблиці mangle
Деякі модулі є більшими за розміром. Наприклад:
- `nf_conntrack` — здійснює відстеження з’єднань, підтримку NAT (masquerading) та дефрагментацію пакетів.
Налаштування ядра через sysctl
Служба sysctl виконується під час старту системи. Це скрипт, який зчитує /etc/sysctl.conf та всі файли в /etc/sysctl.d/. Ці файли встановлюють параметри ядра для функціонування OpenWrt. Див. sysctl.conf.
Усі параметри документовані в Documentation/networking/ дереві вихідного коду ядра, тому тут вони не повторюються. Для довідки дивіться файли `ip-sysctl.txt` і `nf_conntrack-sysctl.txt`.
Оскільки функціональність OpenWrt є досить стабільною, вам майже напевно не потрібно змінювати значення параметрів ядра, відмінні від типових у прошивці.
Зверніть увагу, що підтримка netfilter для bridge-трафіку в ядрі вимкнена за замовчуванням!
Згідно з `ip-sysctl.txt`:
bridge-nf-call-iptables - BOOLEAN 1 : передавати bridge-трафік IPv4 у ланцюжки iptables. 0 : вимкнути цю функцію. Типове значення: 1