iptables
— это мощный инструмент для настройки сетевого экрана (firewall) в операционных системах Linux. Он позволяет контролировать входящий и исходящий трафик, а также управлять правилами перенаправления пакетов. В этой инструкции мы рассмотрим основные команды и принципы работы с iptables
.
1. Основные концепции
1.1 Таблицы (Tables
)
iptables
работает с несколькими таблицами, каждая из которых отвечает за определенные типы правил:
- filter (по умолчанию): используется для фильтрации пакетов.
- nat: используется для Network Address Translation (NAT), например, для перенаправления или маскарадинга.
- mangle: используется для изменения параметров пакетов (например, TOS, TTL).
- raw: используется для исключения пакетов из процесса трекинга соединений.
1.2 Цепочки (Chains
)
Каждая таблица содержит цепочки, которые представляют собой набор правил:
- INPUT: обрабатывает пакеты, предназначенные для локальной машины.
- OUTPUT: обрабатывает пакеты, отправляемые с локальной машины.
- FORWARD: обрабатывает пакеты, проходящие через машину (маршрутизация).
- PREROUTING: обрабатывает пакеты до применения маршрутизации (таблица nat).
- POSTROUTING: обрабатывает пакеты после применения маршрутизации (таблица nat).
1.3 Правила (Rules
)
Правило состоит из условий и действия, которое будет выполнено, если условия совпадают:
- Условия могут быть основаны на IP-адресах, портах, протоколах и других параметрах.
- Действия:
ACCEPT
,DROP
,REJECT
,LOG
,MASQUERADE
и др.
2. Базовые команды
2.1 Просмотр текущих правил
# Просмотр всех правил в таблице filter (по умолчанию)
sudo iptables -L
# Вывести правила с их номерами
sudo iptables -L --line-numbers
# Просмотр всех правил с детальной информацией о пакетах
sudo iptables -L -v -n
# Просмотр правил в конкретной таблице (например, nat)
sudo iptables -t nat -L
2.2 Очистка правил
# Очистка всех правил в таблице filter
sudo iptables -F
# Очистка всех правил в таблице nat
sudo iptables -t nat -F
# Сброс политик (например, установка политики DROP)
sudo iptables -P INPUT DROP
sudo iptables -P OUTPUT DROP
sudo iptables -P FORWARD DROP
2.3 Удаление правила по номеру
Чтобы вывести правила с их номерами, используйте следующую команду:
sudo iptables -L --line-numbers
Объяснение:—line-numbers: добавляет нумерацию правил в выводе.
Пример вывода:
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 ACCEPT tcp -- anywhere anywhere tcp dpt:ssh
2 DROP tcp -- anywhere anywhere tcp dpt:http
Chain FORWARD (policy ACCEPT)
num target prot opt source destination
Chain OUTPUT (policy ACCEPT)
num target prot opt source destination
Удаление правила по номеру
Чтобы удалить правило по его номеру, используйте команду -D
вместе с номером правила и указанием цепочки (INPUT
, OUTPUT
, FORWARD
):
sudo iptables -D <CHAIN> <RULE_NUMBER>
Пример:
Если нужно удалить правило №1 из цепочки INPUT
:
sudo iptables -D INPUT 1
Важные замечания:
Порядок правил важен: После удаления правила все последующие правила будут перенумерованы.
Проверка после удаления: После удаления правила можно снова проверить список с нумерацией:
sudo iptables -L --line-numbers
Таким образом, вы можете легко управлять правилами с помощью их номеров.
Затем заходим в фаил /etc/iptables/rules.v4
, удаляем правила которые мы уже удалили выше. Сохраняем изменения и выходим.
3. Создание правил
3.1 Разрешение трафика
# Разрешить все входящие подключения
sudo iptables -A INPUT -j ACCEPT
# Разрешить входящий трафик на определенный порт (например, SSH)
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# Разрешить трафик только от определенного IP-адреса
sudo iptables -A INPUT -s 192.168.1.100 -j ACCEPT
3.2 Запрет трафика
# Запретить все входящие подключения
sudo iptables -A INPUT -j DROP
# Запретить входящий трафик на определенный порт
sudo iptables -A INPUT -p tcp --dport 80 -j DROP
# Запретить трафик от определенного IP-адреса
sudo iptables -A INPUT -s 192.168.1.200 -j DROP
3.3 Логирование трафика
# Логировать все входящие пакеты
sudo iptables -A INPUT -j LOG --log-prefix "Dropped: "
# Логировать только определенный тип трафика
sudo iptables -A INPUT -p tcp --dport 22 -j LOG --log-prefix "SSH Attempt: "
4. NAT и перенаправление трафика
4.1 Маскарадинг (Masquerading)
Маскарадинг позволяет скрыть внутренние IP-адреса за внешним адресом.
# Включить маскарадинг для интерфейса eth0
sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
4.2 Перенаправление портов
# Перенаправить входящий трафик с порта 80 на порт 8080
sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080
5. Сохранение и восстановление правил
5.1 Сохранение правил
Правила iptables
не сохраняются автоматически при перезагрузке системы. Чтобы сохранить их, используйте следующие команды:
На Ubuntu/Debian:
# Сохранить правила в файл
sudo sh -c "iptables-save > /etc/iptables/rules.v4"
# Восстановить правила из файла
sudo sh -c "iptables-restore < /etc/iptables/rules.v4"
На CentOS/RHEL:
# Сохранить правила
sudo service iptables save
# Восстановить правила
sudo service iptables restart
6. Примеры сложных правил
6.1 Разрешить только определенные сервисы
# Разрешить SSH, HTTP и HTTPS
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT
# Запретить остальной трафик
sudo iptables -A INPUT -j DROP
6.2 Защита от SYN-атак
# Ограничить количество одновременных SYN-пакетов
sudo iptables -A INPUT -p tcp --syn -m limit --limit 1/s -j ACCEPT
sudo iptables -A INPUT -p tcp --syn -j DROP
6.3 Ограничение количества попыток входа
# Разрешить максимум 3 попытки входа через SSH в минуту
sudo iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --set
sudo iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 60 --hitcount 3 -j DROP
7. Полезные параметры
Параметр | Описание |
---|---|
-A | Добавить правило в конец цепочки. |
-I | Вставить правило в начало цепочки. |
-D | Удалить правило. |
-R | Заменить правило. |
-p | Указать протокол (tcp, udp, icmp). |
--dport | Указать порт назначения. |
--sport | Указать порт источника. |
-s | Указать источник (IP-адрес или подсеть). |
-d | Указать назначение (IP-адрес или подсеть). |
-j | Указать действие (ACCEPT, DROP, REJECT и др.). |
8. Работа с модулями
iptables
поддерживает множество дополнительных модулей, которые расширяют его функциональность:
conntrack
: управление состоянием соединений.limit
: ограничение скорости или частоты событий.recent
: отслеживание недавних подключений.string
: поиск строк в пакетах.
Пример использования модуля string
:
# Блокировать запросы, содержащие слово "attack"
sudo iptables -A INPUT -p tcp --dport 80 -m string --string "attack" --algo bm -j DROP
9. Отладка и тестирование
9.1 Проверка активных правил
sudo iptables -L -v -n
9.2 Проверка статистики правил
sudo iptables -L -v -n --line-numbers
9.3 Тестирование правил
Используйте утилиту ping
, telnet
или nc
для проверки доступности портов и сервисов.
10. Альтернативы iptables
Если вам нужен более современный и удобный инструмент, рассмотрите использование:
nftables
: новое поколение файрвола, заменяющееiptables
.ufw
(Uncomplicated Firewall): простой интерфейс для управленияiptables
.
Это базовая и расширенная инструкция по работе с iptables
. Для более сложных задач рекомендуется изучать документацию и примеры конфигураций.
Общие рекомендации
Тестирование правил : Перед сохранением правил убедитесь, что они работают корректно. Например, проверьте, что вы можете подключиться к серверу через SSH после изменений.
Бэкап правил : Перед внесением значительных изменений сделайте резервную копию текущих правил.
Автоматическое восстановление : Убедитесь, что ваша система настроена на автоматическую загрузку правил при старте. Это обычно делается через соответствующие службы (iptables-persistent
, netfilter-persistent
или iptables
).