Использование утилиты «iptables»

Скачать в формате PDF

Дополнительный файл:

iptables-persistent_1.00_sterra-1_all.deb

 

Назначение документа

Данный документ описывает особенности использования утилиты iptables в продукте «С-Терра Шлюз», а также кратко поясняет важные моменты подсистемы netfilter ядра Linux.

Краткое описание утилиты «iptables»

Утилита «iptables» - это инструмент для настройки фильтрации и трансляции сетевых адресов (NAT – network address translation) применительно к пакетам IPv4. Утилита «iptables» является пользовательским интерфейсом к подсистеме netfilter ядра Linux.

Краткое описание архитектуры подсистемы netfilter ядра Linux

Подсистема netfilter состоит из набора таблиц (filter, nat, mangle, raw, security) и цепочек (PREROUTING, INPUT, FORWARD, OUTPUT, POSTROUTING, также могут использоваться пользовательские цепочки). Таблицы определяют действия над пакетами, а цепочки – место совершения действия относительно пути прохождения пакетов и политику обработки. Каждая таблица состоит из набора цепочек, например, в таблице filter находится три цепочки INPUT, FORWARD, OUTPUT.

В подсистему netfilter также встроен драйвер (обработчик пакетов) ПО «С-Терра Шлюз», а именно – входящие на интерфейс пакеты обрабатываются до цепочки PREROUTING, а исходящие после POSTROUTING. Утилита «iptables» не может напрямую управлять правилами обработки трафика ПО «С-Терра Шлюз», но может повлиять на процесс обработки, поэтому нужно очень внимательно относиться к конфигурированию подсистемы netfilter при помощи iptables.

Политика пакетов в цепочках

У каждой цепочки есть политика обработки пакетов. Политика может быть разрешающая (ACCEPT) – разрешено все, что не запрещено, или блокирующая (DROP) – запрещено все, что не разрешено. На С-Терра Шлюз политика по умолчанию – ACCEPT, соответственно, подсистема netfilter разрешает прохождение любого трафика. Посмотреть политику во всех цепочках таблицы filter:

root@gate:~# iptables -L -n -t filter

Chain INPUT (policy ACCEPT)

target     prot opt source               destination

 

Chain FORWARD (policy ACCEPT)

target     prot opt source               destination

DROP       all  --  192.168.1.100        0.0.0.0/0

 

Chain OUTPUT (policy ACCEPT)

target     prot opt source               destination

Назначение таблиц и рекомендации к их использованию

1.    Filter – применяется для фильтрации пакетов (используется по умолчанию, если в iptables не задан параметр «-t»). Рекомендуется использовать данную таблицу для разрешения/блокировки пакетов. Правило, разрешающее входящие SSH пакеты на хост:

iptables –A INPUT -p tcp --dport 22 -j ACCEPT

2.    Nat – применяется для выполнения трансляции адресов (source NAT и destination NAT). При выполнении source NAT нужно указывать цепочку POSTROUTING, а при выполнении destination NAT нужно указывать цепочку PREROUTING:

iptables -t nat -A POSTROUTING -o eth1 -s 192.168.1.0/24 -j SNAT --to-source 1.1.1.1

iptables -t nat -A PREROUTING --dst 1.1.1.1 -p tcp --dport 2200 -j DNAT --to-destination 192.168.1.100:22

3.    Mangle – используется для специализированного изменения пакетов (например, действия TCPMSS, TTL, TOS, MARK). Используйте данную таблицу только в том случае, если Вы отчетливо понимаете то, что делаете. Правило, изменяющее MSS в tcp пакетах:

iptables -t mangle -A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --set-mss 1400

4.    Raw – используется для фильтрации и изменения пакетов до их регистрации в подсистеме отслеживания соединений (connection tracking), также данная таблица используется, если необходимо совершать действия над еще несобранными пакетам (фрагментами). Используйте данную таблицу только в том случае, если Вы отчетливо понимаете то, что делаете. Правила, выключающие отслеживание всех соединений (переключение с stateful в stateless режим):

iptables -t raw -I PREROUTING -j NOTRACK

iptables -t raw -I OUTPUT -j NOTRACK

5.    Security – используется подсистемой SELinux. Данная таблица никак не связана с ПО «С-Терра Шлюз» и крайне не рекомендуется для использования.

Порядок прохождения цепочек пакетами

1.    Входящий пакет, предназначенный для локального хоста: [драйвер ПО «С-Терра Шлюз»] -> [PREROUTING] -> [INPUT].

2.    Входящий пакет (транзитный), предназначенный для другого хоста: [драйвер ПО «С-Терра Шлюз»] -> [PREROUTING] -> [FORWARD] -> [POSTROUTING] -> [драйвер ПО «С-Терра Шлюз»].

3.    Локально сгенерированный пакет: [OUTPUT] -> [POSTROUTING] -> [драйвер ПО «С-Терра Шлюз»].

Драйвер ПО «С-Терра Шлюз» обрабатывает пакеты только на тех интерфейсах, на которых включены функции контроля, например, если на интерфейсе заданы списки доступа или крипто-карты.

Выводы:

1.    Входящие ESP/NAT-T пакеты, направляющиеся для расшифрования в подсистему IPsec ПО «С-Терра Шлюз», не могут быть обработаны в подсистеме netfilter (совершать операции при помощи iptables можно только над расшифрованными пакетами).

2.    Подсистема netfilter не может разрешить прохождение трафика, который заблокирован в подсистеме Firewall ПО «С-Терра Шлюз», но может его изменить так, чтобы не сработали функции перехвата.

3.    Если используется политика DROP для цепочек INPUT/OUTPUT, то необходимо разрешить прием входящих/исходящих пакетов протокола IKE (udp, порты 500/4500) в подсистеме netfilter.

4.    Если С-Терра Шлюз используется для предоставления доступа в Интернет и необходимо осуществлять source NAT, то первоначально нужно создать правила, исключающие IKE/NAT-T трафик, а также трафик который должен шифроваться, а потом добавить правило для source NAT. Например, считаем, что С-Терра Шлюз защищает взаимодействие между подсетями 192.168.1.0/24 (локальная подсеть) и 192.168.2.0/24 (удаленная подсеть) и имеет публичный IP-адрес 1.1.1.1 на внешнем интерфейсе eth1, то тогда правила iptables должны выглядеть следующем образом:

 

iptables -t nat -A POSTROUTING -o eth1 –s 1.1.1.1 -p udp --source-port 500 -j ACCEPT

iptables -t nat -A POSTROUTING -o eth1 –s 1.1.1.1 -p udp --source-port 4500 -j ACCEPT

iptables -t nat -A POSTROUTING -o eth1 -s 192.168.1.0/24 -d 192.168.2.0/24 -j

ACCEPT

iptables -t nat -A POSTROUTING -o eth1 -s 192.168.1.0/24 -j SNAT --to-source 1.1.1.1

5.    Если используется маркирование пакетов (действие MARK), то значение метки не должно превышать 16777215 (оставшиеся значения зарезервированы для внутреннего использования ПО «С-Терра Шлюз»):

iptables -t mangle -A PREROUTING -p tcp --dport 22 -j MARK --set-mark 2

Установка deb-пакета «iptables-persistent»

Если у Вас устройство «С-Терра Шлюз» без SPDS, то до полного выполнения всех шагов инструкции не перезагружайте устройство. Будьте внимательны, инструкция ниже актуальна только для шлюзов класса КС1 и КС2 (см. значение параметров PLATFORM и CLASS в файле /etc/image_version).

Перед применением ПО «iptables» нужно установить deb-пакет «iptables-persistent» (утилита «iptables» предустановлена изначально), который используется для сохранения и очистки всех правил iptables, а также для автоматического применения сохраненных ранее правил после перезагрузки ОС.

1.    Получите deb-пакет «iptables-persistent» в личном кабинете Партнера (https://www.s-terra.ru/auth/).

2.    Доставьте deb-пакет «iptables-persistent» на С-Терра Шлюз и установите его:

root@gate:~# dpkg -i iptables-persistent_1.00~sterra-1_all.deb

3.    В диалоговом окне «Configuring iptables-persistent» (см. рисунок 1). нажмите «Yes» для сохранения существующих правил iptables (правила будут сохранены в файл /etc/iptables/rules.v4).

Рисунок 1. Диалоговое окно «Configuring iptables-persistent»

4.    Если у Вас «С-Терра Шлюз» без SPDS, то перед перезагрузкой устройства необходимо осуществить пересчёт хэш-сумм:

root@GW1:~# /opt/VPNagent/bin/links_verify.sh update

Добавление, удаление, сохранение и просмотр правил iptables

1.    Добавление. Добавление правил осуществляется стандартным способом – через bash cli, например:

root@gate:~# iptables -A FORWARD -s 192.168.1.100 -j DROP

2.    Удаление. Удаление правил по одному осуществляется через bash cli, например, добавление и удаление правила:

root@gate:~# iptables -A FORWARD -s 192.168.1.100 -j DROP

root@gate:~# iptables -D FORWARD -s 192.168.1.100 -j DROP

Если необходимо удалить все правила iptables, то выполните команду service iptables-persistent  flush (данная команда также очищает файл /etc/iptables/rules.v4, соответственно, после перезагрузки правил не будет):ё

root@gate:~# service iptables-persistent flush

[ ok ] Flushing rules... IPv4...done.

3.    Сохранение. Сохранение правил осуществляется при помощи команды service iptables-persistent  save (правила будут сохранены в файл /etc/iptables/rules.v4 и автоматически загружены из него после перезагрузки ОС):

root@gate:~# service iptables-persistent save

[ ok ] Saving rules... IPv4...done.

4.    Просмотр. Просмотр текущих правил осуществляется через bash cli, например, чтобы посмотреть содержимое таблиц filter, mangle и nat выполните следующие команды:

root@gate:~# iptables -L -n -v -t filter

Chain INPUT (policy ACCEPT 252 packets, 30120 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

    0     0 DROP       all  --  *      *       192.168.1.100        0.0.0.0/0

 

Chain OUTPUT (policy ACCEPT 220 packets, 24744 bytes)

 pkts bytes target     prot opt in     out     source               destination

root@gate:~# iptables -L -n -v -t mangle

Chain PREROUTING (policy ACCEPT 112 packets, 11130 bytes)

 pkts bytes target     prot opt in     out     source               destination

 

Chain INPUT (policy ACCEPT 106 packets, 10662 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

    0     0 TCPMSS     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcpflags: 0x06/0x02 TCPMSS set 1400

 

Chain OUTPUT (policy ACCEPT 31 packets, 4296 bytes)

 pkts bytes target     prot opt in     out     source               destination

 

Chain POSTROUTING (policy ACCEPT 31 packets, 4296 bytes)

 pkts bytes target     prot opt in     out     source               destination

root@gate:~# iptables -L -n -v -t nat

Chain PREROUTING (policy ACCEPT 59 packets, 13001 bytes)

 pkts bytes target     prot opt in     out     source               destination

 

Chain INPUT (policy ACCEPT 53 packets, 12533 bytes)

 pkts bytes target     prot opt in     out     source               destination

 

Chain OUTPUT (policy ACCEPT 1 packets, 76 bytes)

 pkts bytes target     prot opt in     out     source               destination

 

Chain POSTROUTING (policy ACCEPT 1 packets, 76 bytes)

 pkts bytes target     prot opt in     out     source               destination

    0     0 ACCEPT     all  --  *      eth1    192.168.1.0/24       192.168.2.0/24

    0     0 SNAT       all  --  *      eth1    192.168.1.0/24       0.0.0.0/0            to:1.1.1.1