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