Использование утилиты «iptables»
Данный документ описывает особенности использования утилиты iptables в Продукте «С-Терра Шлюз», а также кратко поясняет важные моменты подсистемы netfilter ядра Linux.
Утилита «iptables» - это инструмент для настройки фильтрации и трансляции сетевых адресов (NAT - network address translation) применительно к пакетам IPv4. Утилита «iptables» является пользовательским интерфейсом к подсистеме 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. Исходящие ESP/NAT-T пакеты, которые уже зашифрованы, могут быть перенаправлены снова в цепочки netfilter при помощи опции re-route в соответствующей крипто-карте. Такие пакеты пройдут следующий путь: [OUTPUT] -> [POSTROUTING] -> [драйвер ПО «С-Терра Шлюз»].
3. Подсистема netfilter не может разрешить прохождение трафика, который заблокирован в подсистеме Firewall ПО «С-Терра Шлюз», но может его изменить так, чтобы не сработали функции перехвата ПО «С-Терра Шлюз».
4. Если в пользовательских правилах применяется маркирование пакетов (действие MARK), то на криптошлюзе запрещено изменять старшие 16 бит значения метки, так как они используются для внутренних нужд ПО «С-Терра Шлюз». Для работы с метками используйте маску.
4.1. Выборка пакетов при помощи iptables:
iptables -t nat -A PREROUTING -m mark --mark 0x00000001/0x0000FFFF -j ACCEPT
Там, где у маски нули - значения этих битов не учитываются.
4.2. Установка меток на пакеты при помощи iptables:
iptables -t nat -A POSTROUTING -p icmp -j MARK --set-mark 0x00000001/0x0000FFFF
Там, где у маски нули - значения этих битов не изменяются - они переносятся в результирующую метку.
5. Если используется политика DROP для цепочек INPUT/OUTPUT, то необходимо разрешить прием входящих/исходящих пакетов протокола IKE (порты 500 и 4500 протокола UDP) в подсистеме netfilter (пакеты протокола ESP нужно разрешать только в том случае, если используется опция re-route).
6. Если «С-Терра Шлюз» используется для предоставления доступа в Интернет и необходимо осуществлять source NAT, то нужно обеспечить следующие условия.
6.1. Source NAT должен быть отключен для перечисленных ниже пакетов:
· локальные IKE/ESP/NAT-T пакеты;
· локальные VRRP пакеты (при настройке на нодах VRRP кластера);
· все пакеты, которые предназначены для подсети 127.0.0.0/8.
· все пакеты, которые должны шифроваться.
6.2. При наличии транзитного IPsec трафика через криптошлюз нужно либо изменить source порты пакетов IKE/NAT-T в настройках третьих устройств с 500 на любой из диапазона 40500-40540 и с 4500 на любой из диапазона 44500-44540 (так как порты 500 и 4500 используются по умолчанию на С-Терра Шлюз), либо сделать это при помощи iptables.
Перед настройкой NAT необходимо остановить целевой трафик и очистить таблицу соединений/трансляций при помощи команды: conntrack -D conntrack.
Настройка осуществляется при помощи утилит iptables и netfilter-persistent, входящих в состав ОС.
Например, считаем, что «С-Терра Шлюз» защищает взаимодействие между подсетями 192.168.100.0/24 (локальная подсеть) и 192.168.1.0/24 (удаленная подсеть) и имеет публичный IP-адрес 1.1.1.1 на внешнем интерфейсе eth0, а также есть транзитный IPsec трафик от устройств из локальный подсети, то тогда source NAT настраивается следующим образом.
Для source NAT без явной необходимости не используете маскарадинг (-j MASQUERADE). Настоятельно рекомендуется явно указывать IP адрес, в который осуществляется трансляция.
Примечание: соответствие между именем интерфейса в нотации cisco-like и linux можно посмотреть в файле /etc/ifaliases.cf.
1. Войдите в linux bash.
administrator@sterragate] system
Entering system shell...
root@sterragate:~#
2. Очистите настройки iptables:
root@sterragate:~# netfilter-persistent flush
run-parts: executing /usr/share/netfilter-persistent/plugins.d/15-ip4tables flush
3. Добавьте две цепочки в таблицу NAT:
root@sterragate:~# iptables -N NO_SOURCE_NAT -t nat
root@sterragate:~# iptables -N SOURCE_NAT -t nat
В цепочку NO_SOURCE_NAT будет направляться трафик, для которого не нужно делать source NAT. В цепочку SOURCE_NAT будет направляться трафик, для которого нужно делать source NAT.
4. Добавьте правила в цепочку POSTROUTING для перенаправления пакетов в цепочки NO_SOURCE_NAT, SOURCE_NAT:
root@sterragate:~# iptables -I POSTROUTING -t nat -j NO_SOURCE_NAT -m comment --comment 'pass traffic to chain to bypass source NAT'
root@sterragate:~# iptables -A POSTROUTING -t nat -j SOURCE_NAT -m comment --comment 'pass traffic to chain to do source NAT'
Логика следующая: все пакеты из цепочки POSTROUTING сначала направляются в цепочку NO_SOURCE_NAT, в которой определяется трафик, для которого не нужно делать source NAT. После того как трафик был определен, он прекращает свою обработку (действие ACCEPT) и, соответственно, не попадает в цепочку SOURCE_NAT. То есть в цепочку SOURCE_NAT попадает все, что не «отсеялось» в цепочке NO_SOURCE_NAT.
5. Добавьте iptables правила в цепочку NO_SOURCE_NAT для трафика, для которого не нужно делать source NAT:
5.1. Выключите source NAT для локальных IKE/ESP/NAT-T пакетов:
root@sterragate:~# iptables -t nat -A NO_SOURCE_NAT -m mark --mark 0x8000000/0x8000000 -j ACCEPT -m comment --comment 'local IKE packets'
root@sterragate:~# iptables -t nat -A NO_SOURCE_NAT -m mark --mark 0x40000000/0x40000000 -j ACCEPT -m comment --comment 'local ESP/NAT-T packets'
Метки 0x8000000 и 0x40000000 являются внутренними метками Продукта для локальных IKE и ESP/NAT-T пакетов соответственно.
5.2. Если настройки делаются на кластере, то выключите source NAT для пакетов протокола VRPP:
root@sterragate:~# iptables -t nat -A NO_SOURCE_NAT -p 112 -j ACCEPT -m comment --comment 'local VRRP packets'
5.3. Выключите source NAT для трафика в подсеть 127.0.0.0/8:
root@sterragate:~# iptables -t nat -A NO_SOURCE_NAT -d 127.0.0.0/8 -j ACCEPT -m comment --comment 'traffic to loopback iface'
Это правило необходимо для корректной работы локальных сетевых сервисов, например Syslog.
5.4. Выключите source NAT для трафика, который должен шифроваться:
root@sterragate:~# iptables -t nat -A NO_SOURCE_NAT -s 192.168.100.0/24 -d 192.168.1.0/24 -j ACCEPT -m comment --comment 'traffic which must be protected by IPsec'
6. Добавьте iptables правила в цепочку SOURCE_NAT для трафика, для которого нужно делать source NAT:
6.1. Включите source NAT для транзитного IPsec трафика, использующего порты 500/4500 протокола UDP (используется для подмены портов):
root@sterragate:~# iptables -t nat -A SOURCE_NAT -p udp --sport 500 -o eth0 -j SNAT --to-source 1.1.1.1:40500-40540 -m comment --comment 'transit IKE packets'
root@sterragate:~# iptables -t nat -A SOURCE_NAT -p udp --sport 4500 -o eth0 -j SNAT --to-source 1.1.1.1:44500-44540 -m comment --comment 'transit ESP/NAT-T packets'
Нельзя, чтобы транзитный IPsec трафик использовал те же source UDP порты (500/4500), что и Продукт, так как в этом случае Продукт будет считать входящие транзитные IPsec пакеты за свои.
6.2. Включите source NAT для трафика из подсети 192.168.100.0/24:
root@sterragate:~# iptables -t nat -A SOURCE_NAT -s 192.168.100.0/24 -o eth0 -j SNAT --to-source 1.1.1.1
7. Сохраните добавленные iptables правила (правила сохраняются в файл /etc/iptables/rules.v4):
root@sterragate:~# netfilter-persistent save
run-parts: executing /usr/share/netfilter-persistent/plugins.d/15-ip4tables save
8. Добавьте сервис netfilter-persistent.service в автозапуск, чтобы правила iptables применялись во время старта криптошлюза:
root@sterragate:~# systemctl enable netfilter-persistent.service
Synchronizing state of netfilter-persistent.service with SysV service script with /lib/systemd/systemd-sysv-install.
Executing: /lib/systemd/systemd-sysv-install enable netfilter-persistent
9. Для просмотра текущих NAT правил воспользуйтесь командой:
root@sterragate:~# iptables -L -n -v -t nat
10. Для просмотра текущей таблицы NAT трансляций воспользуйтесь командой:
root@sterragate:~# conntrack -L
Чтобы пакеты протоколов GRE, PPTP попадали под NAT нужно загрузить модуль ядра nf_conntrack_pptp. Для этого выполните следующие действия.
1. Добавьте в конец файла /etc/modules строку nf_conntrack_pptp и перезагрузите ОС:
root@sterragate:~# vim.tiny /etc/modules
# /etc/modules: kernel modules to load at boot time.
#
# This file contains the names of kernel modules that should be loaded
# at boot time, one per line. Lines beginning with "#" are ignored.
nf_conntrack_pptp
root@sterragate:~# reboot
2. Убедитесь, что модуль загружен:
root@sterragate:~# lsmod | grep nf_conntrack_pptp
nf_conntrack_pptp 16384 0
nf_conntrack_proto_gre 16384 1 nf_conntrack_pptp
nf_conntrack 114688 7 nf_conntrack_ftp,nf_conntrack_ipv4,nf_conntrack_pptp,nf_nat_ftp,nf_conntrack_proto_gre,nf_nat_ipv4,nf_nat