🐹 CentOS 7: Некоторые примеры использования iptables для системных администраторов.

Содержание:

1. Введение.
2. Установка утилит межсетевого экрана iptables-services.
3. Показать статус.
4. Отобразить список правил с номерами строк.
5. Отобразить INPUT или OUTPUT цепочки правил.
6. Остановить, запустить, перезапустить межсетевой экран.
7. Удалить правила межсетевого экрана.
8. Добавить правило в межсетевой экран.
9. Сохраняем правила межсетевого экрана.
10. Восстанавливаем правила межсетевого экрана.
11. Устанавливаем политики по умолчанию.
12. Блокировать только входящие соединения.
13. Сбрасывать адреса изолированных сетей в публичной сети.
14. Заблокировать входящие запросы порта.
15. Заблокировать запросы на исходящий IP адрес.
16. Заблокировать соединение.
17. Разрешить или запретить ICMP Ping запросы.
18. Открыть диапазон портов.
19. Открыть диапазон адресов.
20. Закрыть или открыть стандартные порты.
21. Ограничить количество параллельных соединений к серверу для одного адреса.
22. Помощь по iptables.
23. Проверка правила iptables.
24. Оригиналы источников информации.


1. Введение.

Межсетевой экран в системе CentOS 7 контролируется программой iptables (для ipv4) и ip6tables (для ipv6).

С помощью утилиты iptables мы можем:

  • ограничить все входящие соединения на свой компьютер или сервер;
  • создать белый список IP-адресов, с которых можно подключиться или наоборот заблокировать конкретный IP-адрес;
  • а также открывать и закрывать порты и многое другое.

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

2. Установка утилит межсетевого экрана iptables-services.

Отключение встроенного по умолчанию межсетевого экрана firewalld:

# yum -y remove firewalld

Установка iptables-services взамен firewalld:

# yum -y install iptables iptables-services

Активация iptables-services на сервере:

# systemctl start iptables

# systemctl enable iptables

И проверка работы:

# systemctl status iptables

Ответ:

Log-файл хранится здесь: /var/log/messages.

Файл настроек хранится здесь: /etc/sysconfig/iptables.

Чтобы сохранить изменения, выполненные с помощью команд, необходимо использовать:

# iptables-save > /etc/sysconfig/iptables

Если вы редактировали конфигурационный файл, iptables нужно перезапустить:

# systemctl restart iptables

3. Показать статус.

Для начала деактивируем межсетевой экран любым способом и посмотрим как будет выглядеть система с отключенным межсетевым экраном и с включённым.

Вводим команду и смотрим на отключенный межсетевой экран:

# systemctl stop iptables

# iptables -L -n -v

Ответ:

Вводим команду и смотрим на включенный межсетевой экран:

# systemctl start iptables

# iptables -L -n -v

Ответ:

где:

  • -L — Показать список правил.
  • -v — Отображать дополнительную информацию. Эта опция показывает имя интерфейса, опции, TOS маски. Также отображает суффиксы ‘K‘, ‘M‘ или ‘G‘.
  • -n — Отображать IP-адрес и порт числами. Если не использовать DNS сервера для определения имен, то это ускорит отображение.

4. Отобразить список правил с номерами строк.

Теперь выведем тоже самое, но с ключом демонстрации номеров строк:

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

Ответ:

Вы можете использовать номера строк для того, чтобы добавлять новые правила.

5. Отобразить INPUT или OUTPUT цепочки правил.

Чтобы посмотреть что входит в ваш сервер:

# iptables -L INPUT -n -v

Ответ:

и выходит из вашего сервера:

# iptables -L OUTPUT -n -v --line-numbers

Ответ:

6. Остановить, запустить, перезапустить межсетевой экран.

Можно также использовать команды 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 — Удалить (flush) все правила.
  • -X — Удалить цепочку.
  • -ttable_name: выбрать таблицу (nat или mangle) и удалить все правила.
  • -P — Выбрать действия по умолчанию, такие, как DROP, REJECT, или ACCEPT.

7. Удалить правила межсетевого экрана.

Чтобы отобразить номер строки с существующими правилами:

# 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 202.54.1.1

Получим список IP-адресов. Просто посмотрим на номер слева и удалим соответствующую строку.

К примеру для номера 3:

# iptables -D INPUT 3

Или найдем IP-адрес источника 202.54.1.1 и удалим из правила:

# iptables -D INPUT -s 202.54.1.1 -j DROP

где:

  • -D — удалить одно или несколько правил из цепочки.

8. Добавить правило в межсетевой экран.

Чтобы добавить одно или несколько правил в цепочку, для начала отобразим список с использованием номеров строк:

# iptables -L INPUT -n --line-numbers

Ответ:

Чтобы вставить правило между 1 и 2 строкой:

# iptables -I INPUT 2 -s 202.54.1.2 -j DROP

Проверим, обновилось ли правило:

# iptables -L INPUT -n --line-numbers

Ответ:

9. Сохраняем правила межсетевого экрана.

Сохранить их можно через утилиту iptables-save:

# iptables-save > /etc/iptables.rules

Они сохранятся в отдельный файл iptables.rules, который потом можно будет перенести на другой сервер или восстановить на этом же.

10. Восстанавливаем правила межсетевого экрана.

Восстановить их так же можно через утилиту iptables-restore:

# iptables-restore < /etc/iptables.rules

Очень удобно восстанавливать всё из одного предварительно заготовленного файла iptables.rules.

11. Устанавливаем политики по умолчанию.

Внимание! Если вы сделаете это на удалённой машине или виртуальной машине, то вы потеряет над ней контроль и связь оборвётся! Пропустите этот шаг, если вы работаете удалённо! Вы не вернёте контроль над сервером, пока не внесете изменения в межсетевой экран через физическую консоль сервера.

Чтобы сбрасывать весь трафик:

# iptables -P INPUT DROP

# iptables -P OUTPUT DROP

# iptables -P FORWARD DROP

# iptables -L -v -n

Ответ:

После вышеперечисленных команд ни один пакет не покинет данный хост.

# ping -с 4 google.com

Ответ:

или

# ping -с 4 192.168.0.12

Ответ:

12. Блокировать только входящие соединения.

Чтобы сбрасывать все не инициированные вами входящие пакеты, но разрешить исходящий трафик:

# iptables -P INPUT DROP

# iptables -P FORWARD DROP

# iptables -P OUTPUT ACCEPT

# iptables -A INPUT -m state --state NEW,ESTABLISHED -j ACCEPT

# iptables -L -v -n

Ответ:

Пакеты исходящие и те, которые были запомнены в рамках установленных сессий — разрешены.

# ping -с 4 google.com

Ответ:

или

# ping -с 4 192.168.0.12

Ответ:

13. Сбрасывать адреса изолированных сетей в публичной сети.

# 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 -j (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)

14. Заблокировать входящие запросы порта.

Чтобы заблокировать все входящие запросы порта 80:

# iptables -A INPUT -p tcp --dport 80 -j DROP

# iptables -A INPUT -i eth1 -p tcp --dport 80 -j DROP

Чтобы заблокировать запрос порта 80 с адреса 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

15. Заблокировать запросы на исходящий IP адрес.

Чтобы заблокировать определенный домен, узнаем его адрес:

# yum -y install bind-utils

# nclookup facebook.com

Ответ:

Найдем CIDR для 157.240.205.35:

# yum -y install whois

# whois 157.240.205.35 | grep CIDR

Ответ:

Заблокируем доступ на 157.240.205.35/16:

# iptables -A OUTPUT -p tcp -d 157.240.205.35/16 -j DROP

Также можно использовать домен для блокировки:

# iptables -A OUTPUT -p tcp -d www.fаcebook.com -j DROP

# iptables -A OUTPUT -p tcp -d fаcebook.com -j DROP

Проверим:

# ping -c 4 fаcebook.com

Ответ:

Как видно, ресурс заблокирован!

16. Заблокировать соединение.

16.1. Как заблокировать IP-адрес?

Посмотрим какие сетевые интерфейсы у нас имеются на сервере:

# ifconfig

Ответ:

Запрограммируем межсетевой экран не принимать от 192.168.0.39 соединения на сетевом интерфейсе eth0.

Добавим правило:

# iptables -I INPUT -i eth0 -s 192.168.0.39 -j DROP

Чтобы сохранить изменения, выполненные с помощью команд, необходимо использовать:

# iptables-save > /etc/sysconfig/iptables

Если вы редактировали конфигурационный файл, iptables нужно перезапустить:

# systemctl restart iptables

После настройки межсетевого экрана, поскребёмся с хоста 192.168.0.39 на целевой сервер 192.168.0.15 и посмотрим, как сервер 192.168.0.15 отслеживал его попытки подключиться с удалённого хоста.

# ping -c 3 192.168.0.15

Ответ:

или

# ssh root@192.168.0.15

Ответ:

Как видно 192.168.0.15 категорически отказывается принимать какие-либо сигналы с 192.168.0.39.

16.2. Как заблокировать подсеть?

Используйте следующий синтаксис для блокирования 192.168.0.0/24:

Добавим правило:

# iptables -I INPUT -i eth0 -s 192.168.100.0/24 -j DROP

Чтобы сохранить изменения, выполненные с помощью команд, необходимо использовать:

# iptables-save > /etc/sysconfig/iptables

Если вы редактировали конфигурационный файл, iptables нужно перезапустить:

# systemctl restart iptables

Действие настроек аналогично примеру выше, но уже для всего диапазона IP-адресов.

17. Разрешить или запретить ICMP Ping запросы.

17.1. Чтобы запретить ping:

# iptables -A INPUT -p icmp --icmp-type echo-request -j DROP

# iptables -A INPUT -i eth1 -p icmp --icmp-type echo-request -j DROP

17.2. Разрешить для определенных сетей / хостов:

# iptables -A INPUT -s 192.168.1.0/24 -p icmp --icmp-type echo-request -j ACCEPT

17.3. Разрешить только часть ICMP запросов:

Примечание! Предполагается, что политики по умолчанию для входящих установлены в 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

Примечание! Разрешим отвечать на запрос.

# iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT

18. Открыть диапазон портов.

# iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 7000:7010 -j ACCEPT

19. Открыть диапазон адресов.

19.1. Разрешить подключение к порту 80, если адрес в диапазоне от 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

19.2. Пример для nat.

# iptables -t nat -A POSTROUTING -j SNAT --to-source 192.168.1.20-192.168.1.25

20. Закрыть или открыть стандартные порты.

Заменить ACCEPT на DROP, чтобы заблокировать порт.

20.1. 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

20.2. Cups (printing service) udp/tcp port 631 для локальной сети.

# 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

20.3. Time sync via NTP для локальной сети (udp port 123).

# iptables -A INPUT -s 192.168.1.0/24 -m state --state NEW -p udp --dport 123 -j ACCEPT

20.4. Tcp port 25 (smtp).

# iptables -A INPUT -m state --state NEW -p tcp --dport 25 -j ACCEPT

20.5. DNS server ports.

# 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

20.6. Http/https www server port.

# 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

20.7. Tcp port 110 (pop3).

# iptables -A INPUT -m state --state NEW -p tcp --dport 110 -j ACCEPT

20.8. Tcp port 143 (imap).

# iptables -A INPUT -m state --state NEW -p tcp --dport 143 -j ACCEPT

20.9. Samba file server для локальной сети.

# 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

20.10. Proxy server для локальной сети.

# iptables -A INPUT -s 192.168.1.0/24 -m state --state NEW -p tcp --dport 3128 -j ACCEPT

20.11. Mysql server для локальной сети.

# iptables -I INPUT -p tcp --dport 3306 -j ACCEPT

20.12. Основные настройки iptables для web-сервера.

Запретим все входящие соединения:

# iptables -P INPUT DROP

Разрешим все исходящие соединения:

# iptables -P OUTPUT ACCEPT

Разрешить входящие соединения с localhost:

# iptables -A INPUT -i lo -j ACCEPT

Разрешить входящие соединения, которые уже были установлены:

# iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

Блокировать все нулевые пакеты:

# iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP

Блокировать все пакеты XMAS:

# iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP

Защищаемся от syn-flood:

# iptables -A INPUT -p tcp ! --syn -m state --state NEW -j DROP

Откроем порт 22, чтобы была возможность подключаться к серверу по SSH

# iptables -A INPUT -p TCP --dport 22 -j ACCEPT

Открываем порт 80 для http:

# iptables -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT

Открываем порт 443 для https:

# iptables -A INPUT -p tcp -m tcp --dport 443 -j ACCEPT

20.13. Почта, порты для служб.

Открываем порты 25 и 465 для smtp-трафика:

# iptables -A INPUT -p tcp -m tcp --dport 25 -j ACCEPT
# iptables -A INPUT -p tcp -m tcp --dport 465 -j ACCEPT

Открываем порты 110 и 995 для pop-трафика:

# iptables -A INPUT -p tcp -m tcp --dport 110 -j ACCEPT
# iptables -A INPUT -p tcp -m tcp --dport 995 -j ACCEPT

Открываем порты 143 и 993 для imap-трафика:

# iptables -A INPUT -p tcp -m tcp --dport 143 -j ACCEPT
# iptables -A INPUT -p tcp -m tcp --dport 993 -j ACCEPT

21. Ограничить количество параллельных соединений к серверу для одного адреса.

Для ограничений используется 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 — указывает маску сети.

22. Помощь по iptables.

Для поиска помощи по iptables, воспользуемся man:

# man iptables

Чтобы посмотреть помощь по определенным командам и целям:

# iptables -j DROP -h

23. Проверка правила iptables.

Проверяем открытость / закрытость портов:

# netstat -tulpn

Ответ:

Проверяем открытость / закрытость определенного порта:

# netstat -tulpn | grep :80

Ответ:

Проверим, что iptables разрешает соединение с 80 портом:

# iptables -L INPUT -v -n | grep 80

Ответ:

Если всё закрыто, то никакого ответа не будет.

В противном случае откроем его для всех:

# iptables -A INPUT -m state --state NEW -p tcp --dport 80 -j ACCEPT

Чтобы сохранить изменения, выполненные с помощью команд, необходимо использовать:

# iptables-save > /etc/sysconfig/iptables

Если вы редактировали конфигурационный файл, iptables нужно перезапустить:

# systemctl restart iptables

Можно использовать nmap для проверки:

# yum -y install nmap

# nmap -p 80 192.168.0.15

Ответ:

24. Оригиналы источников информации.

    1. vasilisc.com «21 пример использования iptables для администраторов».
    2. te.legra.ph «21 пример использования iptables для администраторов».
    3. linuxinsider.ru «Основные настройки iptables, или как настроить фаервол в Linux».