iptables и nftables
iptables и nft: посмотреть правила, открыть и закрыть порт, whitelist, сохранить после перезагрузки, проброс портов, ufw.
Проверить, что получилось, — анализатор правил: вставьте вывод iptables-save или nft list ruleset.
Что у меня стоит
iptables -V # (nf_tables) — iptables поверх nft; (legacy) — старый
nft list ruleset | head # правила nft (в том числе созданные через iptables-nft)
ufw status verbose # если стоит ufw
firewall-cmd --state # если стоит firewalld
Правьте через один инструмент: ufw, firewalld или iptables/nft напрямую. Смешивание — главный источник «правило есть, а не работает».
Посмотреть правила
iptables -S # как команды
iptables -L INPUT -n -v --line-numbers # таблицей, со счётчиками и номерами
iptables -t nat -L -n -v # NAT (Docker, проброс портов)
iptables-save > rules-$(date +%F).txt # всё сразу — для анализатора и бэкапа
ip6tables-save # то же для IPv6 — его часто забывают
nft list ruleset
Базовый набор: всё закрыто, кроме нужного
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -p tcp -m multiport --dports 80,443 -j ACCEPT
iptables -P INPUT DROP # последним — после правила для SSH
То же в nft:
table inet filter {
chain input {
type filter hook input priority 0; policy drop;
iif "lo" accept
ct state established,related accept
tcp dport 22 accept
tcp dport { 80, 443 } accept
}
}
nft -f /etc/nftables.conf && systemctl enable nftables
Открыть, закрыть, удалить
iptables -I INPUT 3 -p tcp --dport 8443 -j ACCEPT # вставить третьим
iptables -A INPUT -p tcp --dport 6379 -j DROP
iptables -L INPUT --line-numbers # номер правила
iptables -D INPUT 5 # удалить по номеру
iptables -D INPUT -p tcp --dport 8443 -j ACCEPT # удалить по тексту
nft -a list chain inet filter input # номера (handle) в nft
nft delete rule inet filter input handle 12
Порядок важен: правила проверяются сверху вниз до первого ACCEPT или DROP. DROP ниже разрешающего правила для всех ничего не закроет.
Whitelist: только с моих адресов
iptables -A INPUT -p tcp --dport 22 -s 203.0.113.10 -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -s 198.51.100.0/24 -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j DROP
Много адресов — набором (ipset в iptables, set в nft):
ipset create admins hash:net
ipset add admins 203.0.113.10
iptables -A INPUT -p tcp --dport 22 -m set --match-set admins src -j ACCEPT
set admins { type ipv4_addr; flags interval; elements = { 203.0.113.10, 198.51.100.0/24 } }
tcp dport 22 ip saddr @admins accept
Ограничить частоту (SSH)
iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW -m recent --set
iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW -m recent --update --seconds 60 --hitcount 6 -j DROP
tcp dport 22 ct state new limit rate over 6/minute drop
Удобнее — fail2ban: он банит только тех, кто подбирает пароль. Включает rs harden.
Сохранить после перезагрузки
apt install iptables-persistent
netfilter-persistent save # → /etc/iptables/rules.v4 и rules.v6
iptables-restore < /etc/iptables/rules.v4
nft list ruleset > /etc/nftables.conf && systemctl enable nftables
Проброс порта (NAT)
sysctl -w net.ipv4.ip_forward=1
iptables -t nat -A PREROUTING -p tcp --dport 2222 -j DNAT --to-destination 10.0.0.5:22
iptables -t nat -A POSTROUTING -d 10.0.0.5 -p tcp --dport 22 -j MASQUERADE
iptables -A FORWARD -d 10.0.0.5 -p tcp --dport 22 -j ACCEPT
ufw — то же короче
ufw default deny incoming && ufw default allow outgoing
ufw allow 22/tcp
ufw allow from 203.0.113.10 to any port 5432 proto tcp
ufw status numbered && ufw delete 3
Порты, опубликованные Docker, ufw не закрывает — см. Docker и файрвол.
Не отрезать себе доступ
iptables-save > /root/fw-ok.txt
echo "iptables-restore < /root/fw-ok.txt" | at now + 5 minutes # откат через 5 минут
# … меняете правила, проверяете вход из НОВОГО окна …
atq && atrm <номер> # всё хорошо — отменить откат
Так же откатывает SSH и файрвол rs harden. На крайний случай — консоль (VNC) в панели хостера.
