Iptables

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

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

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

Отображение состояния вашего брандмауэра
Введите следующую команду от 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.
Так лучше не делать, в особенности для явно левого трафика. 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.

1 комментарий

avatar
общий, базовый синтаксис вызова iptables для установки правил:
iptables -A очередь -s источник -j действие


Удалить все правила с определенной очереди можно с помощью ключа -F:
iptables -F очередь


Самая простая задача файрвола – блокировка всего трафика в сторону нашего сервера с определенного IP. Для этого необходимо выполнить такую команду:
iptables -A INPUT -s 1.2.3.4 -j DROP


При установке такого фильтра все IP-пакеты с адреса 1.2.3.4 будут уничтожаться на входе. В том случае, если отправителю нужно указать, что для него узел недоступен, нужно использовать несколько видоизмененное правило:
iptables -A INPUT -s 1.2.3.4 -j REJECT


В случае использования REJECT система на каждый приходящий пакет будет формировать специальный ответ, информирующий отправителя о невозможности доставки. Используйте REJECT только в необходимых случаях – при формировании этих ответов используются ресурсы сервера, поэтому в большинстве случаев достаточно использовать DROP.

В правилах можно использовать также фильтрацию по протоколам. Например, можно заблокировать только UDP с определенного отправителя:
iptables -A INPUT -p UDP -s 1.2.3.4 -j DROP


В следующем примере рассмотрим, как можно указать номера портов. Воспользуемся ключем –dport (порт назначения, destination port) для того, чтобы запретить для хоста 1.2.3.4 подключение к нашему серверу по протоколу ssh на стандартный порт 22:
iptables -A INPUT -p TCP -s 1.2.3.4 --dport 22 -j DROP


Есть возможность протоколировать работу определенных правил. Давайте сделаем так, чтобы в лог-файле (обычно – в /var/log/messages) были записи о работе фильтра. Первое правило протоколирует поступившие пакеты, второе – уничтожает их:
iptables -A INPUT -p TCP -s 1.2.3.4 --dport 22 -j LOG --log-prefix "SSH Filter:" iptables -A INPUT -p TCP -s 1.2.3.4 --dport 22 -j DROP


В iptables можно указывать не только единичный адрес – возможно указать целую сеть. Для примера – заблокируем подключение к нашему вэбсерверу (порт 80) с диапазона адресов 10.1.2.* (в CIDR-нотации 10.1.2.0/24):
iptables -A INPUT -p TCP -s 10.0.0.0/24 --dport 80 -j DROP


Следующий пример покажет, как можно использовать iptables для проверки содержимого IP-пакетов. Например, можно журналировать или уничтожать пакеты, в которых есть определенная последовательность символов, в данном примере – ‘hack.php’:
iptables -I INPUT -p TCP -m string --string "hack.php" -j LOG --log-prefix "HACK:"


Рассмотрим еще одну практическую задачу – ограничение количества подключений в сторону нашего сервера за единицу времени. Это может быть полезно для борьбы с флудом или простыми атаками. Следующим правилом мы установим лимит в 5 одновременных подключений с одного IP к нашему серверу по протоколу ssh:
iptables -A INPUT -p TCP --syn --dport 22 -m connlimit --connlimit-above 5 -j REJECT


Можно использовать другую конструкцию – следующее правило будет ограничивать количество новых соединений в сторону вэбсервера в 25 в минуту, причем этот лимит включится в том случае, если за предыдущую минуту было отмечено 100 соединений:
iptables -A INPUT -p TCP --dport 80 -m limit --limit 25/minute --limit-burst 100 -j ACCEPT


Можно лимитировать соединения не по единичным адресам или в целом по системе, но и с использованием маски. В примере ниже мы установим блокировку для целой сети /24 в том случае, если ее адресов поступит более 20 соединений:
iptables -A INPUT -p TCP --dport 80 -m iplimit --iplimit-above 20 --iplimit-mask 24 -j REJECT


В заключение рассмотрим, как сохранять запрограммированные правила iptables, чтобы при перезагрузке операционной системы они были снова установлены. В Centos достаточно выполнить команду
service iptables save


Для Debian рекомендуется установить вспомогательный пакет iptables-persistent, его следует инсталлировать с помощью стандартного менеджера пакетов:
aptitude install iptables-persistent


После установки iptables-persistent система будет автоматически сохранять актуальные правила при остановке операционной системы и восстанавливать их при запуске.

Оставить комментарий