Настройка netfilter с помощью iptables
Утилита командной строки iptables используется для настройки брандмауэра netfilter, встроенного в систему на базе ядра Linux.
Данная инструкция подходит как для чайников, которые хотят разбираться в аспектах защиты сети, так и опытных специалистов в качестве шпаргалки.
Общий синтаксис
Ключи
Примеры
Общие команды
Разрешить все
Работа с простыми правилами
Проброс портов
Стартовая настройка
Сброс на стандартные настройки
Сохранение правил
Использование в Ubuntu и CentOS
Принцип настройки
Общий синтаксис использования iptables:
iptables -t <таблица> <команда> <цепочка> [номер] <условие> <действие>
<таблица>
Правила netfilter распределены по 4-м таблицам, каждая из которых имеет свое назначение (подробнее ниже). Она указывается ключом -t, но если данный параметр не указан, действие будет выполняться для таблицы по умолчанию — filter.
<команда>
Команды указывают, какое именно действие мы совершаем над netfilter, например, создаем или удаляем правило.
<цепочка>
В каждой таблице есть цепочки, для каждой из которых создаются сами правила. Например, для вышеупомянутой таблицы filter есть три предопределенные цепочки — INPUT (входящие пакеты), OUTPUT (исходящие) и FORWARD (транзитные).
[номер]
Некоторые команды требуют указания номера правила, например, на удаление или редактирование.
<условие>
Условие описывает критерии отработки того или иного правила.
<действие>
Ну и, собственно, что делаем с пакетом, если он подходит под критерии условия.
* справедливости ради, стоит отметить, что ключ с действием не обязан идти в конце. Просто данный формат чаще всего встречается в инструкциях и упрощает чтение правил.
Ключи iptables и примеры их использования
Для работы с таблицами (iptables -t)
Напоминаю, все правила в netfilter распределены по таблицам. Чтобы работать с конкретной таблицей, необходимо использовать ключ -t.
Ключ | Описание |
---|---|
-t filter | Таблица по умолчанию. С ней работаем, если упускаем ключ -t. Встроены три цепочки — INPUT (входящие), OUTPUT (исходящие) и FORWARD (проходящие пакеты) |
-t nat | Для пакетов, устанавливающий новое соединение. По умолчанию, встроены три цепочки — PREROUTING (изменение входящих), OUTPUT (изменение локальных пакетов перед отправкой) и POSTROUTING (изменение всех исходящих). |
-t mangle | Для изменения пакетов. Цепочки — INPUT, OUTPUT, FORWARD, PREROUTING, POSTROUTING. |
-t raw | Для создания исключений в слежении за соединениями. Цепочки: PREROUTING, OUTPUT. |
Команды
Нижеперечисленные ключи определяют действия, которые выполняет утилита iptables.
Ключ | Описание и примеры |
---|---|
-A | Добавление правила в конец списка: iptables -A INPUT -s 192.168.0.15 -j DROP запретить входящие с 192.168.0.15. |
-D | Удаление правила: iptables -D INPUT 10 удалить правило в цепочке INPUT с номером 10. |
-I | Вставка правила в определенную часть списка: iptables -I INPUT 5 -s 192.168.0.15 -j DROP вставить правило 5-м по списку. |
-R | Замена правила. iptables -R OUTPUT 5 -s 192.168.0.15 -j ACCEPT заменить наше 5-е правило с запрещающего на разрешающее. |
-F | Сброс правил в цепочке. iptables -F INPUT |
-Z | Обнуление статистики. iptables -Z INPUT |
-N | Создание цепочки. iptables -N CHAINNEW |
-X | Удаление цепочки. iptables -X CHAINNEW |
-P | Определение правила по умолчанию. iptables -P INPUT DROP |
-E | Переименовывание цепочки. iptables -E CHAINNEW CHAINOLD |
Условия
Данные ключи определяют условия правила.
Ключ | Описание и примеры |
---|---|
-p | Сетевой протокол. Допустимые варианты — TCP, UDP, ICMP или ALL. iptables -A INPUT -p tcp -j ACCEPT разрешить все входящие tcp-соединения. |
-s | Адрес источника — имя хоста, IP-адрес или подсеть в нотации CIDR. iptables -A INPUT -s 192.168.0.50 -j DROP запретить входящие с узла 192.168.0.50 |
-d | Адрес назначения. Принцип использования аналогичен предыдущему ключу -s. iptables -A OUTPUT -d 192.168.0.50 -j DROP запретить исходящие на узел 192.168.0.50 |
-i | Сетевой адаптер, через который приходят пакеты (INPUT). iptables -A INPUT -i eth2 -j DROP запретить входящие для Ethernet-интерфейса eth2. |
-o | Сетевой адаптер, с которого уходят пакеты (OUTPUT). iptables -A OUTPUT -o eth3 -j ACCEPT разрешить исходящие с Ethernet-интерфейса eth3. |
--dport | Порт назначения. iptables -A INPUT -p tcp --dport 80 -j ACCEPT разрешить входящие на порт 80. |
--sport | Порт источника. iptables -A INPUT -p tcp --sport 1023 -j DROP запретить входящие с порта 1023. |
Перечисленные ключи также поддерживают конструкцию с использованием знака !. Он инвертирует условие, например,
iptables -A INPUT -s ! 192.168.0.50 -j DROP
запретит соединение всем хостам, кроме 192.168.0.50.
Действия
Действия, которые будут выполняться над пакетом, подходящим под критерии условия. Для каждой таблицы есть свой набор допустимых действий. Указываются с использованием ключа -j.
Таблица | Действие | Описание |
---|---|---|
filter | ACCEPT | Разрешает пакет. |
DROP | Запрещает пакет. | |
REJECT | Запрещает с отправкой сообщения источнику. | |
nat | MASQUERADE | Для исходящих пакетов заменяет IP-адрес источника на адрес интерфейса, с которого уходит пакет. |
SNAT | Аналогично MASQUERADE, но с указанием конкретного сетевого интерфейса, чей адрес будет использоваться для подмены. | |
DNAT | Подмена адреса для входящих пакетов. | |
REDIRECT | Перенаправляет запрос на другой порт той же самой системы. | |
mangle | TOS | Видоизменение поля TOS (приоритезация трафика). |
DSCP | Изменение DSCP (тоже приоритезация трафика). | |
TTL | Изменение TTL (время жизни пакета). | |
HL | Аналогично TTL, но для IPv6. | |
MARK | Маркировка пакета. Используется для последующей фильтрации или шейпинга. | |
CONNMARK | Маркировка соединения. | |
TCPMSS | Изменение значения MTU. |
Примеры часто используемых команд iptables
Общие команды
Просмотр правил с их номерами:
iptables -L --line-numbers
Для каждой таблицы смотреть правила нужно отдельно:
iptables -t nat -L --line-numbers
Удалить все правила:
iptables -F
Установить правила по умолчанию:
iptables -P INPUT DROP
iptables -P OUTPUT DROP
* в данных примерах по умолчанию для всех входящих (INPUT) и исходящих (OUTPUT) пакетов будет работать запрещающее правило (DROP).
Разрешить все
Способ 1. С помощью добавления правила:
iptables -I INPUT 1 -j ACCEPT
iptables -I OUTPUT 1 -j ACCEPT
iptables -I FORWARD 1 -j ACCEPT
* данные три команды создадут правила, которые разрешают все входящие, исходящие и транзитные пакеты.
Способ 2. Чисткой правил:
iptables -F
iptables -S
* здесь мы сначала удаляем все правила (-F), затем устанавливаем политику по умолчанию — разрешать входящие, исходящие и транзитные (-S).
Способ 3. Отключение сервиса (удобно для диагностики проблем на время отключить firewall):
service iptables stop
iptables stop
Работа с правилами
1. Добавить правило в конец списка:
iptables -A INPUT -p tcp --dport 25 -j ACCEPT
iptables -A INPUT -p tcp -s ! 192.168.0.25 --dport 993 -i eth0 -j ACCEPT
2. Добавить диапазон портов:
iptables -A INPUT -p tcp --dport 3000:4000 -j ACCEPT
* в данном случае, от 3000 до 4000.
3. Вставить правило:
iptables -I FORWARD 15 -p udp -d 8.8.8.8 --dport 53 -i eth1 -j ACCEPT
4. Заблокировать определенный IP-адрес для подключения по 25 порту:
iptables -I INPUT 1 -s 1.1.1.1 -p tcp --dport 25 -j DROP
5. Разрешить несколько портов:
iptables -A INPUT -p tcp --match multiport --dports 20,21,25,80,8080,3000:4000 -j ACCEPT
Проброс портов (port forwarding)
Рассмотрим пример проброса одного порта и диапазона портов.
Один порт (одинаковые порты)
Существует два способа настройки.
1. Правила PREROUTING + POSTROUTING:
iptables -t nat -A PREROUTING -p tcp -m tcp -d 19.8.232.80 --dport 22 -j DNAT --to-destination 192.168.1.15:22
iptables -t nat -A POSTROUTING -p tcp -m tcp -s 192.168.1.15 --sport 22 -j SNAT --to-source 19.8.232.80:22
* где 19.8.232.80 — адрес, на котором слушаем запросы на подключение; 22 — порт для проброса; 192.168.1.15 — внутренний IP-адрес, на который переводим все запросы.
2. Правила PREROUTING + FORWARD:
iptables -t nat -A PREROUTING -p tcp -i eth1 --dport 22 -j DNAT --to-destination 192.168.1.15:22
iptables -A FORWARD -p tcp -d 192.168.1.15 --dport 22 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
* где eth1 — сетевой интерфейс, на котором слушаем запросы; 22 — порт для проброса; 192.168.1.15 — внутренний IP-адрес, на который переводим все запросы.
Один порт (разные порты)
Рассмотрим ситуацию, когда мы слушаем один порт, а пробрасываем на другой.
iptables -t nat -A PREROUTING -p tcp -i eth1 --dport 8022 -j DNAT --to-destination 192.168.1.15:22
iptables -A FORWARD -p tcp -d 192.168.1.15 --dport 22 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
* где eth1 — сетевой интерфейс, на котором слушаем запросы; 8022 — порт для проброса, на котором будем слушать запросы; 22 — порт для проброса на внутренний адрес; 192.168.1.15 — внутренний IP-адрес, на который переводим все запросы.
Диапазон портов
При необходимости пробросить диапазон портов, используем команды:
iptables -t nat -I PREROUTING -p tcp -m tcp --dport 1000:5000 -j DNAT --to-destination 192.168.1.15:1000-5000
iptables -A FORWARD -d 192.168.1.15 -i eth1 -p tcp -m tcp --dport 1000:5000 -j ACCEPT
* где eth1 — сетевой интерфейс, на котором слушаем запросы; 1000:5000 — порты для проброса (от 1000 до 5000); 192.168.1.15 — внутренний IP-адрес, на который переводим все запросы.
Стартовая настройка
Мы можем начать настройку брандмауэра на сервере с этих команд.
Разрешаем SSH:
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
Создаем правила для нормальной работы apt-get или yum:
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
Разрешаем ICMP (для выполнения команды ping):
iptables -A INPUT -p icmp -j ACCEPT
Разрешаем все входящие на адрес локальной петли:
iptables -A INPUT -i lo -j ACCEPT
Ставим политику запрета на входящие и разрешаем все исходящие:
iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
Настройка по умолчанию
Если мы хотим вернуть настройки в первоночальное значение (разрешено все, правил нет), выполняем команды ниже.
Сначала ставим разрешающую политику для основных цепочек:
iptables -S
Удаляем все правила во всех таблицах:
iptables -F
iptables -t nat -F
iptables -t mangle -F
Удаляем все цепочки, которые не используются:
iptables -X
Сохранение правил (permanent)
По умолчанию, все правила перестают работать после перезапуска сети или компьютера. Для сохранения правил после перезагрузки есть несколько способов настройки.
Способ 1. iptables-save (универсальный)
Сохраняем правила в файл:
iptables-save > /etc/iptables.rules
Открываем настройки сети:
vi /etc/network/interfaces
и добавляем строку:
pre-up iptables-restore < /etc/iptables.rules
Способ 2. iptables-persistent (Debian/Ubuntu)
Ставим пакет iptables-persistent:
apt-get install iptables-persistent
Для сохранения правил вводим команду:
netfilter-persistent save
Способ 3. service iptables (CentOS)
Работает в старых версиях Linux и CentOS. Необходима установка пакета:
yum install iptables-services
apt-get install iptables-services
* первая команда для CentOS, вторая — для Ubuntu.
Сохраняем правила командой:
service iptables save
* правила будут сохранены в файл /etc/sysconfig/iptables.
Чтобы правила восстанавливались автоматически при старте компьютера, разрешаем автозапуск сервиса.
а) в более новых версиях Linux:
systemctl enable iptables
б) в версиях постарше:
chkconfig iptables on
update-rc.d iptables defaults
* первая команда для CentOS, вторая для Ubuntu.
Ubuntu и CentOS
В современных операционных системах Ubuntu и CentOS по умолчанию нет iptables. Необходимо его установить или пользоваться более новыми утилитами.
В CentOS
В качестве штатной программы управления брандмауэром используется firewall-cmd. Подробнее читайте инструкцию Как настроить firewalld в CentOS.
Если необходимо пользоваться iptables, устанавливаем пакет с утилитой:
yum install iptables-services
Отключаем firewalld:
systemctl stop firewalld
systemctl disable firewalld
Разрешаем и запускаем iptables:
systemctl enable iptables
systemctl start iptables
В Ubuntu
Для управления брандмауэром теперь используется ufw.
Для работы с iptables, устанавливаем следующий пакет:
apt-get install iptables-persistent
Отключаем ufw:
ufw disable
Только полноправные пользователи могут оставлять комментарии. Аутентифицируйтесь пожалуйста, используя сервисы.