Вики / Сеть
iptables (legacy-файрвол)
Классический файрвол Linux — цепочки, правила, NAT; и почему теперь nftables.
iptables — классический интерфейс к файрволу Linux. На современных системах его сменил nftables (в Ubuntu iptables обычно транслируется в nftables), но iptables-правила и синтаксис всё ещё повсюду — их надо уметь читать и править.
Модель: таблицы (filter, nat, mangle) → цепочки (INPUT, FORWARD, OUTPUT, PREROUTING, POSTROUTING) → правила по порядку → действие (ACCEPT/DROP/REJECT).
| Ключ | Значение |
|---|---|
-L |
показать правила (-n без DNS, -v счётчики) |
-t TABLE |
таблица: filter (умолч.), nat, mangle |
-A CHAIN |
добавить правило в конец цепочки |
-I CHAIN [N] |
вставить в начало / в позицию N |
-D CHAIN N |
удалить правило N |
-P CHAIN ACT |
политика цепочки по умолчанию |
-F |
очистить цепочку (flush) |
-p / --dport / -s / -i |
протокол / порт назначения / источник / интерфейс |
-j |
действие: ACCEPT, DROP, REJECT, DNAT, SNAT, MASQUERADE |
--line-numbers |
номера правил (для -D/-I) |
sudo iptables -L -n -v # правила filter, без DNS, со счётчиками
sudo iptables -L INPUT -n --line-numbers # INPUT с номерами (для удаления/вставки)
sudo iptables -t nat -L -n -v # таблица NAT
# базовый набор INPUT (порядок важен!):
sudo iptables -A INPUT -i lo -j ACCEPT # loopback
sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT # ответы
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT # SSH (СНАЧАЛА!)
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT # HTTP
sudo iptables -P INPUT DROP # политика — drop
# точечные операции:
sudo iptables -I INPUT 1 -s 10.0.0.5 -j DROP # вставить первым: забанить IP
sudo iptables -D INPUT 3 # удалить правило №3
sudo iptables -F INPUT # очистить цепочку INPUT
# NAT (проброс порта на внутренний хост):
sudo iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to 10.0.0.10:80
sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE # шлюз/SNAT
⚠️ Правила iptables не сохраняются сами. Постоянство — пакет
iptables-persistent(sudo netfilter-persistent save) или переход на nftables.
Закрыл себе SSH
Правило для 22/tcp должно идти до DROP-политики. Если уже заблокировал — зайди
через консоль (KVM/IPMI), sudo iptables -I INPUT 1 -p tcp --dport 22 -j ACCEPT.
На удалёнке полезно ставить правила с авто-откатом (at now+5min на flush).
Правила пропали после ребута
iptables не персистентен. sudo netfilter-persistent save (с iptables-persistent),
либо используй nftables/ufw (см. firewall).
Порядок имеет значение
Правила применяются сверху вниз до первого совпадения. Смотри --line-numbers,
вставляй в нужное место через -I CHAIN N ..., а не только -A (в конец).
Счётчики не растут — правило не срабатывает
-L -v показывает счётчики пакетов на правило. Ноль = трафик не доходит до него
(перехвачен выше) или не тот интерфейс/цепочка.
Не пойму, iptables или nftables на самом деле
В Ubuntu iptables часто = iptables-nft (бэкенд nftables). Реальный набор —
sudo nft list ruleset (см. firewall).
sudo iptables -L -n -v --line-numbers # читать правила
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT # сначала SSH!
sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
sudo iptables -I INPUT 1 -s IP -j DROP # забанить IP первым
sudo iptables -P INPUT DROP ; sudo iptables -D INPUT N
sudo netfilter-persistent save # сохранить
См. также
- sysctl (параметры ядра) — Загрузка
- ss (сокеты и порты) — Сеть
- Файрвол (nftables / ufw) — Сеть