Перейти к содержимому
RunStack
Вики· Обновлено 29 окт. 2026 г.

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) в панели хостера.