linux-labs

Вики / Сеть

iptables (legacy-файрвол)

Концепция Linux · iptables СетьБезопасностьФайрвол

Классический файрвол 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                     # сохранить

См. также