8(499)-709-97-83
Работаем с 8:00 до 19:00

Linux IPTables

  • 28 августа 2015

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

Должны увидеть примерно следующее

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

Данный вывод говорит о том, что файрвол не активен.

Следующая запись говорит о том, что в IPTables есть настройки (взято из конфига FreePBX).

Chain INPUT (policy ACCEPT 7374 packets, 7895K bytes)
pkts bytes target prot opt in out source destination
18560 1714K fail2ban-SSH tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:22
0 0 ACCEPT udp -- * * XXX.XXX.XXX.XXX/25 0.0.0.0/0 udp dpt:5060
0 0 ACCEPT udp -- * * XXX.XXX.XXX.XXX/25 0.0.0.0/0 udp dpt:5060
0 0 ACCEPT udp -- * * XXX.XXX.XXX.XXX/25 0.0.0.0/0 udp dpt:5060
0 0 ACCEPT udp -- * * XXX.XXX.XXX.XXX/25 0.0.0.0/0 udp dpt:5060
0 0 ACCEPT udp -- * * XXX.XXX.XXX.XXX/25 0.0.0.0/0 udp dpt:5060
96 42172 DROP udp -- * * 0.0.0.0/0 0.0.0.0/0 udp dpt:5060
0 0 ACCEPT tcp -- * * XXX.XXX.XXX.XXX/25 0.0.0.0/0 tcp dpt:80
20803 3429K ACCEPT tcp -- * * XXX.XXX.XXX.XXX/25 0.0.0.0/0 tcp dpt:80
0 0 ACCEPT tcp -- * * XXX.XXX.XXX.XXX/25 0.0.0.0/0 tcp dpt:80
693 72250 ACCEPT tcp -- * * XXX.XXX.XXX.XXX/25 0.0.0.0/0 tcp dpt:80
0 0 ACCEPT tcp -- * * XXX.XXX.XXX.XXX/25 0.0.0.0/0 tcp dpt:80
70 3544 DROP tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:80

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination

Chain OUTPUT (policy ACCEPT 6788 packets, 378K bytes)
pkts bytes target prot opt in out source destination

Chain fail2ban-SSH (1 references)
pkts bytes target prot opt in out source destination
11365 1217K RETURN all -- * * 0.0.0.0/0 0.0.0.0/0

Теперь перейдем к ключам

-L - выводит список правил IPTables

-v - выводит подробную информацию, такую как названия интерфейсов, названия правил, маски TOS, выводит количество пакетов, отработанных правилом

-n - выводит IP адреса и порты в числовом формате, т.е. не используются записи DNS

Команда

iptables -n -L -v --line-numbers

выводит те же правила, но с порядковыми номерами. Номера правил можно использовать для удаления или добавления правил IPTables.

Chain INPUT (policy ACCEPT 256 packets, 252K bytes)
num pkts bytes target prot opt in out source destination
1 18863 1739K fail2ban-SSH tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:22
2 0 0 ACCEPT udp -- * * XXX.XXX.XXX.XXX/25 0.0.0.0/0 udp dpt:5060
3 0 0 ACCEPT udp -- * * XXX.XXX.XXX.XXX/25 0.0.0.0/0 udp dpt:5060
4 0 0 ACCEPT udp -- * * XXX.XXX.XXX.XXX/25 0.0.0.0/0 udp dpt:5060
5 0 0 ACCEPT udp -- * * XXX.XXX.XXX.XXX/25 0.0.0.0/0 udp dpt:5060
6 0 0 ACCEPT udp -- * * XXX.XXX.XXX.XXX/25 0.0.0.0/0 udp dpt:5060
7 99 43495 DROP udp -- * * 0.0.0.0/0 0.0.0.0/0 udp dpt:5060
8 0 0 ACCEPT tcp -- * * XXX.XXX.XXX.XXX/25 0.0.0.0/0 tcp dpt:80
9 20803 3429K ACCEPT tcp -- * * XXX.XXX.XXX.XXX/25 0.0.0.0/0 tcp dpt:80
10 0 0 ACCEPT tcp -- * * XXX.XXX.XXX.XXX/25 0.0.0.0/0 tcp dpt:80
11 693 72250 ACCEPT tcp -- * * XXX.XXX.XXX.XXX/25 0.0.0.0/0 tcp dpt:80
12 0 0 ACCEPT tcp -- * * XXX.XXX.XXX.XXX/25 0.0.0.0/0 tcp dpt:80
13 70 3544 DROP tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:80

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination

Chain OUTPUT (policy ACCEPT 275 packets, 18243 bytes)
num pkts bytes target prot opt in out source destination

Chain fail2ban-SSH (1 references)
num pkts bytes target prot opt in out source destination
1 46 3176 REJECT all -- * * XXX.XXX.XXX.XXX 0.0.0.0/0 reject-with icmp-port-unreachable
2 11622 1238K RETURN all -- * * 0.0.0.0/0 0.0.0.0/0

Для вывода входящих (INPUT) или исходящих (OUTPUT) правил можно использовать команды

iptables -L INPUT -n -v
iptables -L OUTPUT -n -v

Еще один способ посмотреть IPTables, это ввести команду.

iptables -S

С помощью флага -S можно просмотреть данные в формате, который отражает команды, необходимые для активации правил и политик.

-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
-N fail2ban-SSH
-A INPUT -p tcp -m tcp --dport 22 -j fail2ban-SSH
-A INPUT -s XXX.XXX.XXX.XXX/25 -p udp -m udp --dport 5060 -j ACCEPT
-A INPUT -s XXX.XXX.XXX.XXX/25 -p udp -m udp --dport 5060 -j ACCEPT
-A INPUT -s XXX.XXX.XXX.XXX/25 -p udp -m udp --dport 5060 -j ACCEPT
-A INPUT -s XXX.XXX.XXX.XXX/25 -p udp -m udp --dport 5060 -j ACCEPT
-A INPUT -s XXX.XXX.XXX.XXX/25 -p udp -m udp --dport 5060 -j ACCEPT
-A INPUT -p udp -m udp --dport 5060 -j DROP
-A INPUT -s XXX.XXX.XXX.XXX/25 -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -s XXX.XXX.XXX.XXX/25 -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -s XXX.XXX.XXX.XXX/25 -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -s XXX.XXX.XXX.XXX/25 -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -s XXX.XXX.XXX.XXX/25 -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j DROP
-A fail2ban-SSH -j RETURN

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

Мы увидим следующее:

Chain INPUT (policy ACCEPT 256 packets, 252K bytes)
num pkts bytes target prot opt in out source destination
1 18863 1739K fail2ban-SSH tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:22
2 0 0 ACCEPT udp -- * * 192.168.1.0/25 0.0.0.0/0 udp dpt:5060
3 0 0 ACCEPT udp -- * * 192.168.2.0/25 0.0.0.0/0 udp dpt:5060
4 0 0 ACCEPT udp -- * * 8.8.8.8/25 0.0.0.0/0 udp dpt:5060
5 0 0 ACCEPT udp -- * * 147.133.11.76/25 0.0.0.0/0 udp dpt:5060
6 70 3544 DROP tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:80

Предположим нам необходимо удалить из правила строку 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

Вывод будет следующий

Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 fail2ban-SSH tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:22
2 ACCEPT udp -- 192.168.1.0/25 0.0.0.0/0 udp dpt:5060
3 ACCEPT udp -- 192.168.2.0/25 0.0.0.0/0 udp dpt:5060

Далее чтобы добавить новое правило между 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
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 fail2ban-SSH tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:22
2 ACCEPT udp -- 192.168.1.0/25 0.0.0.0/0 udp dpt:5060
3 ACCEPT udp -- 192.168.3.0/24 0.0.0.0/0 udp dpt:5060
4 ACCEPT udp -- 192.168.2.0/25 0.0.0.0/0 udp dpt:5060

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.

 
Powered by SEO CMS ver.: 23.1 TOP 2 (opencartadmin.com)
 
Метки: iptables, Linux