Linux IPTables.

Что такое 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.


ИСТОЧНИК.

Linux IPTables.