iptables — Firewall Rules
If you like this project, consider supporting me on Buy Me a Coffee ☕️
iptables — Linux Packet Filtering
iptables is the traditional Linux userspace tool for configuring the kernel's netfilter packet filtering framework. It manages rules for firewalling, NAT, and traffic shaping. While still widely deployed, iptables is considered legacy — nftables is the modern replacement (available since kernel 3.13+). New deployments should prefer nftables.
📚 Official Docs / Официальная документация: iptables(8) · netfilter.org
[!IMPORTANT]
iptablesis legacy. For new deployments, usenftables— see the nftables cheatsheet and migration guide.
📘 Basics / Основы
Chains & Tables / Цепочки и таблицы
# filter table: INPUT, FORWARD, OUTPUT / таблица filter: INPUT, FORWARD, OUTPUT
# nat table: PREROUTING, POSTROUTING, OUTPUT / таблица nat: PREROUTING, POSTROUTING, OUTPUT
# mangle table: PREROUTING, POSTROUTING, INPUT, OUTPUT, FORWARD / таблица mangle
Policy / Политика по умолчанию
sudo iptables -P INPUT ACCEPT # Allow all input / Разрешить весь входящий
sudo iptables -P INPUT DROP # Drop all input / Запретить весь входящий
sudo iptables -P FORWARD DROP # Drop all forwarding / Запретить всю пересылку
sudo iptables -P OUTPUT ACCEPT # Allow all output / Разрешить весь исходящий
🔍 List & View Rules / Просмотр правил
sudo iptables -L # List rules / Список правил
sudo iptables -L -n # List without DNS / Без DNS разрешения
sudo iptables -L -v # Verbose / Подробный
sudo iptables -L -n -v # Numeric verbose / Числа и подробности
sudo iptables -L INPUT # List INPUT chain / Список цепочки INPUT
sudo iptables -L OUTPUT # List OUTPUT chain / Список цепочки OUTPUT
sudo iptables -L -t nat # List NAT table / Список таблицы NAT
sudo iptables -L -t mangle # List mangle table / Список таблицы mangle
sudo iptables -L --line-numbers # Show line numbers / Показать номера строк
sudo iptables -S # Show rules as commands / Показать как команды
⬇️ INPUT Chain / Входящий трафик
Allow Specific Ports / Разрешить конкретные порты
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT # Allow SSH / Разрешить SSH
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT # Allow HTTP / Разрешить HTTP
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT # Allow HTTPS / Разрешить HTTPS
sudo iptables -A INPUT -p tcp --dport 3306 -j ACCEPT # Allow MySQL / Разрешить MySQL
sudo iptables -A INPUT -p tcp --dport 5432 -j ACCEPT # Allow PostgreSQL / Разрешить PostgreSQL
sudo iptables -A INPUT -p tcp --dport 6379 -j ACCEPT # Allow Redis / Разрешить Redis
Allow Port Range / Разрешить диапазон портов
sudo iptables -A INPUT -p tcp --dport 8000:8999 -j ACCEPT # Ports 8000-8999 / Порты 8000-8999
Allow Specific IP / Разрешить конкретный IP
sudo iptables -A INPUT -s <IP> -j ACCEPT # Allow from IP / Разрешить с IP
sudo iptables -A INPUT -s <IP>/24 -j ACCEPT # Allow from subnet / Разрешить с подсети
sudo iptables -A INPUT -s <IP> -p tcp --dport 22 -j ACCEPT # Allow IP to SSH / Разрешить IP на SSH
Allow Established Connections / Разрешить установленные соединения
sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT # Allow established / Разрешить установленные
sudo iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # Alternative / Альтернатива
Allow Loopback / Разрешить loopback
sudo iptables -A INPUT -i lo -j ACCEPT # Allow loopback / Разрешить loopback
Drop/Reject Traffic / Запретить трафик
sudo iptables -A INPUT -j DROP # Drop all / Запретить всё
sudo iptables -A INPUT -j REJECT # Reject all / Отклонить всё
sudo iptables -s <IP> -A INPUT -j DROP # Drop from IP / Запретить с IP
sudo iptables -A INPUT -p tcp --dport 23 -j DROP # Drop telnet / Запретить telnet
⬆️ OUTPUT Chain / Исходящий трафик
sudo iptables -A OUTPUT -p tcp --dport 80 -j ACCEPT # Allow HTTP out / Разрешить HTTP исходящий
sudo iptables -A OUTPUT -p tcp --dport 443 -j ACCEPT # Allow HTTPS out / Разрешить HTTPS исходящий
sudo iptables -A OUTPUT -d <IP> -j DROP # Block destination IP / Заблокировать IP назначения
sudo iptables -A OUTPUT -m owner --uid-owner <USER> -j ACCEPT # Allow user / Разрешить пользователю
🔀 FORWARD Chain / Пересылка
sudo iptables -A FORWARD -i eth0 -o eth1 -j ACCEPT # Forward eth0→eth1 / Пересылка eth0→eth1
sudo iptables -A FORWARD -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT # Forward established / Пересылка установленных
sudo iptables -A FORWARD -i wg0 -j ACCEPT # Forward from VPN / Пересылка с VPN
sudo iptables -A FORWARD -o wg0 -j ACCEPT # Forward to VPN / Пересылка в VPN
🌐 NAT & Port Forwarding / NAT и проброс портов
SNAT (Source NAT) / SNAT (NAT источника)
sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE # Masquerade / Маскарад
sudo iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source <PUBLIC_IP> # Static SNAT / Статический SNAT
DNAT (Destination NAT) / DNAT (NAT назначения)
sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination <INTERNAL_IP>:80 # Port forward / Проброс порта
sudo iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to-destination <INTERNAL_IP>:80 # Port redirect / Перенаправление порта
Docker NAT / Docker NAT
sudo iptables -t nat -A POSTROUTING -s 172.17.0.0/16 ! -o docker0 -j MASQUERADE # Docker NAT / Docker NAT
💾 Saving & Restoring / Сохранение и восстановление
Save Rules / Сохранение правил
sudo iptables-save > /etc/iptables/rules.v4 # Save IPv4 / Сохранить IPv4
sudo ip6tables-save > /etc/iptables/rules.v6 # Save IPv6 / Сохранить IPv6
sudo iptables-save | sudo tee /etc/iptables/rules.v4 # Alternative / Альтернатива
Restore Rules / Восстановление правил
sudo iptables-restore < /etc/iptables/rules.v4 # Restore IPv4 / Восстановить IPv4
sudo ip6tables-restore < /etc/iptables/rules.v6 # Restore IPv6 / Восстановить IPv6
Persistent Rules (Debian/Ubuntu) / Постоянные правила (Debian/Ubuntu)
sudo apt install iptables-persistent # Install persistence / Установить сохранение
sudo netfilter-persistent save # Save current rules / Сохранить текущие правила
sudo netfilter-persistent reload # Reload rules / Перезагрузить правила
Persistent Rules (RHEL/CentOS) / Постоянные правила (RHEL/CentOS)
sudo service iptables save # Save rules / Сохранить правила
sudo systemctl enable iptables # Enable on boot / Включить при загрузке
🧩 Common Patterns / Распространённые шаблоны
Basic Firewall Setup / Базовая настройка файрвола
# Flush existing rules / Очистить существующие правила
sudo iptables -F
sudo iptables -X
# Set default policies / Установить политики по умолчанию
sudo iptables -P INPUT DROP
sudo iptables -P FORWARD DROP
sudo iptables -P OUTPUT ACCEPT
# Allow loopback / Разрешить loopback
sudo iptables -A INPUT -i lo -j ACCEPT
# Allow established / Разрешить установленные
sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
# Allow SSH / Разрешить SSH
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# Allow HTTP/HTTPS / Разрешить HTTP/HTTPS
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT
# Save rules / Сохранить правила
sudo iptables-save > /etc/iptables/rules.v4
Web Server Firewall / Файрвол веб-сервера
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT # HTTP
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT # HTTPS
sudo iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW -m recent --set # SSH rate limit
sudo iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW -m recent --update --seconds 60 --hitcount 4 -j DROP
Database Server Firewall / Файрвол сервера БД
# Allow only from app server / Разрешить только с сервера приложений
sudo iptables -A INPUT -s <APP_SERVER_IP> -p tcp --dport 3306 -j ACCEPT # MySQL
sudo iptables -A INPUT -s <APP_SERVER_IP> -p tcp --dport 5432 -j ACCEPT # PostgreSQL
sudo iptables -A INPUT -p tcp --dport 3306 -j DROP # Drop other MySQL
sudo iptables -A INPUT -p tcp --dport 5432 -j DROP # Drop other PostgreSQL
Rate Limiting / Ограничение частоты
# SSH brute force protection / Защита SSH от перебора
sudo iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW -m recent --set
sudo iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW -m recent --update --seconds 60 --hitcount 4 -j DROP
# HTTP rate limit / Ограничение HTTP
sudo iptables -A INPUT -p tcp --dport 80 -m limit --limit 25/minute --limit-burst 100 -j ACCEPT
Block Specific Country (using ipset) / Блокировка конкретной страны
sudo ipset create blocklist hash:net # Create ipset / Создать ipset
sudo ipset add blocklist <COUNTRY_CIDR> # Add CIDR / Добавить CIDR
sudo iptables -A INPUT -m set --match-set blocklist src -j DROP # Block / Заблокировать
🔧 Rule Management / Управление правилами
Insert Rule / Вставить правило
sudo iptables -I INPUT 1 -p tcp --dport 22 -j ACCEPT # Insert at position 1 / Вставить в позицию 1
Delete Rule / Удалить правило
sudo iptables -D INPUT -p tcp --dport 22 -j ACCEPT # Delete by specification / Удалить по спецификации
sudo iptables -D INPUT 1 # Delete by line number / Удалить по номеру строки
Replace Rule / Заменить правило
sudo iptables -R INPUT 1 -p tcp --dport 2222 -j ACCEPT # Replace rule 1 / Заменить правило 1
Flush Rules / Очистить правила
sudo iptables -F # Flush all chains / Очистить все цепочки
sudo iptables -F INPUT # Flush INPUT chain / Очистить INPUT
sudo iptables -t nat -F # Flush NAT table / Очистить таблицу NAT
sudo iptables -X # Delete user chains / Удалить пользовательские цепочки
🐛 Troubleshooting / Устранение неполадок
Debug Rules / Отладка правил
sudo iptables -L -n -v --line-numbers # Detailed list / Подробный список
sudo iptables -L -t nat -n -v # NAT table / Таблица NAT
sudo iptables -L -t mangle -n -v # Mangle table / Таблица mangle
Check Packet Counters / Проверка счётчиков пакетов
sudo iptables -L -n -v # View counters / Просмотр счётчиков
sudo iptables -Z # Reset counters / Сбросить счётчики
Log Dropped Packets / Логирование отброшенных пакетов
sudo iptables -A INPUT -j LOG --log-prefix "IPTABLES-DROPPED: " --log-level 4 # Log before drop / Лог перед отбросом
sudo iptables -A INPUT -j DROP # Drop / Отбросить
sudo journalctl -k | grep IPTABLES # View logs / Просмотр логов
Test Rule Without Applying / Тестирование правила без применения
sudo iptables -C INPUT -p tcp --dport 22 -j ACCEPT # Check if rule exists / Проверить существование правила
IPv6 / IPv6
sudo ip6tables -L -n -v # List IPv6 rules / Список IPv6 правил
sudo ip6tables -A INPUT -p tcp --dport 22 -j ACCEPT # Allow SSH IPv6 / Разрешить SSH IPv6
sudo ip6tables-save > /etc/iptables/rules.v6 # Save IPv6 / Сохранить IPv6
🌟 Real-World Examples / Примеры из практики
Docker Host Firewall / Файрвол хоста Docker
# Allow Docker containers / Разрешить Docker контейнеры
sudo iptables -A FORWARD -i docker0 -o eth0 -j ACCEPT
sudo iptables -A FORWARD -i eth0 -o docker0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
sudo iptables -t nat -A POSTROUTING -s 172.17.0.0/16 ! -o docker0 -j MASQUERADE
VPN Server (WireGuard) / VPN сервер (WireGuard)
sudo iptables -A FORWARD -i wg0 -j ACCEPT
sudo iptables -A FORWARD -o wg0 -j ACCEPT
sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
Port Knocking / Порт knock
# Advanced port knocking setup / Продвинутая настройка port knocking
# Requires recent module / Требует модуль recent
sudo iptables -A INPUT -m conntrack --ctstate NEW -m tcp -p tcp --dport 1111 -m recent --set --name KNOCK1
sudo iptables -A INPUT -m conntrack --ctstate NEW -m tcp -p tcp --dport 2222 -m recent --rcheck --seconds 10 --name KNOCK1 -m recent --set --name KNOCK2
sudo iptables -A INPUT -m conntrack --ctstate NEW -m tcp -p tcp --dport 22 -m recent --rcheck --seconds 10 --name KNOCK2 -j ACCEPT
Kubernetes NodePort / Kubernetes NodePort
# Allow Kubernetes NodePort range / Разрешить диапазон NodePort Kubernetes
sudo iptables -A INPUT -p tcp --dport 30000:32767 -j ACCEPT
Load Balancer / Балансировщик нагрузки
# Round-robin to backends / Round-robin на бэкенды
sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -m statistic --mode nth --every 2 --packet 0 -j DNAT --to-destination <BACKEND1>:80
sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -m statistic --mode nth --every 2 --packet 1 -j DNAT --to-destination <BACKEND2>:80
💡 Best Practices / Лучшие практики
Always test rules before saving / Всегда тестируйте правила перед сохранением
Use --line-numbers for easy management / Используйте --line-numbers для управления
Log dropped packets for debugging / Логируйте отброшенные пакеты для отладки
Prefer nftables for new deployments / Предпочтите nftables для новых развёртываний
Keep backup of working rules / Держите резервную копию рабочих правил
Test connectivity after rule changes / Тестируйте подключение после изменений
🔧 Configuration Files / Файлы конфигурации
# /etc/iptables/rules.v4 — IPv4 rules / Правила IPv4
# /etc/iptables/rules.v6 — IPv6 rules / Правила IPv6
# /etc/sysconfig/iptables — RHEL/CentOS rules / Правила RHEL/CentOS
📋 Migration to nftables / Миграция на nftables
iptables-translate -A INPUT -p tcp --dport 22 -j ACCEPT # Convert to nftables / Конвертировать в nftables
iptables-restore-translate -f /etc/iptables/rules.v4 # Convert entire ruleset / Конвертировать весь набор