Утилита командной строки iptables используется для настройки брандмауэра netfilter, встроенного в систему на базе ядра Linux.
Данная инструкция подходит как для чайников, которые хотят разбираться в аспектах защиты сети, так и опытных специалистов в качестве шпаргалки.
Общий синтаксис использования iptables:
iptables -t <таблица> <команда> <цепочка> [номер] <условие> <действие>
<таблица>
Правила netfilter распределены по 4-м таблицам, каждая из которых имеет свое назначение (подробнее ниже). Она указывается ключом -t, но если данный параметр не указан, действие будет выполняться для таблицы по умолчанию — filter.
<команда>
Команды указывают, какое именно действие мы совершаем над netfilter, например, создаем или удаляем правило.
<цепочка>
В каждой таблице есть цепочки, для каждой из которых создаются сами правила. Например, для вышеупомянутой таблицы filter есть три предопределенные цепочки — INPUT (входящие пакеты), OUTPUT (исходящие) и FORWARD (транзитные).
[номер]
Некоторые команды требуют указания номера правила, например, на удаление или редактирование.
<условие>
Условие описывает критерии отработки того или иного правила.
<действие>
Ну и, собственно, что делаем с пакетом, если он подходит под критерии условия.
* справедливости ради, стоит отметить, что ключ с действием не обязан идти в конце. Просто данный формат чаще всего встречается в инструкциях и упрощает чтение правил.
Напоминаю, все правила в netfilter распределены по таблицам. Чтобы работать с конкретной таблицей, необходимо использовать ключ -t.
Нижеперечисленные ключи определяют действия, которые выполняет утилита iptables.
Данные ключи определяют условия правила.
Перечисленные ключи также поддерживают конструкцию с использованием знака !. Он инвертирует условие, например,iptables -A INPUT -s ! 192.168.0.50 -j DROPзапретит соединение всем хостам, кроме 192.168.0.50.
Действия, которые будут выполняться над пакетом, подходящим под критерии условия. Для каждой таблицы есть свой набор допустимых действий. Указываются с использованием ключа -j.
Просмотр правил с их номерами:
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 -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
Рассмотрим пример проброса одного порта и диапазона портов.
Существует два способа настройки.
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
* где 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 OUTPUT ACCEPT
По умолчанию, все правила перестают работать после перезапуска сети или компьютера. Для сохранения правил после перезагрузки есть несколько способов настройки.
Сохраняем правила в файл:
iptables-save > /etc/iptables.rules
Открываем настройки сети:
vi /etc/network/interfaces
и добавляем строку:
pre-up iptables-restore < /etc/iptables.rules
Ставим пакет iptables-persistent:
apt-get install iptables-persistent
Для сохранения правил вводим команду:
netfilter-persistent save
Работает в старых версиях Linux:
service iptables save
Или необходима установка пакета:
yum install iptables-services
apt-get install iptables-services
* первая команда для CentOS, вторая — для Ubuntu.
В современных операционных системах Ubuntu и CentOS по умолчанию нет iptables. Необходимо его установить или пользоваться более новыми утилитами.
В качестве штатной программы управления брандмауэром используется firewall-cmd. Подробнее читайте инструкцию Как настроить firewalld в CentOS.
Если необходимо пользоваться iptables, устанавливаем пакет с утилитой:
Отключаем firewalld:
systemctl stop firewalld
systemctl disable firewalld
Разрешаем и запускаем iptables:
systemctl enable iptables
systemctl start iptables
Для управления брандмауэром теперь используется ufw.
Для работы с iptables, устанавливаем следующий пакет:
Отключаем ufw:
ufw disable
Продолжая использовать данный сайт вы принимаете политику конфиденциальности и cookies