Конфігурація міжмережевого екрана /etc/config/firewall
Система керування фаєрволом OpenWrt — firewall — переважно конфігурується через файл /etc/config/firewall
.
Основна увага у цьому розділі приділяється саме конфігураційним файлам і їхньому вмісту. Інтерфейси LuCI та UCI є лише зручними абстракціями, що в результаті змінюють ці самі файли.
Керування
- Основний файл конфігурації фаєрволу —
/etc/config/firewall
; саме його потрібно редагувати для зміни налаштувань.Перед змінами обов’язково зробіть резервну копію файлу!
- Якщо після змін ви втратите доступ до маршрутизатора, знадобиться аварійний режим (failsafe) для відновлення з копії.
- Після редагування файлу, і подвійної перевірки всіх змін, оновіть конфігурацію командою:
/etc/init.d/firewall reload
- Це shell-скрипт, що викликає `fw4 reload` і виводить повідомлення до консолі. Обов’язково перевірте наявність помилок!
- Рядки, що починаються з
#
, ігноруються парсером- Коментарі можна використовувати для пояснення, опису чи тимчасового вимкнення секцій.
- Починаючи з OpenWrt 22.03, за замовчуванням використовується firewall4, що працює поверх nftables. Він підтримує той самий синтаксис UCI, що й fw3.
- Конфігурація UCI у
/etc/config/firewall
охоплює більшість, але не всі можливості NetFilter- Для розширення можливостей доступний механізм include
- Можна додавати shell-скрипт з nftables-командами або фрагмент nft-конфігурації.
- Див. приклади: fw3_config_examples (можуть бути застарілими!)
- Коли можливо, використовуйте файл UCI-конфігурації
/etc/config/firewall
- У складних випадках дозволяється використання власних nftables-правил
- Детальніше: Netfilter в OpenWrt
Налаштування через веб-інтерфейс
LuCI — зручний спосіб переглядати та змінювати налаштування фаєрволу:
- Розташування: Network → Firewall
- Відображає конфігурацію у структурованому вигляді, що відповідає секціям конфігураційного файлу.
Після внесення змін натисніть Save & Apply.
LuCI видаляє всі коментарі (
#
) з файлу/etc/config/firewall
!
Налаштування через командний рядок
UCI — низькорівнева абстракція для керування конфігураційними файлами. Доступна також через SSH.
uci add firewall rule uci set firewall.@rule[-1].name='Відхилити VPN → LAN' uci set firewall.@rule[-1].src='vpn' uci set firewall.@rule[-1].dest='lan' uci set firewall.@rule[-1].proto='all' uci set firewall.@rule[-1].target='REJECT' uci commit firewall service firewall restart
Це створить правило у кінці списку, що відхиляє весь трафік з VPN у LAN (усі протоколи).
Перегляд поточної конфігурації фаєрволу:
uci show firewall # Приклад: firewall.@rule[20]=rule firewall.@rule[20].name='Відхилити VPN → LAN' firewall.@rule[20].src='vpn' firewall.@rule[20].dest='lan' firewall.@rule[20].proto='all' firewall.@rule[20].target='REJECT' ...
UCI зручний для перегляду, але не дуже підходить для складного редагування, оскільки:
- Потрібно знати точну позицію, куди вставити правило;
- UCI не бачить вміст файлу /etc/firewall.user;
- Після змін потрібно виконати `uci commit`, а потім ще й `firewall reload`.
Секції конфігурації
Нижче — короткий огляд типів секцій у конфігурації фаєрволу.
- Мінімальна конфігурація для маршрутизатора зазвичай складається з однієї секції defaults, принаймні двох zones (
lan
іwan
) та однієї forwarding для дозволу трафіку зlan
уwan
. - Секція forwarding не є обов’язковою, якщо є лише дві зони — можна вказати global defaults.
Defaults
Секція defaults задає глобальні параметри фаєрволу, які не належать до окремих зон:
config defaults option input 'ACCEPT' option output 'ACCEPT' option forward 'REJECT' option custom_chains '1' option drop_invalid '1' option synflood_protect '1' option synflood_rate '25/s' option synflood_burst '50' option tcp_ecn '1' option tcp_syncookies '1' option tcp_window_scaling '1'
Параметри (Options)
Назва | Тип | Обов’язковий | Типове | Опис |
---|---|---|---|---|
input | рядок | ні | ACCEPT | Політика для ланцюга INPUT у таблиці filter . |
output | рядок | ні | ACCEPT | Політика для ланцюга OUTPUT у таблиці filter . |
forward | рядок | ні | REJECT | Політика для ланцюга FORWARD у таблиці filter . |
drop_invalid | булевий | ні | 0 | Відкинути недійсні пакети (наприклад, ті, що не відповідають активним з’єднанням). |
syn_flood | булевий | ні | 0 | Увімкнути захист від SYN flood (застарілий, використовуйте synflood_protect ). |
synflood_protect | булевий | ні | 0 | Увімкнути захист від SYN flood-атак. |
synflood_rate | рядок | ні | 25/s | Обмеження швидкості (пакетів/с) для SYN-пакетів, понад яке трафік вважається атакою. |
synflood_burst | рядок | ні | 50 | Обмеження для кількості SYN-пакетів, які допускаються одночасно перед розпізнаванням атаки. |
tcp_syncookies | булевий | ні | 1 | Увімкнути використання SYN cookies. |
tcp_ecn | ціле число | ні | 0 | 0 — вимкнено, 1 — увімкнено, 2 — лише вхід (ingress). Включає ECN. |
tcp_window_scaling | булевий | ні | 1 | Увімкнути масштабування TCP-вікна. |
accept_redirects | булевий | ні | 0 | Дозволити ICMP-перенаправлення. |
accept_source_route | булевий | ні | 0 | Дозволити маршрутизацію з вказаним джерелом (source routing). |
custom_chains | булевий | ні | 1 | Дозволити створення користувацьких ланцюгів (hooks). |
disable_ipv6 | булевий | ні | 0 | Вимкнути IPv6-правила фаєрволу (не підтримується fw4). |
flow_offloading | булевий | ні | 0 | Увімкнути програмне прискорення трафіку. |
flow_offloading_hw | булевий | ні | 0 | Увімкнути апаратне прискорення трафіку (потребує flow_offloading). |
tcp_reject_code | reject_code | ні | 0 | Метод відхилення TCP (скидання або ICMP unreachable). |
any_reject_code | reject_code | ні | 1 | Метод відхилення для будь-яких протоколів (скидання або ICMP unreachable). |
auto_helper | булевий | ні | 1 | Додати Conntrack helper-и. |
auto_includes | булевий | ні | 1 | (лише fw4) Автоматично підключати правила з /usr/share/nftables.d/ . |
Зони (Zones)
Секція zone
об’єднує один або кілька інтерфейсів та слугує джерелом або ціллю для секцій forwardings, rules та redirects.
config zone option name 'wan' option network 'wan wan6' option input 'REJECT' option output 'ACCEPT' option forward 'REJECT' option masq '1' option mtu_fix '1'
- MASQUERADE (NAT) для вихідного трафіку зони визначається на рівні зони.
input
— трафік до маршрутизатора з цієї зони.output
— трафік з маршрутизатора через цю зону.forward
— трафік між інтерфейсами в цій зоні.
Параметри
Назва | Тип | Обов’язковий | Типове | Опис |
---|---|---|---|---|
name | назва зони | так | — | Унікальна назва зони (до 11 символів). |
network | список | ні | — | Список інтерфейсів, що входять до зони. |
masq | булевий | ні | 0 | Вказує, чи слід маскувати IPv4 трафік зони. |
masq6 | булевий | ні | 0 | Те саме для IPv6 (fw4). |
masq_src | список підмереж | ні | 0.0.0.0/0 | Обмежити маскарадинг певними джерелами. |
masq_dest | список підмереж | ні | 0.0.0.0/0 | Обмежити маскарадинг певними цілями. |
masq_allow_invalid | булевий | ні | 0 | Не додавати DROP для недійсних пакетів. |
mtu_fix | булевий | ні | 0 | Увімкнути MSS Clamping. |
input | рядок | ні | з defaults | Політика для вхідного трафіку. |
output | рядок | ні | з defaults | Політика для вихідного трафіку. |
forward | рядок | ні | з defaults | Політика для переспрямованого трафіку. |
family | рядок | ні | any | ipv4 , ipv6 або any . |
log | число | ні | 0 | Увімкнення логування (0 — вимкнено, 1 — filter, 2 — mangle). |
log_limit | рядок | ні | 10/minute | Обмеження кількості логів. |
device | список | ні | — | Перелік L3-інтерфейсів (наприклад, tun+ для OpenVPN). |
subnet | список | ні | — | IP-підмережі, прив’язані до зони. |
custom_chains | булевий | ні | 1 | Дозволити кастомні ланцюги (працює лише при активному global custom_chains). |
enabled | булевий | ні | 1 | Якщо 0 , зона вимкнена. |
auto_helper | булевий | ні | 1 | Додавати CT helper-и. |
helper | cthelper | ні | — | Список conntrack helper-ів. |
Переспрямування (Forwardings)
Секції forwarding
визначають правила переспрямування трафіку між зонами.
config forwarding option src 'lan' option dest 'wan'
- Одне правило
forwarding
охоплює лише один напрямок. Для двостороннього трафіку потрібно створити два правила зі зміненими місцямиsrc
іdest
.
Параметри
Назва | Тип | Обов’язковий | Типове | Опис |
---|---|---|---|---|
name | назва правила | ні | — | Унікальна назва правила переспрямування. |
src | назва зони | так | — | Зона-джерело трафіку. |
dest | назва зони | так | — | Зона-призначення трафіку. |
family | рядок | ні | any | ipv4 , ipv6 або any . |
enabled | булевий | ні | 1 | Якщо 0 , правило вимкнене. |
ipset | рядок | ні | — | Обмеження через ipset; можна інвертувати з ! . |
Для роботи цих правил необхідне відстеження з’єднань (conntrack).
Принаймні одна із зон повинна мати увімкнений
masq
або інше, що активує conntrack.
Правила (Rules)
Секція rule
використовується для створення простих правил прийому (accept), відхилення (drop) або заборони (reject) трафіку для дозволу або обмеження доступу до певних портів чи хостів.
config rule option name 'Заборонити LAN → WAN для певної IP' option src 'lan' option src_ip '192.168.1.2' option src_mac '00:11:22:33:44:55' option src_port '80' option dest 'wan' option dest_ip '194.25.2.129' option dest_port '120' option proto 'tcp' option target 'REJECT'
Наступний приклад демонструє переспрямування між зонами (де переспрямування заборонене), з однією зоною lan
, яка містить два інтерфейси. Один інтерфейс має сервер з IP-адресою 172.30.100.1
, інший — типовий LAN-інтерфейс з діапазоном 192.168.1.0/24
. Конфігурація дозволяє IPv4-трафік tcp
лише до IP сервера на порт 22
.
config rule option name 'Переспрямувати SSH до сервера' option family 'ipv4' option src 'lan' option src_ip '192.168.1.0/24' option dest 'lan' option dest_ip '172.30.100.1' option proto 'tcp' option dest_port '22' option target 'ACCEPT'
* У фаєрволі OpenWrt, зв’язок src
і dest
визначає тип правила:
- Якщо вказані обидва — правило для переспрямованого трафіку
- Якщо лише
src
— правило для вхідного трафіку - Якщо лише
dest
— правило для вихідного трафіку - Якщо не вказано жодного — обробляється як вихідне
* src\_ip
і dest\_ip
можуть бути як окремою IP-адресою, так і CIDR-нотацією (наприклад, 192.168.1.0/24
)
* Діапазон портів задається як start-stop
, наприклад 6666-6670
Параметри
Назва | Тип | Обов’язковий | Типове | Опис |
---|---|---|---|---|
name | рядок | ні | — | Назва правила |
src | назва зони | ні | — | Зона-джерело трафіку, або \* для будь-якої зони. Якщо не вказано — вважається вихідним трафіком |
src_ip | IP-адреса | ні | — | Вхідний трафік з вказаної IP-адреси або CIDR |
src_mac | MAC-адреса | ні | — | Вхідний трафік з вказаної MAC-адреси |
src_port | порт або діапазон | ні | — | Джерельний порт або діапазон, наприклад 80 або 6666-6670 |
proto | протокол | ні | tcp udp | Один або декілька: tcp , udp , icmp , all тощо |
icmp_type | список | ні | any | Для ICMP: обмежити конкретними типами (наприклад, echo-request ) |
dest | назва зони | ні | — | Зона-призначення трафіку |
dest_ip | IP-адреса | ні | — | IP-адреса призначення (може бути CIDR) |
dest_port | порт або діапазон | ні | — | Порт призначення або діапазон |
ipset | рядок | ні | — | Порівняння з ipset; можна інвертувати з ! |
mark | значення/маска | ні | — | Порівняння з маркером пакета, наприклад 0x0/0x1 для парних значень |
start_date | дата (yyyy-mm-dd ) | ні | — | Активне з цієї дати |
stop_date | дата | ні | — | Активне до цієї дати включно |
start_time | час (hh\:mm\:ss ) | ні | — | Активне з цього часу |
stop_time | час | ні | — | Активне до цього часу |
weekdays | список днів | ні | — | Наприклад, mon wed fri або ! sun sat для виключення вихідних |
monthdays | список дат | ні | — | Наприклад, 1 15 30 або ! 31 |
utc_time | булевий | ні | 0 | Вважати час за UTC, а не локальний |
target | рядок | так | DROP | Дія: ACCEPT , REJECT , DROP , MARK , NOTRACK |
set_mark | значення/маска | так для MARK | — | Присвоїти маркер пакету через логічну OR-операцію |
set_xmark | значення/маска | так для MARK | — | Присвоїти XOR-маркер |
family | рядок | ні | any | IP-діапазон: ipv4 , ipv6 , any |
limit | рядок | ні | — | Обмеження частоти: 5/second , 2/minute тощо |
limit_burst | ціле число | ні | 5 | Початкова кількість пакетів до активації ліміту |
enabled | булевий | ні | yes | Активувати або вимкнути правило |
device | рядок | ні | | |
direction | напрямок | ні | | |
set_helper | cthelper | ні | | |
helper | cthelper | ні | | |
Типи ICMP
address-mask-reply | host-redirect | pong | time-exceeded |
address-mask-request | host-unknown | port-unreachable | timestamp-reply |
any | host-unreachable | precedence-cutoff | timestamp-request |
communication-prohibited | ip-header-bad | protocol-unreachable | TOS-host-redirect |
destination-unreachable | network-prohibited | redirect | TOS-host-unreachable |
echo-reply | network-redirect | required-option-missing | TOS-network-redirect |
echo-request | network-unknown | router-advertisement | TOS-network-unreachable |
fragmentation-needed | network-unreachable | router-solicitation | ttl-exceeded |
host-precedence-violation | parameter-problem | source-quench | ttl-zero-during-reassembly |
host-prohibited | ping | source-route-failed | ttl-zero-during-transit |
Перенаправлення (Redirects)
Переадресація портів (DNAT) визначається секціями типу redirect
.
Перенаправлення портів також часто називають “port forwarding” або “віртуальні сервери”.
- Увесь вхідний трафік із вказаної вихідної зони, що відповідає заданим правилам, буде переадресовано на вказаний внутрішній хост.
- Діапазони портів вказуються у форматі
початковий-кінцевий
, наприклад:6666-6670
.
Призначений NAT (Destination NAT)
Див. також: Переадресація портів для IPv6
config redirect option name 'DNAT WAN to LAN for SSH' option src 'wan' option src_dport '19900' option dest 'lan' option dest_ip '192.168.1.1' option dest_port '22' option proto 'tcp' option target 'DNAT'
Якщо в секції конфігурації не вказано
src_dport
, усі пакети, що відповідають іншим параметрам цієї секції (на будь-якому порту), будуть переадресовані на порт призначення, зазначений у цій секції.
Це може становити загрозу безпеці для застосунку, що працює на вказаному порту призначення.
Один із способів перевірити цю проблему — скористатись сервісом ShieldsUP! від Gibson Research Corporation і просканувати бажані порти на вашому маршрутизаторі.
Можливі відповіді: відкритий (open), закритий (closed) або невидимий (stealth).
У випадках відкритих або закритих портів пакети досягають хоста-призначення й отримують підтвердження або відповіді.
У той час як невидимі порти просто відкидають пакети; з точки зору сканувального сервера (GRC) — він не може впевнено визначити, чи дійсно пакети досягають хоста.
Початковий NAT (Source NAT)
Найпоширеніша форма SNAT — це маскарадинг, який змінює адресу джерела трафіку до WAN на публічну IP-адресу маршрутизатора. SNAT також можна задати вручну:
config redirect option name 'SNAT DMZ 192.168.1.250 to WAN 1.2.3.4 for ICMP' option src 'dmz' option src_ip '192.168.1.250' option src_dip '1.2.3.4' option dest 'wan' option proto 'icmp' option target 'SNAT'
Параметри (Options)
Див. також: Список опцій SNAT на OpenWrt SNAPSHOT
Назва | Тип | Обовʼязково | Типове | Опис |
---|---|---|---|---|
name | рядок | ні | рядок | Назва правила переадресації |
src | назва зони | так для DNAT | (не задано) | Вказує зону-джерело трафіку. Зазвичай для переадресації портів це wan . |
src_ip | IP-адреса | ні | (не задано) | Вхідний трафік із вказаної IP-адреси. |
src_dip | IP-адреса | так для SNAT | (не задано) | Для DNAT : трафік, скерований на вказану IP-адресу. Для SNAT : нова адреса-джерело після заміни. |
src_mac | MAC-адреса | ні | (не задано) | Трафік від вказаної MAC-адреси. |
src_port | порт або діапазон | ні | (не задано) | Трафік з вказаного порту або діапазону портів джерела. |
src_dport | порт або діапазон | ні | (не задано) | Для DNAT : порт або діапазон портів призначення. Для SNAT : змінений порт джерела. |
proto | назва або номер протоколу | ні | tcp udp | Протокол трафіку: tcp , udp , icmp , all тощо. Також дозволено числові значення та імена з /etc/protocols . |
dest | назва зони | так для SNAT | (не задано) | Зона призначення трафіку. Для DNAT — не має значення. |
dest_ip | IP-адреса | ні | (не задано) | Для DNAT : хост, на який перенаправляється трафік. Для SNAT : IP призначення, що перевіряється. |
dest_port | порт або діапазон | ні | (не задано) | Для DNAT : порт внутрішнього хоста. Для SNAT : перевірка на порти призначення. |
ipset | рядок | ні | (не задано) | Ім’я ipset-набору, за яким фільтрується трафік. |
mark | рядок | ні | (не задано) | Firewall-маркування. Напр., 0xFF або !0x10 (виключення). |
start_date | дата (рррр-мм-дд ) | ні | (завжди) | Початкова дата для відповідності. |
stop_date | дата (рррр-мм-дд ) | ні | (завжди) | Кінцева дата для відповідності. |
start_time | час (гг:хх:сс ) | ні | (завжди) | Початковий час доби для відповідності. |
stop_time | час (гг:хх:сс ) | ні | (завжди) | Кінцевий час доби для відповідності. |
weekdays | список днів тижня | ні | (завжди) | Напр., sun mon fri . ! sat sun — усі, крім суботи та неділі. |
monthdays | список чисел | ні | (завжди) | Напр., 2 5 30 . ! 31 — усі дні, крім 31-го. |
utc_time | булеве значення | ні | 0 | Інтерпретація часу у форматі UTC. |
target | рядок | ні | DNAT | Тип NAT: DNAT або SNAT . |
family | рядок | ні | (авто) | Діапазон адрес: ipv4 , ipv6 або any . |
reflection | булеве значення | ні | 1 | Увімкнення NAT-відображення для DNAT. |
reflection_src | рядок | ні | internal | Джерело для NAT-відображення: internal або external . |
reflection_zone | список зон | ні | (не задано) | Зони, для яких увімкнено відображення. |
limit | рядок | ні | (не задано) | Максимальна середня швидкість відповідності. Напр.: 3/sec . |
limit_burst | ціле число | ні | 5 | Початковий ліміт пакетів вище порогового значення. |
extra | | | | |
enabled | рядок | ні | 1 або yes | Увімкнення правила переадресації. |
helper | cthelper | ні | | |
IP-набори (IP sets)
Див. також: Приклади IP-наборів
`fw4` підтримує використання або створення IP-наборів для спрощення співставлення з великими списками IP-адрес або портів без необхідності створення окремого правила для кожного елементу. `fw4` підтримує менше параметрів (див. нижче).
Параметри (fw3)
Назва | Тип | Обов’язково | Типове | Опис |
---|---|---|---|---|
enabled | булеве | ні | 1 | Дозволяє вимкнути оголошення ipset без видалення секції. |
external | рядок | ні | (немає) | Якщо встановлено, firewall посилається на вже існуючий ipset з вказаною назвою. Якщо не встановлено — створює ipset при запуску та знищує при зупинці. |
name | рядок | так, якщо external не встановлено ні, якщо встановлено | (немає) або значення external | Внутрішня назва ipset у firewall для використання в правилах або переадресаціях. |
family | рядок | ні | ipv4 | Діапазон адрес: ipv4 або ipv6 . Застосовується лише до hash та list . Тип bitmap передбачає ipv4 . |
storage | рядок | ні | залежить від типу даних | Метод зберігання: bitmap , hash або list . Типовий значення залежить від типів даних у match . |
match | список кортежів напрямок/тип | так | (немає) | Вказує типи, що співпадають: ip , port , mac , net , set та напрямки: src або dest . Наприклад: src_port або dest_net . Для мульти-співставлення вказується в лапках: “match dest_ip dest_port”. |
iprange | IP-діапазон | так для bitmap з типом ip | (немає) | Визначає діапазон IP. Застосовується до hash . Див. ipset(8). |
portrange | Діапазон портів | так для bitmap з типом port | (немає) | Діапазон портів, лише для hash . |
netmask | ціле число | ні | 32 | Якщо задано, адреси мережі будуть збережені замість IP-хостів. Від 1 до 32. |
maxelem | ціле число | ні | 65536 | Максимальна кількість елементів у наборі. Тільки для типів hash та list . |
hashsize | ціле число | ні | 1024 | Початковий розмір хешу. Лише для hash . |
timeout | ціле число | ні | 0 | Таймаут для елементів набору. 0 — увімкнено таймаут, але без значення. |
entry | значення набору | ні | (немає) | IP-адреса, CIDR або MAC. Один запис — одне значення. |
loadfile | рядок | ні | (немає) | Шлях до файлу в OpenWrt з переліком CIDR-ів. |
Параметри (fw4)
Назва | Тип | Обов’язково | Типове | Опис |
---|---|---|---|---|
enabled | булеве | ні | 1 | Дозволяє вимкнути оголошення ipset без видалення секції. |
comment | булеве | ні | (немає) | Ймовірна помилка: має бути рядком для коментаря користувача. |
name | рядок | так | (немає) | Внутрішня назва ipset у firewall. |
family | рядок | ні | ipv4 | Діапапзон адрес: ipv4 або ipv6 . |
match | список типів ipset | так | (немає) | Типи даних (ip , port , mac , net , set ) і напрямок (src , dest ), наприклад: src_port . |
maxelem | ціле число | ні | 65536 | Максимум елементів у наборі. |
timeout | ціле число | ні | 0 | Таймаут за замовчуванням. 0 — лише прапорець, без значення. |
entry | список значень | ні | IP, CIDR або MAC. Один елемент на запис. | |
loadfile | рядок | ні | (немає) | Шлях до файлу з CIDR-ами. |
Типи IP-наборів (IP set types)
prefix_suffix
Префікс (напрямок) | Суфікс (тип даних) | Примітки |
---|---|---|
src_* | Співпадіння за джерелом | |
dest_* | Співпадіння за призначенням | |
_ip | IP-адреси | |
_port | TCP/UDP порти | |
_mac | MAC-адреси | |
_net | Підмережі | |
_set | Не підтримується в firewall4 |
Зберігання / Параметри співпадіння (Storage / Match options)
Порядок співставлення типів даних має значення.
Діапазон | Тип зберігання | Співпадіння | Примітки |
---|---|---|---|
ipv4 | bitmap | ip | Потрібен параметр iprange |
ipv4 | bitmap | ip mac | Потрібен параметр iprange |
ipv4 | bitmap | port | Потрібен параметр portrange |
будь-яке | hash | ip | - |
будь-яке | hash | net | - |
будь-яке | hash | ip port | - |
будь-яке | hash | net port | - |
будь-яке | hash | ip port ip | - |
будь-яке | hash | ip port net | - |
- | list | set | Мета-набір для створення набору з наборів |
Варіанти зберігання та відповідності (Storage / Match options)
Порядок співставлення типів даних має значення
Діапазон | Метод зберігання | Співставлення | Примітки |
---|---|---|---|
ipv4 | bitmap | ip | Потрібен параметр iprange |
ipv4 | bitmap | ip mac | Потрібен параметр iprange |
ipv4 | bitmap | port | Потрібен параметр portrange |
будь-яке | hash | ip | – |
будь-яке | hash | net | – |
будь-яке | hash | ip port | – |
будь-яке | hash | net port | – |
будь-яке | hash | ip port ip | – |
будь-яке | hash | ip port net | – |
– | list | set | Мета-тип для створення набору з наборів |
Додавання правил (версія 22.03 і новіші з fw4)
fw4
підтримує кілька способів додавання власних правил файрволу.
У всіх випадках власні правила мають бути записані у стилі nftables.
Секція config include з фрагментами nftables
Один зі способів — додавання фрагментів правил у стилі nftables
.
Можливі кілька позицій для вставки в структуру nftables.
Наприклад, щоб додати власне логування до ланцюга input_wan
:
# /etc/config/firewall config include option type 'nftables' option path '/etc/my_custom_firewall_rule.nft' option position 'chain-pre' option chain 'input_wan' # /etc/my_custom_firewall_rule.nft tcp dport 0-1023 log prefix "Inbound WAN connection attempt to low TCP port: "
Щоб додати один або більше власних ланцюгів:
config include option type 'nftables' option path '/etc/my_custom_firewall_chain.nft' option position 'table-post'
Підтримувані параметри:
Назва | Тип | Обовʼязково | Типове | Опис |
---|---|---|---|---|
enabled | булеве | ні | 1 | Дозволяє вимкнути відповідне додавання без видалення секції |
type | рядок | ні | script | Тип додавання: script (shell-скрипт сумісний з fw3) або nftables (фрагмент nftables) |
path | назва файлу | так | – | Шлях до файлу, який потрібно додати |
position | рядок | так (для типу nftables) | table-post | Позиція вставки правил (див. таблицю нижче) |
chain | рядок | так (якщо position починається з chain- ) | – | Назва ланцюга, у який вставлятимуться правила |
Можливі позиції вставки для фрагментів nftables:
Позиція | Призначення |
---|---|
ruleset-pre | На самому початку, до визначення таблиці fw4 |
ruleset-post | У самому кінці, після всієї таблиці fw4 |
table-pre | На початку таблиці fw4, до визначення ланцюгів |
table-post | В кінці таблиці fw4, після визначення всіх ланцюгів |
chain-pre | На початку ланцюга $chain (вказаного в option chain ), до існуючих правил |
chain-post | В кінці ланцюга $chain , після існуючих правил |
Для розуміння структури таблиці/ланцюгів/правил виконайте команду: ``fw4 print``
Примітка: суфікс
-pre
можна також писати як -prepend
, а -post
— як -postpend
або -append
.
Секція config include з shell-скриптом
Додавання власних правил за допомогою shell-скрипта працює аналогічно fw3, але скрипт повинен використовувати синтаксис nftables.
Параметр fw4_compatible
обовʼязковий, якщо вказано шлях до файлу /etc/firewall.user
— він вказує, що скрипт сумісний із fw4.
config include option enabled 1 option type 'script' option path '/etc/firewall.user' option fw4_compatible 1
Параметри
family
та reload
з fw3 більше не підтримуються у fw4.
Типові drop-in додавання (Default drop-in includes)
fw4
за замовчуванням додає всі файли з розширенням .nft
у каталозі /etc/nftables.d/
— на початку таблиці fw4 (еквівалент позиції table-pre
).
Це означає, що ви можете створювати власні ланцюги, просто додавши файл із розширенням .nft
до каталогу /etc/nftables.d/
.
Drop-in додавання для авторів пакунків (Drop-in includes for package authors)
Автори пакунків, яким потрібні власні правила файрволу, можуть додавати фрагменти nftables у відповідні директорії залежно від бажаної позиції вставки:
Шлях | Позиція вставки |
---|---|
/usr/share/nftables.d/ruleset-pre/*.nft | Додаються на самому початку, до визначення таблиці fw4 |
/usr/share/nftables.d/ruleset-post/*.nft | Додаються в самому кінці, після визначення таблиці fw4 |
/usr/share/nftables.d/table-pre/*.nft | На початку таблиці fw4, до оголошення ланцюгів |
/usr/share/nftables.d/table-post/*.nft | В кінці таблиці fw4, після всіх оголошених ланцюгів |
/usr/share/nftables.d/chain-pre/${chain}/*.nft | На початку ланцюга ${chain} (валідна назва fw4-ланцюга), до правил у цьому ланцюгу |
/usr/share/nftables.d/chain-post/${chain}/*.nft | В кінці ланцюга ${chain} , після правил у цьому ланцюгу |
Усі фрагменти мають бути доступними для читання та закінчуватися на
.nft
.
Додавання (версії 21.02 та раніше з fw3)
У старіших версіях OpenWrt (з fw3) ви можете додати власні скрипти файрволу, визначивши одну або більше секцій include
у конфігурації файрволу:
config include
option path '/etc/firewall.user'
Файл /etc/firewall.user
за замовчуванням порожній.
Параметри
Назва | Тип | Обов’язково | Типове | Опис |
---|---|---|---|---|
enabled | булеве | ні | 1 | Дозволяє вимкнути відповідне додавання без видалення секції |
type | рядок | ні | script | Тип додавання: script для shell-скриптів або restore для файлів у форматі iptables-restore |
path | назва файлу | так | /etc/firewall.user | Вказує на shell-скрипт, який виконується при запуску або перезапуску файрволу |
family | рядок | ні | any | Діапазон адрес: ipv4 , ipv6 або any |
reload | булеве | ні | 0 | Визначає, чи викликати скрипт при перезавантаженні файрволу. Потрібно лише, якщо скрипт змінює внутрішні ланцюги. |
Скрипти типу script
можуть містити будь-які команди оболонки, наприклад: розширені правила nftables або команди `tc`, потрібні для трафік-шейпінгу.