Наши партнеры

UnixForum





Библиотека сайта rus-linux.net

Серверы Linux. Часть V. Межсетевой экран iptables

Оригинал: Iptables firewall
Автор: Paul Cobbaut
Дата публикации: 24 мая 2015 г.
Перевод: A.Панин
Дата перевода: 13 июля 2015 г.

Глава 8. Межсетевой экран iptables

В данной главе описаны некоторые простые правила межсетевого экрана, а также методика их применения с помощью приложения iptables.

Приложение iptables предоставляет пользователю возможность осуществления настройки межсетевого экрана системы, который является частью ядра Linux.

8.1. Таблицы межсетевого экрана iptables

По умолчанию на уровне ядра ОС используются три таблицы для хранения наборов правил.

Таблица filter используется для хранения правил фильтрации сетевых пакетов.

root@debian6~# iptables -t filter -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Таблица nat используется для хранения правил преобразования сетевых адресов.

root@debian6~# iptables -t nat -L
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination         

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Таблица mangle может использоваться для специфической обработки сетевых пакетов.

Наборы правил межсетевого экрана в каждой таблице называются цепочками правил (chains). Мы будем обсуждать цепочки правил межсетевого экрана и таблицу nat позднее в рамках данной главы.

8.2. Активация и деактивация межсетевого экрана iptables

В следующем примере показана методика деактивации и последующей активации межсетевого экрана iptables в дистрибутиве Red Hat/Fedora/CentOS и совместимых дистрибутивах.

[root@centos6 ~]# service iptables stop
[root@centos6 ~]# service iptables start
iptables: Applying firewall rules                              [ ok ]
[root@centos6 ~]#

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

root@debian6~# aptitude purge iptables

8.3. Таблица filter

8.3.1. О фильтрации сетевых пакетов

Процесс фильтрации сетевых пакетов не намного сложнее процесса пересылки сетевых пакетов. В процессе пересылки сетевых пакетов для принятия решений используется лишь таблица маршрутизации, в то время, как в процессе фильтрации сетевых пакетов используется еще и список правил межсетевого экрана. Ядро ОС исследует сетевые пакеты и принимает решение о возможности передачи каждого из этих пакетов на основе упомянутых правил.

8.3.2. Таблица filter

Таблица filter межсетевого экрана iptables содержит три цепочки правил (или набора правил). Цепочка INPUT используется для обработки любого сетевого пакета, попадающего в систему. Цепочка OUTPUT используется для обработки любого сетевого пакета, покидающего систему. Цепочка FORWARD используется для обработки сетевых пакетов, которые пересылаются (передаются) через систему.

Таблица filter

В примере ниже показана методика вывода информации о таблице filter и всех ее правилах.

[root@RHEL5 ~]# iptables -t filter -nL
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         
[root@RHEL5 ~]#

Как вы можете видеть, во всех трех цепочках правил межсетевого экрана из таблицы filter используется политика пропуска всех сетевых пакетов (ACCEPT). Политика пропуска всех сетевых пакетов является используемой по умолчанию политикой.

8.3.3. Стандартные правила межсетевого экрана

Стандартной политикой используемых по умолчанию правил межсетевого экрана является пропуск всех сетевых пакетов (ACCEPT). Эксплуатация настроенного подобным образом межсетевого экрана не является безопасной практикой.

При использовании более безопасного варианта настройки межсетевой экран должен отбрасывать все сетевые пакеты (DROP). Отброшенный сетевой пакет не передается для последующей обработки с помощью какой-либо цепочки правил межсетевого экрана, при этом также не осуществляется вывод какого-либо сообщения об ошибке.

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

root@debianpaul~# iptables -P INPUT DROP
root@debianpaul~# iptables -P OUTPUT DROP
root@debianpaul~# iptables -P FORWARD DROP
root@debianpaul~# iptables -L
Chain INPUT (policy DROP)
target     prot opt source               destination

Chain FORWARD (policy DROP)
target     prot opt source               destination 

Chain OUTPUT (policy DROP)
target     prot opt source               destination

8.3.4. Правила для кольцевого сетевого интерфейса

Для начала давайте установим стандартные политики отбрасывания всех сетевых пакетов (DROP) для всех трех цепочек правил межсетевого экрана. Обратите внимание на то, что в случае работы через ssh ваше соединение с удаленной системой может закрыться в момент ввода данных команд ;-).

[root@RHEL5 ~]# iptables -P INPUT DROP
[root@RHEL5 ~]# iptables -P FORWARD DROP
[root@RHEL5 ~]# iptables -P OUTPUT DROP

После этого мы позволим серверу использовать кольцевой интерфейс (благодаря наличию которого сервер имеет возможность работать со своими службами). В первую очередь мы добавим правило в цепочку INPUT для пропуска (ALLOW) трафика от сетевого интерфейса lo (кольцевого интерфейса), после чего выполним аналогичное действие для того, чтобы сетевые пакеты могли покидать систему через кольцевой интерфейс.

[root@RHEL5 ~]# iptables -A INPUT -i lo -j ACCEPT
[root@RHEL5 ~]# iptables -A OUTPUT -o lo -j ACCEPT

Теперь взглянем на таблицу filter снова (в данном случае мы не используем параметр -t, так как информация об интересующей нас таблице выводится по умолчанию).

[root@RHEL5 ~]# iptables -nL
Chain INPUT (policy DROP)
target     prot opt source               destination
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0

Chain FORWARD (policy DROP)
target     prot opt source               destination

Chain OUTPUT (policy DROP)
target     prot opt source               destination
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0

8.3.5. Разрешение использования протокола ssh при работе с сетевым интерфейсом eth0

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

[root@RHEL5 ~]# iptables -A INPUT -i eth0 -p tcp --dport 22 -j ACCEPT
[root@RHEL5 ~]# iptables -A OUTPUT -o eth0 -p tcp --sport 22 -j ACCEPT

Таблица filter будет выглядеть аналогично таблице, представленной в данном примере (обратите внимание на то, что параметр -v был использован для получения более подробного вывода).

[root@RHEL5 ~]# iptables -nvL
Chain INPUT (policy DROP 7 packets, 609 bytes)
 pkts bytes target prot opt in    out   source     destination 
    0     0 ACCEPT all  --  lo    *     0.0.0.0/0  0.0.0.0/0 
    0     0 ACCEPT tcp  --  eth0  *     0.0.0.0/0  0.0.0.0/0  tcp dpt:22

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

Chain OUTPUT (policy DROP 3 packets, 228 bytes)
 pkts bytes target prot opt in    out   source     destination
    0     0 ACCEPT all  --  *     lo    0.0.0.0/0  0.0.0.0/0
    0     0 ACCEPT tcp  --  *     eth0  0.0.0.0/0  0.0.0.0/0  tcp spt:22
[root@RHEL5 ~]#

8.3.6. Разрешение доступа к системе из подсети

В данном примере показана методика разрешения доступа к системе с любого компьютера из сети 10.1.1.0/24, но только посредством сетевого интерфейса eth1. В данном случае не накладывается каких-либо ограничений на использование различных номеров портов (приложений).

[root@RHEL5 ~]# iptables -A INPUT -i eth1 -s 10.1.1.0/24 -p tcp -j ACCEPT
[root@RHEL5 ~]# iptables -A OUTPUT -o eth1 -d 10.1.1.0/24 -p tcp -j ACCEPT

Как и в предыдущих примерах, ниже приведено описание результирующих правил.

[root@RHEL5 ~]# iptables -nvL
Chain INPUT (policy DROP 7 packets, 609 bytes)
 pkts bytes target prot opt in    out   source      destination
    0     0 ACCEPT all  --  lo    *     0.0.0.0/0   0.0.0.0/0
    0     0 ACCEPT tcp  --  eth0  *     0.0.0.0/0   0.0.0.0/0  tcp dpt:22
    0     0 ACCEPT tcp  --  eth1  *     10.1.1.0/24 0.0.0.0/0

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

Chain OUTPUT (policy DROP 3 packets, 228 bytes)
 pkts bytes target prot opt in    out   source      destination
    0     0 ACCEPT all  --  *     lo    0.0.0.0/0   0.0.0.0/0
    0     0 ACCEPT tcp  --  *     eth0  0.0.0.0/0   0.0.0.0/0  tcp spt:22
    0     0 ACCEPT tcp  --  *     eth1  0.0.0.0/0   10.1.1.0/24

8.3.7. Команда iptables save

Используйте команду iptables save для автоматического применения данных правил после перезапуска межсетевого экрана.

[root@RHEL5 ~]# /etc/init.d/iptables save
Saving firewall rules to /etc/sysconfig/iptables:          [  OK  ]
[root@RHEL5 ~]#

8.3.8. Пример сценария для применения правил межсетевого экрана

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

#!/bin/bash
# В первую очередь очистка всех таблиц
iptables -t filter -F
iptables -t filter -X
iptables -t nat -F
iptables -t nat -X

# Стандартная политика отбрасывания всех сетевых пакетов
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT DROP

# Разрешение использования кольцевого сетевого интерфейса
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT

# Разрешение использования протокола ssh для доступа к системе извне посредством сетевого интерфейса eth0
iptables -A INPUT -i eth0 -p tcp --dport 22 -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 22 -j ACCEPT

# Разрешение обмена любым трафиком с узлами из подсети 10.1.1.0/24
iptables -A INPUT -i eth1 -s 10.1.1.0/24 -p tcp -j ACCEPT
iptables -A OUTPUT -o eth1 -d 10.1.1.0/24 -p tcp -j ACCEPT

8.3.9. Разрешение обмена ICMP-трафиком (генерируемым утилитой ping)

Сразу же после активации межсетевого экрана iptables вы можете получить сообщение "Operation not permitted" при использовании утилиты ping для проверки доступности других узлов.

[root@RHEL5 ~# ping 192.168.187.130
PING 192.168.187.130 (192.168.187.130) 56(84) bytes of data.
ping: sendmsg: Operation not permitted
ping: sendmsg: Operation not permitted

В примере ниже показана последовательность команд, позволяющая настроить межсетевой экран iptables для пропуска трафика, генерируемого утилитой ping на вашей машине или принимаемого вашей машиной.

[root@RHEL5 ~]# iptables -A INPUT -p icmp --icmp-type any -j ACCEPT
[root@RHEL5 ~]# iptables -A OUTPUT -p icmp --icmp-type any -j ACCEPT

Две приведенные выше команды не позволяют другим компьютерам передавать сообщения утилиты ping через вашу систему, выполняющую роль маршрутизатора, ввиду того, что правила добавляются лишь в цепочки правил INPUT и OUTPUT межсетевого экрана. Для маршрутизации сообщений утилиты ping вам придется добавить соответствующее правило в цепочку FORWARD межсетевого экрана. Следующая команда разрешает передачу пакетов протокола ICMP между сетями.

[root@RHEL5 ~]# iptables -A FORWARD -p icmp --icmp-type any -j ACCEPT

Предыдущий раздел: Оглавление Следующий раздел:
7.14. Практическое задание: механизм пересылки сетевых пакетов   8.4. Практическое задание: фильтрация сетевых пакетов