Что такое IPTables в Linux?
IPTables это программный файрвол, который работает в дистрибутивах Linux. IPTables позволяет фильтровать как трафик по протоколу IPv4, так и по протоколу IPv6. В этой статье мы приведем примеры и рекомендации по настройке программного файрвола. За основу возьмем ОС CentOS 6.5, но команды и примеры схожи и для остальных современных сборок Linux.
Примеры правил, используемых в IPTables.
Для правильной работы с IPTables необходимо быть root пользователем и работать в одном из современных командных интерпретаторов, таком, например, как bash. Рекомендуем вам не работать с IPTables, используя удаленное подключение (telnet, ssh, rdp), т.к. вы можете отключить себе доступ и больше не попасть на настраиваемую машину.
Установка (хотя чаще всего IPTables уже присутствуют в дистрибутиве):
Для Red Hat-подобных систем:
# yum install iptables
Для Debian-подобных систем:
# apt-get install iptables
Теперь перейдем к популярным командам IPTables.
1. Выводим статус IPTables.
# iptables -L -n -v
Должны увидеть примерно следующее:
Данный вывод говорит о том, что файрвол не активен.
Следующая запись говорит о том, что в IPTables есть настройки (взято из конфига FreePBX).
Теперь перейдем к ключам.
- -L — выводит список правил IPTables;
- -v — выводит подробную информацию, такую как названия интерфейсов, названия правил, маски TOS, выводит количество пакетов, отработанных правилом;
- -n — выводит IP адреса и порты в числовом формате, т.е. не используются записи DNS.
Команда.
# iptables -n -L -v —line-numbers
выводит те же правила, но с порядковыми номерами. Номера правил можно использовать для удаления или добавления правил IPTables.
Для вывода входящих (INPUT) или исходящих (OUTPUT) правил можно использовать команды:
# iptables -L INPUT -n -v
# iptables -L OUTPUT -n -v
Еще один способ посмотреть IPTables, это ввести команду.
# iptables -S
С помощью флага -S можно просмотреть данные в формате, который отражает команды, необходимые для активации правил и политик.
2. Действия с сервисом IPTables.
Остановка сервиса:
# service iptables stop
Запуск сервиса:
# service iptables start
Перезапуск сервиса:
# service iptables restart
IPTables оперирует всеми поступающими пакетами на основе правил (rules), которые группируются в цепочки (chains). Правила и цепочки хранятся в таблица (tables).
Для работы с IPTables можно использовать следующие команды:
iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
iptables -t mangle -F
iptables -t mangle -X
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
Перечислим основные ключи:
- -t (—table) <таблица> — правило указывает таблицу, в которую будут вноситься изменения, без указания этого ключа используется таблица filter;
- -A (—append) <цепочка> — добавление новой записи в конец цепочки;
- -D (—delete) <цепочка> — удаление правила;
- -I (—insert) <цепочка> <номер> — вставляет правило над цепочкой с указанным номером;
- -R (—replace) <цепочка> <номер> — заменяет определенные критерии цепочки с номером <номер>;
- -L (—list) <цепочка> — листинг правил цепочки;
- -F (—flush) <цепочка> — удаление всех правил из цепочки;
- -P (—policy) <цепочка> — задать действие по умолчанию, действие будет выполняться на все пакеты, которые не подошли по каким-либо параметрам в другие правила.
Ключи классификации и выделения пакетов:
- -p (—protocol) — используется для указания конкретного протокола для обработки, список всех протоколов можно посмотреть в /etc/protocols/;
- -s(—src, —source) — адрес исходящих пакетов для фильтрации;
- -d (—dst, —destination) — адрес назначения пакетов для фильтрации;
- -i (—in-interface) — интерфейс с которого приходит пакет;
- -o (—out-interface) — интерфейс на который уходит пакет;
- —sport (—source-port) (может использоваться с ключами -p tcp и -p udp) — порт с которого был отправлен пакет;
- —dport (—destination-port) (может использоваться с ключами -p tcp и -p udp) — порт на который отправляется пакет.
3. Удаление правил IPTables.
Для начала необходимо выяснить под каким порядковым номером идет правило, для этого воспользуемся известными нам командами:
iptables -L INPUT -n —line-numbersiptables -L OUTPUT -n —line-numbersiptables -L OUTPUT -n —line-numbers | grep 8.8.8.8
Мы увидим следующее:
Предположим нам необходимо удалить из правила строку 3, которая соответствует подсети 192.168.2.0/25, для этого введем команду:
# iptables -D INPUT 3
Или если известен IP адрес источника, в нашем примере подсети, то можно использовать команду:
# iptables -D INPUT -s 192.168.2.0/25 -j ACCEPT
где ключ -D удаляет одно или несколько правил из цепочки.
4. Создание правила IPTables.
Для добавления одного или нескольких правил в цепочку с определенным порядковым номером правила, необходимо сделать следующее. Для начала, выведем список имеющихся правил:
# iptables -L INPUT -n —line-numbers
Вывод будет следующий:
Далее чтобы добавить новое правило между 2 и 3, уже существующими мы введем следующую команду:
# iptables -I INPUT 3 -s 192.168.3.0/25 -p udp -m udp —dport 5060 -j ACCEPT
Посмотрим, что получилось:
# iptables -L INPUT -n —line-numbers
5. Сохранение правил IPtables.
Для сохранения правил IPTables в CentOS / RHEL / Fedora Linux, необходимо ввести:
# service iptables save
Для других дистрибутивов Linux могут понадобится следующие команды для сохранения IPTables.
iptables-save > /root/my.active.firewall.rules
cat /root/my.active.firewall.rules
6. Восстановление настроек IPTables из ранее созданного файла.
Для восстановления настроек из файла /usr/backup/iptables.conf введите следующую команду:
# iptables-restore < /usr/backup/iptables.conf
Далее перезапускаем сервис IPTables.
service iptables restart
Теперь перейдем к конкретным настройка IPTables.
1) Для блокировки всего трафика, введите следующие команды:
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP
2) Для блокировки входящего трафика, введите:
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
iptables -A INPUT -m state —state NEW,ESTABLISHED -j ACCEPT
3) Блокировка пакетов с локальной сети на интерфейс с публичным IP адресом:
iptables -A INPUT -i eth1 -s 192.168.0.0/24 -j DROP
iptables -A INPUT -i eth1 -s 10.0.0.0/8 -j DROP
Напомним, что локальными сетями считаются следующие IP адреса:
- 10.0.0.0/8 (A)
- 172.16.0.0/12 (B)
- 192.168.0.0/16 (C)
- 224.0.0.0/4 (MULTICAST D)
- 240.0.0.0/5 (E)
- 127.0.0.0/8 (LOOPBACK)
4) Блокировка входящих пакетов с конкретного IP адреса (8.8.8.8):
iptables -A INPUT -s 8.8.8.8 -j DROP
5) Блокировка пакетов по определенному порту (80):
iptables -A INPUT -p tcp —dport 80 -j DROP
iptables -A INPUT -i eth1 -p tcp —dport 80 -j DROP
Блокировка IP адреса и порта:
iptables -A INPUT -p tcp -s 8.8.8.8 —dport 80 -j DROP
iptables -A INPUT -i eth1 -p tcp -s 192.168.0.0/24 —dport 80 -j DROP
6) Блокировка IP адреса для исходящих соединений. Т.е. будем блокировать адреса, куда запрещено будет подключаться.
iptables -A OUTPUT -d 192.168.1.245 -j DROP
Так же можно блокировать по подсетям:
iptables -A OUTPUT -d 192.168.1.0/24 -j DROP
iptables -A OUTPUT -i eth1 -d 192.168.1.0/24 -j DROP
Для примера, заблокируем сайт vk.com. VK.com принадлежит диапазон IP адресов 87.240.128.0 — 87.240.159.255, т.е. 87.240.128.0/19.
iptables -A OUTPUT -d 87.240.128.0/19 -j DROP
Так же можно заблокировать трафик по доменному имени, но так делать не рекомендуется.
iptables -A OUTPUT -d www.vk.com -j DROP
iptables -A OUTPUT -d vk.com -j DROP
7) Логирование входящих пакетов и блокировка трафика:
iptables -A INPUT -i eth1 -s 10.0.0.0/8 -j LOG —log-prefix «IP_INPUT Adr: «
iptables -A INPUT -i eth1 -s 10.0.0.0/8 -j DROP
Вся информация, по умолчанию хранится в каталоге /var/log/messages.
8) Фильтрация трафика по MAC адресам.
iptables -A INPUT -m mac —mac-source 00:0F:EA:00:77:58 -j DROP
Открытие порта 80 TCP для определенного MAC адреса:
iptables -A INPUT -p tcp —destination-port 80 -m mac —mac-source 00:0F:EA:00:77:58 -j ACCEPT
9) Работа с ICMP запросами:
iptables -A INPUT -p icmp —icmp-type echo-request -j DROP
iptables -A INPUT -i eth1 -p icmp —icmp-type echo-request -j DROP
Блокируем по определенными подсетям:
iptables -A INPUT -s 192.168.0.0/24 -p icmp —icmp-type echo-request -j DROP
9) Открытие определенного пула портов:
iptables -A INPUT -m state —state NEW -m udp -p udp —dport 10000:20000 -j ACCEPT
10) Открытие определенного пула IP адресов. В нашем примере открываем доступ на 80-й порт для IP адресов 192.168.1.100-192.168.1.200.
iptables -A INPUT -p tcp —destination-port 80 -m iprange —src-range 192.168.1.100-192.168.1.200 -j ACCEPT
Пример для NAT-а:
iptables -t nat -A POSTROUTING -j SNAT —to-source 192.168.1.100-192.168.1.200
11) Открытие определенного количества одновременных соединений с одного IP адреса.
В данном примере устанавливаем на ssh 3 одновременных сессии:
iptables -A INPUT -p tcp —syn —dport 22 -m connlimit —connlimit-above 3 -j REJECT
где:
—connlimit-above 3 — количество одинаковых подключений равно трем.
Устанавливаем количество HTTP запросов 20:
iptables -p tcp —syn —dport 80 -m connlimit —connlimit-above 20 —connlimit-mask 24 -j DROP
где:
—connlimit-mask 24 — маска подсети.
Проверка работоспособности IPTables.
Введите следующую команду и вы увидите все используемые порты на сервере:
# netstat -tulpn
Для проверки определенного порта введите следующую команду. В нашем примере смотрим порт 80.
netstat -tulpn | grep :80
Если он открыт, то вывод будет следующим:
tcp 0 0 :::80 :::* LISTEN 7343/httpd
Так же удобно пользоваться анализатором сети nmap.
Теперь приведем часто используемые правила.
— открываем ssh (порт 22):
iptables -A INPUT -m state —state NEW -m tcp -p tcp —dport 22 -j ACCEPT
iptables -A INPUT -s 192.168.1.0/24 -m state —state NEW -p tcp —dport 22 -j ACCEPT
— открываем порт для NTP (порт 123):
iptables -A INPUT -s 192.168.1.0/24 -m state —state NEW -p udp —dport 123 -j ACCEPT
— открываем порт для SNMP (порт 25):
iptables -A INPUT -m state —state NEW -p tcp —dport 25 -j ACCEPT
— открываем порт для DNS (порт 53):
iptables -A INPUT -m state —state NEW -p udp —dport 53 -j ACCEPT
iptables -A INPUT -m state —state NEW -p tcp —dport 53 -j ACCEPT
— открываем порт для WEB (порт 80(http), 443(https)):
iptables -A INPUT -m state —state NEW -p tcp —dport 80 -j ACCEPT
iptables -A INPUT -m state —state NEW -p tcp —dport 443 -j ACCEPT
— открываем порт для почты (порт 110(POP3), 143(IMAP)):
iptables -A INPUT -m state —state NEW -p tcp —dport 110 -j ACCEPT
iptables -A INPUT -m state —state NEW -p tcp —dport 143 -j ACCEPT
— открываем порт для MySQL (порт 3306):
iptables -I INPUT -p tcp —dport 3306 -j ACCEPT
— открываем порт для PostgreSQL (порт 5432):
iptables -I INPUT -p tcp —dport 5432 -j ACCEPT
Для того чтобы прочитать официальное описание IPTables, введите следующие команды:
man iptables
или
iptables -h
Для изучения определенных ключей IPTables, можно воспользоваться следующим синтаксисом.
iptables -j DROP -h
В нашей статье, мы рассмотрели базовые правила и примеры. Для более полной информации читайте man.
ИСТОЧНИК.