Модул 5 · 5.2
Защитна стена с ufw и nftables
Модул 5: Защита на мрежата · Време за четене: 12 минути
Цел на урока: След този урок ще можете да настроите защитна стена, която пропуска само необходимото, за IPv4 и за IPv6, без да блокирате собствения си достъп. Ще знаете също от какво защитната стена на Вашия сървър не Ви предпазва.
Основни понятия: пакетен филтър, netfilter, nftables, iptables-nft, ufw, политика по подразбиране, allow, deny, reject, limit, IPv6 в ufw, защитна стена на доставчика, firewalld, Docker и защитната стена
Какво прави защитната стена
Защитната стена (firewall) на Вашия сървър е пакетен филтър: за всеки входящ мрежов пакет тя проверява списък с правила и решава дали той може да премине. В Linux този филтър се намира в ядрото и се нарича netfilter. Настройвате го с програма:
- nftables (команда
nft) е съвременният инструмент. Debian го използва по подразбиране от Debian 10 насам. - iptables е старият инструмент. На съвременните системи
iptablesобикновено превежда командите към nftables (iptables-nft), така че старите ръководства продължават да работят. - ufw (Uncomplicated Firewall) е опростен слой над него. Той е наличен по подразбиране в Ubuntu, а в Debian се инсталира с една команда. За единичен сървър ufw е най-лесният избор. В този урок използваме ufw, а след това показваме как изглеждат същите правила в nftables.
Защитната стена е Вашият втори защитен слой. Първият е услугите да слушат само на правилния адрес (урок 5.1). Заедно те гарантират, че грешка в единия слой не означава веднага отворена врата.
Първо: как да се върнете, ако нещо се обърка?
Класическата грешка: включвате защитната стена, забравяте да разрешите SSH и връзката Ви прекъсва. Тогава вече нямате достъп през SSH. Преди да започнете:
- Уверете се, че знаете как да отворите конзолата на Вашия доставчик (урок 1.2). Тя работи извън мрежата, затова е достъпна дори когато защитната стена блокира всичко. Влезте там и въведете
ufw disable. - Направете snapshot, ако се колебаете.
- Оставете текущата си SSH сесия отворена и тествайте с втора сесия.
ufw в пет стъпки
Стъпка 1: инсталиране и избор на поведение по подразбиране.
anna@web1:~$ sudo apt install ufw
anna@web1:~$ sudo ufw default deny incoming
Default incoming policy changed to 'deny'
anna@web1:~$ sudo ufw default allow outgoing
Default outgoing policy changed to 'allow'Политиката по подразбиране важи за всичко, за което няма правило. "Deny incoming" означава: всичко входящо е забранено, освен това, което разрешите по-нататък. Това е единствената сигурна основа. Изходящия трафик (сървърът Ви изтегля актуализации) разрешавате.
Стъпка 2: разрешете SSH, преди да включите защитната стена.
anna@web1:~$ sudo ufw allow OpenSSH
Rules updated
Rules updated (v6)OpenSSH е профил на приложение, който ufw познава (той означава порт 22/tcp). Ако SSH работи на друг порт, използвайте номера: sudo ufw allow 2222/tcp. Обърнете внимание на "Rules updated (v6)": ufw създава правилото и за IPv6. Това става, защото в /etc/default/ufw е зададено IPV6=yes, което е настройката по подразбиране. Проверете го; ако стойността е no, защитната стена важи само за IPv4.
Стъпка 3: всичко останало, от което имате нужда.
anna@web1:~$ sudo ufw allow 80/tcp
anna@web1:~$ sudo ufw allow 443/tcp
anna@web1:~$ sudo ufw allow 443/udp # само ако използвате HTTP/3Можете да ограничите правило до един адрес на източника, например за порт за администриране, който трябва да е достъпен само от Вашия офис:
anna@web1:~$ sudo ufw allow from 198.51.100.20 to any port 9090 proto tcpСтъпка 4: включване.
anna@web1:~$ sudo ufw enable
Command may disrupt existing ssh connections. Proceed with operation (y|n)? y
Firewall is active and enabled on system startupСтъпка 5: проверка. Отворете втори прозорец и влезте отново. Ако успеете, SSH е настроен правилно. След това прегледайте правилата:
anna@web1:~$ sudo ufw status verbose
Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), deny (routed)
New profiles: skip
To Action From
-- ------ ----
22/tcp (OpenSSH) ALLOW IN Anywhere
80/tcp ALLOW IN Anywhere
443/tcp ALLOW IN Anywhere
22/tcp (OpenSSH (v6)) ALLOW IN Anywhere (v6)
80/tcp (v6) ALLOW IN Anywhere (v6)
443/tcp (v6) ALLOW IN Anywhere (v6)Премахването на правило става чрез номера: sudo ufw status numbered, а след това sudo ufw delete 3.
deny, reject и limit
- deny тихо отхвърля пакета: отвън портът изглежда "филтриран" (урок 5.1).
- reject връща отказ: отвън портът изглежда "затворен". Това е по-коректно за Вашите собствени услуги, но издава, че там има сървър.
- limit пропуска връзката, но блокира адрес, който се опита да се свърже шест или повече пъти в рамките на 30 секунди. Удобно е за SSH:
sudo ufw limit OpenSSHвместоallow. Методът е груб (брои връзки, а не неуспешни влизания); fail2ban (урок 5.3) е по-прецизен.
Същите правила в nftables
ufw всъщност записва правила в netfilter. Ако искате да работите без ufw, сами пишете файл за nftables. В Debian той се намира в /etc/nftables.conf и се зарежда от услугата nftables:
#!/usr/sbin/nft -f
flush ruleset
table inet filter {
chain input {
type filter hook input priority 0; policy drop;
ct state established,related accept
ct state invalid drop
iif "lo" accept
meta l4proto { icmp, ipv6-icmp } accept
tcp dport { 22, 80, 443 } accept
}
chain forward {
type filter hook forward priority 0; policy drop;
}
chain output {
type filter hook output priority 0; policy accept;
}
}Ето как да го прочетете. Таблицата се казва filter и е от семейството inet: една таблица едновременно за IPv4 и IPv6, така че не можете да забравите IPv6. Във веригата input политиката е drop. След това: отговорите на вече установени връзки се пропускат (established,related), всичко през loopback е разрешено, ICMP е разрешен (необходим е, наред с друго, за IPv6 и за съобщенията за грешки при размера на пакетите), а портовете 22, 80 и 443 са отворени.
anna@web1:~$ sudo nft -c -f /etc/nftables.conf # проверка без зареждане
anna@web1:~$ sudo systemctl enable --now nftables
anna@web1:~$ sudo nft list rulesetИзползвайте или ufw, или собствен файл за nftables, не и двете: те записват в един и същ netfilter и могат да си пречат взаимно с правилата.
От какво защитната стена не Ви предпазва
- Услугите, които сами разрешавате. Порт 443 е отворен за Вашия уебсайт; следователно уязвимост в уебсайта е напълно достъпна. Защитната стена пази само затворените портове.
- Docker. Когато публикувате порт с Docker (
-p 5432:5432), Docker задава свои собствени правила в netfilter, които пренасочват трафика, преди да се приложат правилата на ufw. Документацията на Docker изрично казва, че Docker и ufw не работят добре заедно. Така порт на контейнер може да е отворен отвън, докатоufw statusне го показва. Решението (публикуване на127.0.0.1) ще научите в урок 9.3. - Изходящият трафик. При "allow outgoing" една хакната програма може да се свърже навсякъде. За повечето малки сървъри това е приемлив избор; в строги среди ограничават и изходящия трафик.
Защитната стена на Вашия доставчик
Много доставчици предлагат и защитна стена в мрежата, пред Вашия сървър, която настройвате в клиентския панел (понякога се нарича "cloud firewall" или "security group"). Тя е отличен допълнителен слой и работи дори ако сгрешите нещо на самия сървър. Но тя не замества защитната стена на сървъра: ако преместите сървъра или смените доставчика, тя не идва с Вас, а и не всеки доставчик я предлага. Затова винаги поддържайте защитна стена и на самия сървър.
В AlmaLinux и Rocky Linux
Там по подразбиране е включен firewalld, който работи със зони. Най-важните команди:
[root@web1 ~]# firewall-cmd --list-all
[root@web1 ~]# firewall-cmd --permanent --add-service=http --add-service=https
[root@web1 ~]# firewall-cmd --reloadБез --permanent промяната важи само до следващото рестартиране; с --permanent тя влиза в сила едва след --reload. В зоната по подразбиране SSH вече е отворен.
На практика
Ако все пак блокирате собствения си достъп до VPS при WebOké, отворете конзолата в екрана на VPS, влезте и изключете защитната стена (ufw disable) или отменете последното правило. При други доставчици този авариен вход също се нарича console, VNC или rescue. Разберете къде е този бутон, преди да Ви потрябва.
Обобщение
- Защитната стена е Вашият втори слой след принципа "слушай само където е нужно"; nftables е инструментът за ядрото, а ufw е опростен слой над него.
- Започнете с
default deny incoming, разрешете SSH предиufw enable, тествайте с втора сесия и се запознайте с конзолата на Вашия доставчик. - Проверете дали ufw покрива и IPv6 (
IPV6=yes); в nftables семействотоinetправи това наведнъж. denyпоказва отвън "филтриран",rejectпоказва "затворен";limitзабавя повтарящите се връзки.- Портовете на Docker заобикалят ufw (урок 9.3); защитната стена на доставчика е допълнителен слой, а не заместител.
Тест (quiz)
Задача
Задача O5.2: Настройване на Вашата защитна стена. Включете на сървъра си защитна стена с ufw (или nftables, или firewalld на AlmaLinux/Rocky): по подразбиране всичко входящо е затворено, разрешени са SSH и само това, от което наистина имате нужда. Тествайте с втора сесия, проверете дали IPv6 е покрит и проверете отвън с nc дали неразрешен порт е затворен или филтриран. Попълнете контролния списък и поставете резултата от ufw status verbose (или nft list ruleset); за всеки отворен порт посочете за какво служи.
Задача O5.2: Настройване на Вашата защитна стена
Тази задача изпълнявате сами; никой не я проверява. Отбележете какво сте направили и маркирайте задачата като изпълнена.
За уеб сървър само 22 (или Вашият SSH порт), 80 и 443, за IPv4 и IPv6. Портовете за управление само от фиксиран адрес или през SSH тунел. През конзолата: ufw disable (или изчистване на правилата на nftables).
Вашите отметки и бележки остават само в този браузър; не ги изпращаме никъде. Ако сте влезли, в Моите курсове запазваме само че сте изпълнили задачата.
Още за четене
- Защита на Вашия VPS: първите пет минути
- Нямате повече достъп до Вашия VPS: какво да направите?
- Debian Wiki, nftables: https://wiki.debian.org/nftables
- Документация на Ubuntu Server, Firewall (ufw): https://ubuntu.com/server/docs/how-to/security/firewalls/
- Документация на Docker, Packet filtering and firewalls: https://docs.docker.com/engine/network/packet-filtering-firewalls/
- Кои услуги слушат на Вашия VPS и какво е достъпно отвън?
- VPS: от първото влизане до сигурен сървър 3.4: Защитна стена с ufw (или nftables)
