Примеры использования Iptables

Linux
В Linux встроен брандмауэр называемый Netfilter. По данным официального сайта проекта:

netfilter это набор системных сообщений внутри ядра Linux, которые позволяют модулям ядра зарегистрировать функции обратного вызова с сетевого стека. Зарегистрированная функция обратного вызова обрабатывает каждый пакет проходящий через сетевой стек.

Брандмауэр в Linux управляется программой iptables, которая имеет функции фильтрации IPv4, ip6tables фильтрует IPv6. Данное руководство рассказывает как научится пользоваться Netfilter (iptables) в CentOS / RHEL / Fedora / Redhat Enterprise Linux. В этой статье можно найти основные примеры настройки iptables в Linux для защиты от вторжений.

Примеры использования Iptables

  • Большинство из действий, перечисленных в этой статье пишутся с предположением, что они будут выполнены от root пользователя из bash или любой другой современной оболочке. Не вводите команды на удаленной системе, так как можете отключить себе доступ.
  • Для демонстрационных целей я использовал ubuntu 10.04, но команды должны работать с любым современным дистрибутивом.

Отображение состояния вашего брандмауэра
Введите следующую команду от root:
# iptables -L -n -v

Примерный ответ:
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination

Такой ответ означает, что брандмауэр не активен.
А, например, такой покажет, что брандмауэр в Linux активен:

Chain INPUT (policy ACCEPT 1810K packets, 126M bytes)
 pkts bytes target     prot opt in     out     source               destination
7418K 1070M ACCEPT     udp  --  *      *       0.0.0.0/0            0.0.0.0/0           udp dpt:1194
  881 52520 ACCEPT     tcp  --  eth0   *       0.0.0.0/0            0.0.0.0/0           tcp dpt:2222 flags:0x17/0x02 state NEW

Chain FORWARD (policy ACCEPT 5628K packets, 482M bytes)
 pkts bytes target     prot opt in     out     source               destination
    0     0 ACCEPT     tcp  --  eth0   tun0    0.0.0.0/0            0.0.0.0/0           tcp dpt:1111 state NEW,RELATED,ESTABLISHED
 599K  539M ACCEPT     udp  --  eth0   *       0.0.0.0/0            10.1.1.6            udp dpt:1112 state NEW,RELATED,ESTABLISHED

Chain OUTPUT (policy ACCEPT 4959K packets, 880M bytes)
 pkts bytes target     prot opt in     out     source               destination

Ключи в примере означают:
  • L: Вывести список правил.
  • v: Отображение подробной информации. Этот ключ будет выводить имя интерфейса, параметры правил и маски TOS. Счетчики пакетов и байтов, также будут показаны в списке, с 'K' суффиксом, 'М' или 'G' в зависимости от необходимого множителя.
  • n: Не резолвить IP адреса, показывать в цифровом виде. Ускоряет вывод.

Для просмотра правил с номером строки добавьте ключ --line-numbers, например:
# iptables -n -L -v --line-numbers

Для просмотра INPUT или OUTPUT правил, наберите:
# iptables -L INPUT -n -v
# iptables -L OUTPUT -n -v --line-numbers


Остановка, перезапуск, запуск брандмауэра
Если у Вас CentOS / RHEL / Fedora Linux, вводите:
# service iptables stop
# service iptables start
# service iptables restart

Чтобы отчистить правила 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

Ключи в примере означают:
  • F: Удаление всех правил (flushing).
  • X: Удаление цепочки
  • t <таблица>: Выбрать таблицу и удалить правила.
  • P: Установить политику по умолчанию (например DROP, REJECT или ACCEPT).

Удаление правил брандмауэра
Для отображения номера строки наряду с другой информацией по существующим правилам, введите:
# iptables -L INPUT -n --line-numbers
# iptables -L OUTPUT -n --line-numbers
# iptables -L OUTPUT -n --line-numbers | less
# iptables -L OUTPUT -n --line-numbers | grep 8.8.8.8

Вы получите список IP. Посмотрите на число слева, а вводите число, чтобы удалить его. Например, удаление линии номер 4, введите:
# iptables -D INPUT 4

Или найти источник IP 202.54.1.1 и удалить из правила:
# iptables -D INPUT -s 202.54.1.1 -j DROP

Ключ в примере означает:
  • D: удалить одно или несколько правил из указанной цепочки

Добавление правил брандмауэра
Чтобы вставить одно или несколько правил в указанной цепочке, как правило используется следующий синтаксис. Сначала узнать номер строки:
# iptables -L INPUT -n --line-numbers

Вывод например:
Chain INPUT (policy DROP)
num  target     prot opt source               destination
1    DROP       all  --  202.54.1.1           0.0.0.0/0
2    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           state NEW,ESTABLISHED

Чтобы вставить правило между 1 и 2, введите:
# iptables -I INPUT 2 -s 8.8.8.8 -j DROP

Для просмотра обновленных правил, введите:
# iptables -L INPUT -n --line-numbers

Вывод например:
Chain INPUT (policy DROP)
num  target     prot opt source               destination
1    DROP       all  --  202.54.1.1           0.0.0.0/0
2    DROP       all  --  8.8.8.8              0.0.0.0/0
3    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           state NEW,ESTABLISHED


Сохранение правил брандмауэра
Чтобы сохранить правила брандмауэра в CentOS / RHEL / Fedora Linux, введите:
# service iptables save

В других дистрибутивах
iptables-save > /root/my.active.firewall.rules

или
iptables-save


Восстановление правил брандмауэра

Для восстановление правил брандмауэра из файла /root/my.active.firewall.rules, введите:
# iptables-restore < /root/my.active.firewall.rules

Для восстановление правил брандмауэра в CentOS / RHEL / Fedora Linux, введите:
# service iptables restart


Установка политик брандмауэра по умолчанию

Блокировать весь трафик:
# iptables -P INPUT DROP
# iptables -P OUTPUT DROP
# iptables -P FORWARD DROP
# iptables -L -v -n

Блокировать только входящий трафик:
# iptables -P INPUT DROP
# iptables -P FORWARD DROP
# iptables -P OUTPUT ACCEPT


Блокировка сетевых адресов локальной сети на внешнем интерфейсе
IP-спуфинг — атака заключающаяся в использовании в IP-пакетах, отправляемых жертве, в качестве обратного адреса 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

Диапазон адресов IPv4 для частных сетей (убедитесь, что они заблокированы на внешнем интерфейсе)
  • 10.0.0.0/8 -j (A)
  • 172.16.0.0/12 (B)
  • 192.168.0.0/16 ©
  • 224.0.0.0/4 (MULTICAST D)
  • 240.0.0.0/5 (E)
  • 127.0.0.0/8 (LOOPBACK)

Блокировка IP-адресов
Чтобы заблокировать IP адрес 1.2.3.4, введите:
# iptables -A INPUT -s 1.2.3.4 -j DROP


Блокировка входящие запросов на порт
Чтобы заблокировать все запросы на порт 80, введите:
# iptables -A INPUT -p tcp --dport 80 -j DROP
# iptables -A INPUT -i eth1 -p tcp --dport 80 -j DROP

Чтобы заблокировать порт 80 только для IP-адреса 1.2.3.4, введите:
# iptables -A INPUT -p tcp -s 1.2.3.4 --dport 80 -j DROP
# iptables -A INPUT -i eth1 -p tcp -s 192.168.1.0/24 --dport 80 -j DROP


Блокировка исходящего IP-адреса
Чтобы заблокировать исходящий трафик определенного хоста или домена, такого как sysadminblog.ru, введите:
host -t a sysadminblog.ru

Ответ будет:
sysadminblog.ru has address 95.211.41.31

Запишите свой ​​IP-адрес и введите следующую команду, чтобы блокировать весь исходящий трафик с 95.211.41.31:
# iptables -A OUTPUT -d 95.211.41.31 -j DROP

Можно использовать маски:
# iptables -A OUTPUT -d 192.168.1.0/24 -j DROP
# iptables -A OUTPUT -o eth1 -d 192.168.1.0/24 -j DROP

Вы также можете использовать доменное имя, введите:
# iptables -A OUTPUT -p tcp -d www.sysadminblog.ru -j DROP
# iptables -A OUTPUT -p tcp -d sysadminblog.ru -j DROP

Хотя в документации пишут, что использование доменного имени вместо IP не рекомендуется.

Логирование и блокирование пакетов
Введите следующую команду, чтобы логировать и блокировать IP-спуфинг на открытый интерфейс с именем eth1:
# iptables -A INPUT -i eth1 -s 10.0.0.0/8 -j LOG --log-prefix "IP_SPOOF A: "
# iptables -A INPUT -i eth1 -s 10.0.0.0/8 -j DROP

По умолчанию все логируется в файл /var/log/messages.

Комментарий от akkerman:
Так лучше не делать, в особенности для явно левого трафика. LOG можно вставлять только строго с -m limit, иначе любая DoS-атака будет во много раз эффективнее: фактически косвенным образом злоумышленник получает прямой путь интенсивного воздействия непосредственно на файловую систему сервера.
Как делать правильнее, написано ниже

Логирование и блокирование пакетов с ограниченным количеством записей журнала
Параметр -m может ограничить количество записей в журнале созданных в единицу времени. Это используется для предотвращения флуда в файле журнала. Чтобы записывать не более 7 записей в 5 минут, введите:
# iptables -A INPUT -i eth1 -s 10.0.0.0/8 -m limit --limit 5/m --limit-burst 7 -j LOG --log-prefix "IP_SPOOF A: "
# iptables -A INPUT -i eth1 -s 10.0.0.0/8 -j DROP


Блокирование или разрешение трафика от Mac-адреса
Используйте следующий синтаксис:
# iptables -A INPUT -m mac --mac-source 00:19:99:3C:AB:23 -j DROP
## *only accept traffic for TCP port # 8080 from mac 00:19:99:3C:AB:22 * ##
# iptables -A INPUT -p tcp --destination-port 22 -m mac --mac-source 00:19:99:3C:AB:22 -j ACCEPT


Запретить или разрешить ICMP запросы для ping
Введите следующую команду, чтобы заблокировать 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

Ping ответ также может быть ограничен определенными сетями или хостами:
# iptables -A INPUT -s 192.168.1.0/24 -p icmp --icmp-type echo-request -j ACCEPT

Следующий пример принимает только ограниченный тип ICMP запросов:
### ** assumed that default INPUT policy set to DROP ** #############
iptables -A INPUT -p icmp --icmp-type echo-reply -j ACCEPT
iptables -A INPUT -p icmp --icmp-type destination-unreachable -j ACCEPT
iptables -A INPUT -p icmp --icmp-type time-exceeded -j ACCEPT
## ** all our server to respond to pings ** ##
iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT


Открытие диапазона IP-адресов
Используйте следующий синтаксис, чтобы открыть диапазон IP-адресов:
## only accept connection to tcp port 80 (Apache) if ip is between 192.168.1.100 and 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 example ##
iptables -t nat -A POSTROUTING -j SNAT --to-source 192.168.1.20-192.168.1.25


Закрытие или открытие общих портов
Ниже приведен синтаксис для открытия и закрытия портов общих портов TCP и UDP:
Replace ACCEPT with DROP to block port:
## open port ssh tcp port 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
 
## open cups (printing service) udp/tcp port 631 for LAN users ##
iptables -A INPUT -s 192.168.1.0/24 -p udp -m udp --dport 631 -j ACCEPT
iptables -A INPUT -s 192.168.1.0/24 -p tcp -m tcp --dport 631 -j ACCEPT
 
## allow time sync via NTP for lan users (open udp port 123) ##
iptables -A INPUT -s 192.168.1.0/24 -m state --state NEW -p udp --dport 123 -j ACCEPT
 
## open tcp port 25 (smtp) for all ##
iptables -A INPUT -m state --state NEW -p tcp --dport 25 -j ACCEPT
 
# open dns server ports for all ##
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
 
## open http/https (Apache) server port to all ##
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
 
## open tcp port 110 (pop3) for all ##
iptables -A INPUT -m state --state NEW -p tcp --dport 110 -j ACCEPT
 
## open tcp port 143 (imap) for all ##
iptables -A INPUT -m state --state NEW -p tcp --dport 143 -j ACCEPT
 
## open access to Samba file server for lan users only ##
iptables -A INPUT -s 192.168.1.0/24 -m state --state NEW -p tcp --dport 137 -j ACCEPT
iptables -A INPUT -s 192.168.1.0/24 -m state --state NEW -p tcp --dport 138 -j ACCEPT
iptables -A INPUT -s 192.168.1.0/24 -m state --state NEW -p tcp --dport 139 -j ACCEPT
iptables -A INPUT -s 192.168.1.0/24 -m state --state NEW -p tcp --dport 445 -j ACCEPT
 
## open access to proxy server for lan users only ##
iptables -A INPUT -s 192.168.1.0/24 -m state --state NEW -p tcp --dport 3128 -j ACCEPT
 
## open access to mysql server for lan users only ##
iptables -I INPUT -p tcp --dport 3306 -j ACCEPT


Ограничить число одновременных подключений к серверу для каждого клиента по IP
Вы можете использовать модуль connlimit, чтобы поставить такие ограничения. Для ограничения не больше 3 SSH соединений на хост, введите:
# iptables -A INPUT -p tcp --syn --dport 22 -m connlimit --connlimit-above 3 -j REJECT

Установить HTTP запросов до 20:
# iptables -p tcp --syn --dport 80 -m connlimit --connlimit-above 20 --connlimit-mask 24 -j DROP

Параметры в примере,
  • --connlimit-above 3: Соответствует ли количество существующих соединений выше 3.
  • --connlimit-mask 24: Группировать хосты по префиксу. Для IPv4, префиксы от 0 до 32.

5 комментариев

avatar
кстати, для блокировки перебора паролей для ssh и других сервисов, если замечательный продукт fail2ban
avatar
avatar
было дело, недавно ковырял на одном серваке iptables через vuurmuur через ssh — прикольная штука — можно настраивать все в одном — правила iptables/shaper и snort — напоминает CISCO ASA. Можно было бы набросать статью, но уже нахабрено и нагуглено много.
avatar
>iptables -A INPUT -i eth1 -s 10.0.0.0/8 -j LOG --log-prefix «IP_SPOOF A: „
Так лучше не делать, в особенности для явно левого трафика. LOG можно вставлять только строго с -m limit, иначе любая DoS-атака будет во много раз эффективнее: фактически косвенным образом злоумышленник получает прямой путь интенсивного воздействия непосредственно на файловую систему сервера.
>iptables -A INPUT -i eth1 -s 10.0.0.0/8 -m limit --limit 5/m --limit-burst 7 -j LOG --log-prefix “IP_SPOOF A: „
Вот, так и надо!
avatar
добавил комментарий в статью
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.