Инструкция по настройке межсетевого экрана на «С-Терра Шлюз» при помощи утилиты «iptables»
Настоящий документ имеет статус вспомогательного материала, который может быть использован технологическими партнерами и компаниями-интеграторами при разработке собственных решений. Решения, описанные в данной инструкции, могут применяться в действующих сетях/системах только после тестовой и/или опытной эксплуатации. Инструкция актуальна для Продукта «С-Терра Шлюз» версии 4.3 сборки 4.3.23955 (исполнения ПАК «С-Терра Шлюз» версий «3-7», «3-9», «3-11»).
Данная инструкция содержит описание процесса настройки межсетевого экрана со следующими возможностями:
· Добавление сетевых интерфейсов в зоны безопасности (Zone-Based);
· Сохранение информации о состояниях сетевых сессий (stateful);
· Глубокое инспектирование сетевых пакетов (DPI);
· Синхронизация сетевых сессий в отказоустойчивом кластере.
Stateful Zone Based Firewall – это межсетевой экран с возможностью контроля состояния сессий, использующий в качестве модели конфигурации не сетевые интерфейсы, а зоны. В зоны безопасности можно добавлять один или несколько сетевых интерфейсов. Другими словами, вместо использования списков доступа, относящихся к определенным интерфейсам, можно использовать правила, применяемые к зонам безопасности. При этом, данный межсетевой экран позволяет осуществлять контроль сетевого трафика при помощи сохранения информации о текущих состояниях сессий.
Дальнейшие настройки будут осуществляться согласно следующей схеме (за основу взят сценарий «Построение отказоустойчивого решения на базе протокола VRRP с настройкой через cisco-like консоль»):
Рисунок 1. Схема разделения сети на зоны безопасности
· trusted zone – доверенная (локальная) зона безопасности
· untrusted zone – недоверенная (публичная) зона безопасности
Утилита «iptables» управляет правилами межсетевого экранирования подсистемы «netfilter» ядра Linux. По умолчанию в подсистеме «netfilter» разрешён весь входящий, исходящий и транзитный сетевой трафик. Безопасность сети, представленной на схеме (см. Рисунок 1), должна обеспечиваться определёнными политиками. По умолчанию все входящие и транзитные пакеты должны быть отброшены. Далее, должны быть установлены необходимые разрешающие правила безопасности, обеспечивающие корректную работу межсетевого экрана.
При настройке межсетевого экрана с возможностью сохранения информации о состояниях сетевых сессий необходимо уметь оперировать понятиями ESTABLISHED, RELATED и NEW:
· ESTABLISHED – это установленное, уже существующее соединение;
· RELATED – это соединение, установленное с другим соединением, имеющим статус ESTABLISHED;
· NEW – это новое соединение. Под пометкой NEW понимается первый пакет, отправленный при инициировании нового соединения.
Все настройки должны производиться согласно следующей логике: всегда должны быть разрешены RELATED и ESTABLISHED соединения, но, если нужно добавить какое-то разрешающее или запрещающее правило, то при добавлении данного правила нужно указывать состояние NEW. То есть, каждое новое правило будет добавлено в рамках нового соединения.
Настройку межсетевого экрана на основе зон безопасности можно разделить на следующие этапы:
1. Создание зон безопасности;
2. Добавление сетевых интерфейсов в зоны безопасности;
3. Создание политик безопасности и привязка их к зонам безопасности при помощи утилиты «iptables».
Настройки ниже будут производиться на примере криптошлюза Hub1-n1.
Создание зон безопасности осуществляется путём изменения содержимого файла /etc/iproute2/group (по умолчанию в данном файле находится только одна группа - default):
root@Hub1-n1:~# cat /etc/iproute2/group
# device group names
0 default
Группы – это и есть так называемые зоны безопасности. Для того, чтобы добавить зону безопасности, необходимо в отдельной строке указать индекс и название.
Нужно создать две зоны безопасности: untrusted и trusted. Для этого необходимо привести файл /etc/iproute2/group к следующему виду:
root@Hub1-n1:~# vim.tiny /etc/iproute2/group
# device group names
0 default
1 untrusted
2 trusted
Зоны безопасности успешно созданы.
Для того, чтобы добавить сетевой интерфейс в созданную зону безопасности, необходимо воспользоваться утилитой «ip». Согласно схеме (см. Рисунок 1), сетевой интерфейс eth1 находится в зоне trusted, а сетевой интерфейс eth0 – в зоне untrusted:
root@Hub1-n1:~# ip link set eth1 group trusted
root@Hub1-n1:~# ip link set eth0 group untrusted
Для того, чтобы принадлежность интерфейса зоне безопасности сохранялась после перезагрузки, необходимо:
Скрипты из директории /etc/network/if-pre-up.d/ выполняются в лексикографическом порядке во время загрузки криптошлюза, поэтому, в случае создания пользовательских скриптов, рекомендуется давать им такое название, которое обеспечивало бы их выполнение в последнюю очередь.
1. Создать файл с названием zifs_zones в директории /etc/network/if-pre-up.d/ :
root@Hub1-n1:~# vim.tiny /etc/network/if-pre-up.d/zifs_zones
2. Скопировать содержимое ниже в этот файл (массивы INTERFACE_IN_TRUSTED и INTERFACE_IN_UNTRUSTED должны быть заданы согласно логике принадлежности интерфейсов зонам безопасности):
#!/bin/bash
# In the array INTERFACES_IN_<ZONE_NAME> you can specify multiple
network interfaces.
# Example: INTERFACES_IN_TRUSTED=(eth1 eth2 eth3)
INTERFACES_IN_TRUSTED=(eth1)
INTERFACES_IN_UNTRUSTED=(eth0)
for i in ${INTERFACES_IN_TRUSTED[@]}
do
if [[ "$IFACE" == $i ]]; then
ip link set $i group trusted
fi
done
for i in ${INTERFACES_IN_UNTRUSTED[@]}
do
if [[ "$IFACE" == $i ]]; then
ip link set $i group untrusted
fi
done
3. Дать файлу /etc/network/if-pre-up.d/zifs_zones права на исполнение:
root@Hub1-n1:~# chmod u+x /etc/network/if-pre-up.d/zifs_zones
4. Перезапустить сетевые интерфейсы:
root@Hub1-n1:~# ifdown eth1; ifup eth1
root@Hub1-n1:~# ifdown eth0; ifup eth0
5. Убедиться в том, что сетевые интерфейсы были добавлены в нужные зоны безопасности:
root@Hub1-n1:~# ip link show eth1
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DEFAULT group trusted qlen 1000
link/ether 00:90:0b:7f:2d:b7 brd ff:ff:ff:ff:ff:ff
root@Hub1-n1:~# ip link show eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DEFAULT group untrusted qlen 1000
link/ether 00:90:0b:7f:2d:b8 brd ff:ff:ff:ff:ff:ff
Сетевые интерфейсы успешно добавлены в зоны безопасности.
Будьте внимательны! Сетевые интерфейсы, не добавленные ни в одну из зон безопасности, будут находиться в зоне default. Это значит, что к ним будут применяться политики по умолчанию всех цепочек утилиты «iptables».
В данной главе будет производиться подробное описание настройки политик безопасности межсетевого экрана на базе Продукта «С-Терра Шлюз» 4.3. Правила, указанные ниже, предполагают, что на межсетевом экране используется шифрование.
1. Установка правил безопасности по умолчанию:
root@Hub1-n1:~# iptables -P INPUT DROP
root@Hub1-n1:~# iptables -P FORWARD DROP
root@Hub1-n1:~# iptables -P OUTPUT ACCEPT
2. Создание новых цепочек.
2.1. Цепочка для трафика, который попадает из доверенной зоны на межсетевой экран:
root@Hub1-n1:~# iptables -N from_TRUSTED_to_SELF
2.2. Цепочка для трафика, который попадает из недоверенной зоны на межсетевой экран:
root@Hub1-n1:~# iptables -N from_UNTRUSTED_to_SELF
2.3. Цепочка для трафика, который транзитом проходит через межсетевой экран из доверенной зоны в недоверенную:
root@Hub1-n1:~# iptables -N from_TRUSTED_to_UNTRUSTED
2.4. Цепочка для трафика, который транзитом проходит через межсетевой экран из недоверенной зоны в доверенную:
root@Hub1-n1:~# iptables -N from_UNTRUSTED_to_TRUSTED
3. Установка разрешающих правил безопасности на входящий на межсетевой экран (SELF) сетевой трафик.
3.1. Новые соединения на петлевой интерфейс (для обмена данными между сервисами, работающими на межсетевом экране):
root@Hub1-n1:~# iptables -A INPUT -m conntrack --ctstate NEW -i lo -j ACCEPT
3.2. Перенаправление трафика, попавшего из доверенной зоны на межсетевой экран, в цепочку from_TRUSTED_to_SELF:
root@Hub1-n1:~# iptables -A INPUT -m devgroup --src-group trusted -j from_TRUSTED_to_SELF
3.2.1 Новые соединения из доверенной зоны с сервисами, функционирующими на межсетевом экране (правила в цепочку from_TRUSTED_to_SELF):
· Установленные соединения:
root@Hub1-n1:~# iptables -A from_TRUSTED_to_SELF -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
· DNS
root@Hub1-n1:~# iptables -A from_TRUSTED_to_SELF -m conntrack --ctstate NEW -p udp --dport 53 -m comment --comment "DNS" -j ACCEPT
· NTP
root@Hub1-n1:~# iptables -A from_TRUSTED_to_SELF -m conntrack --ctstate NEW -p udp --dport 123 -m comment --comment "NTP" -j ACCEPT
· DHCP (как сервер)
root@Hub1-n1:~# iptables -A from_TRUSTED_to_SELF -m conntrack --ctstate NEW -p udp --dport 67 -m comment --comment "DHCP" -j ACCEPT
· DHCP (как клиент)
root@Hub1-n1:~# iptables -A from_TRUSTED_to_SELF -m conntrack --ctstate NEW -p udp --dport 68 -m comment --comment "DHCP" -j ACCEPT
· SSH
root@Hub1-n1:~# iptables -A from_TRUSTED_to_SELF -m conntrack --ctstate NEW -p tcp --dport 22 -m comment --comment "SSH" -j ACCEPT
· BGP
root@Hub1-n1:~# iptables -A from_TRUSTED_to_SELF -m conntrack --ctstate NEW -p udp --dport 179 -m comment --comment "BGP" -j ACCEPT
· CONNTRACKD
root@Hub1-n1:~# iptables -A from_TRUSTED_to_SELF -m conntrack --ctstate NEW -p udp --dport 3780 -m comment --comment "CONNTRACKD" -j ACCEPT
· VRRP
root@Hub1-n1:~# iptables -A from_TRUSTED_to_SELF -m conntrack --ctstate NEW -p vrrp -m comment --comment "VRRP" -j ACCEPT
· ICMP
root@Hub1-n1:~# iptables -A from_TRUSTED_to_SELF -m conntrack --ctstate NEW -p icmp -m comment --comment "ICMP" -j ACCEPT
3.3. Перенаправление трафика, попавшего из недоверенной зоны на межсетевой экран, в цепочку from_UNTRUSTED_to_SELF:
root@Hub1-n1:~# iptables -A INPUT -m devgroup --src-group untrusted -j from_UNTRUSTED_to_SELF
3.3.1 Новые соединения из недоверенной зоны с сервисами, функционирующими на межсетевом экране (правила в цепочку from_UNTRUSTED_to_SELF):
· Установленные соединения:
root@Hub1-n1:~# iptables -A from_UNTRUSTED_to_SELF -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
· ICMP
root@Hub1-n1:~# iptables -A from_UNTRUSTED_to_SELF -m conntrack --ctstate NEW -p icmp -m comment --comment "ICMP" -j ACCEPT
· IKE
root@Hub1-n1:~# iptables -A from_UNTRUSTED_to_SELF -m conntrack --ctstate NEW -p udp --dport 500 -m comment --comment "IKE" -j ACCEPT
· NAT-T
root@Hub1-n1:~# iptables -A from_UNTRUSTED_to_SELF -m conntrack --ctstate NEW -p udp --dport 4500 -m comment --comment "IKEv1/NAT-T" -j ACCEPT
· VRRP
root@Hub1-n1:~# iptables -A from_UNTRUSTED_to_SELF -m conntrack --ctstate NEW -p vrrp -m comment --comment "VRRP" -j ACCEPT
· Расшифрованный трафик
root@Hub1-n1:~# iptables -A from_UNTRUSTED_to_SELF -m conntrack --ctstate NEW -m mark --mark 0xc0000000/0xc0000000 -m comment --comment "Decrypted traffic" -j ACCEPT
4. Установка разрешающих правил безопасности на транзитный сетевой трафик.
4.1. Перенаправление трафика, проходящего из доверенной зоны в недоверенную, в цепочку from_TRUSTED_to_UNTRUSTED:
root@Hub1-n1:~# iptables -A FORWARD -m devgroup --src-group trusted --dst-group untrusted -j from_TRUSTED_to_UNTRUSTED
4.1.1 Все соединения из доверенной зоны в недоверенную (правило в цепочку from_TRUSTED_to_UNTRUSTED):
root@Hub1-n1:~# iptables -A from_TRUSTED_to_UNTRUSTED -m conntrack --ctstate NEW,ESTABLISHED,RELATED -j ACCEPT
4.1.2 Трафик, который подвергся DNAT из доверенной зоны в недоверенную (правило в цепочку from_TRUSTED_to_UNTRUSTED):
root@Hub1-n1:~# iptables -A from_TRUSTED_to_UNTRUSTED -m conntrack --ctstate DNAT -j ACCEPT
4.2. Перенаправление трафика, проходящего из недоверенной зоны в доверенную, в цепочку from_UNTRUSTED_to_TRUSTED:
root@Hub1-n1:~# iptables -A FORWARD -m devgroup --src-group untrusted --dst-group trusted -j from_UNTRUSTED_to_TRUSTED
4.2.1 Установленные соединения:
root@Hub1-n1:~# iptables -A from_UNTRUSTED_to_TRUSTED -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
4.2.2 Новые соединения из недоверенной зоны в доверенную расшифрованного трафика (правило в цепочку from_UNTRUSTED_to_TRUSTED):
root@Hub1-n1:~# iptables -A from_UNTRUSTED_to_TRUSTED -m conntrack --ctstate NEW -m mark --mark 0xc0000000/0xc0000000 -m comment --comment "Decrypted traffic" -j ACCEPT
Необходимо убедиться в том, что правила применились. Для этого нужно воспользоваться командой:
root@Hub1-n1:~# iptables -L –n -v
Рисунок 2. Вывод созданных политик безопасности при помощи утилиты «iptables»
Создание политик безопасности завершено.
Для того, чтобы сохранить настройки утилиты «iptables», необходимо воспользоваться утилитой «netfilter-persistent»: сначала сохранить правила безопасности, а потом добавить сервис в автозапуск:
root@Hub1-n1:~# netfilter-persistent save
run-parts: executing /usr/share/netfilter-persistent/plugins.d/15-ip4tables save
root@Hub1-n1:~# 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
Таким образом, была произведена настройка межсетевого экрана в режиме stateful с добавлением сетевых интерфейсов в зоны безопасности. Все правила, добавленные в ходе настройки политик безопасности, можно найти в главе «Приложение».
Для того, чтобы корректно настроить Source NAT, необходимо:
1. Создать две новые цепочки в таблице NAT:
1.1. Цепочка NO_SOURCE_NAT, в которую будет направляться трафик, для которого не нужно делать source NAT:
root@Hub1-n1:~# iptables -N NO_SOURCE_NAT -t nat
1.2. Цепочка SOURCE_NAT, в которую будет направляться трафик, для которого нужно делать source NAT:
root@Hub1-n1:~# iptables -N SOURCE_NAT -t nat
2. Перенаправить весь трафик, который был отправлен в недоверенную зону и попал в цепочку POSTROUTING, в цепочку NO_SOURCE_NAT:
root@Hub1-n1:~# iptables -I POSTROUTING -m devgroup --dst-group untrusted -t nat -j NO_SOURCE_NAT -m comment --comment 'pass traffic to chain to bypass source NAT'
3. Перенаправить трафик, который был отправлен в недоверенную зону, попал в цепочку POSTROUTING и не «отсеялся» в цепочке NO_SOURCE_NAT, в цепочку SOURCE_NAT:
root@Hub1-n1:~# iptables -A POSTROUTING -m devgroup --dst-group untrusted -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.
4. Выключить source NAT для следующего трафика (правила в цепочку NO_SOURCE_NAT):
4.1. Локальные IKE/ESP/NAT-T пакеты:
root@Hub1-n1:~# iptables -t nat -A NO_SOURCE_NAT -m mark --mark 0x8000000/0x8000000 -j ACCEPT -m comment --comment 'local IKE packets'
root@Hub1-n1:~# 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 пакетов соответственно.
4.2. Протокол VRRP (если настройки делаются на кластере):
root@Hub1-n1:~# iptables -t nat -A NO_SOURCE_NAT -p 112 -j ACCEPT -m comment --comment 'local VRRP packets'
4.3. В подсеть 127.0.0.0/8:
root@Hub1-n1:~# iptables -t nat -A NO_SOURCE_NAT -d 127.0.0.0/8 -j ACCEPT -m comment --comment 'traffic to loopback iface'
Это правило необходимо для корректной работы локальных сетевых сервисов, например Syslog.
4.4. Который должен шифроваться:
root@Hub1-n1:~# 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'
5. Включить source NAT для следующего трафика (правила в цепочку SOURCE_NAT):
5.1. Транзитный IPsec, использующий порты 500/4500 протокола UDP (используется для подмены портов):
root@Hub1-n1:~# iptables -t nat -A SOURCE_NAT -p udp --sport 500 -j SNAT --to-source 172.16.100.100:40500-40540 -m comment --comment 'transit IKE packets'
root@Hub1-n1:~# iptables -t nat -A SOURCE_NAT -p udp --sport 4500 -j SNAT --to-source 172.16.100.100:44500-44540 -m comment --comment 'transit ESP/NAT-T packets'
Нельзя, чтобы транзитный IPsec трафик использовал те же source UDP порты (500/4500), что и Продукт, так как в этом случае Продукт будет считать входящие транзитные IPsec пакеты за свои.
5.2. Из локальной подсети:
root@Hub1-n1:~# iptables -t nat -A SOURCE_NAT -s 192.168.100.0/24 -j SNAT --to-source 172.16.100.100
6. Посмотреть текущие NAT правила при помощи команды:
root@Hub1-n1:~# iptables -L -n -v -t nat
7. Сохранить добавленные правила при помощи команды:
root@Hub1-n1:~# netfilter-persistent save
run-parts: executing /usr/share/netfilter-persistent/plugins.d/15-ip4tables save
На «С-Терра Шлюз» доступна установка дополнительного ПО:
· модуль nDPI;
· сервис conntrackd.
nDPI – это модуль, который реализует DPI (Deep Packet Inspection). DPI – это технология глубокой проверки сетевых пакетов с целью выявления принадлежности сетевого трафика к конкретному ресурсу или приложению и дальнейшего принятия решений по нему (блокировка/шейпинг). При помощи DPI можно контролировать взаимодействия пользователей с такими приложениями, как Telegram, TikTok, YouTube, Google, Twitter и т.д. Полный список поддерживаемых приложений и протоколов доступен в главе «Приложение».
Conntrackd – это сервис, позволяющий синхронизировать сетевые сессии между несколькими межсетевыми экранами. Данный сервис используется на криптошлюзах, которые объединены в VRRP-кластер. При отказе основной ноды, резервная нода будет иметь все сессии, которые были на основной до ее отказа.
Требуемое ПО уже предустановлено на криптошлюзах с версией CVSTAG, начиная с BIM43_2023_02_16 (версию CVSTAG можно найти в файле /etc/image_version). Если версия ниже, то дополнительное ПО необходимо установить вручную при помощи архива, который можно получить на сайте doc.s-terra.ru.
Для того, чтобы установить дополнительное ПО, необходимо:
1. Перенести архив fw_tools.tar.gz в директорию /root и воспользоваться командой для распаковки:
root@Hub1-n1:~# tar xzvpf fw_tools.tar.gz
2. Перейти в директорию fw_tools при помощи команды:
root@Hub1-n1:~# cd fw_tools
3. Запустить скрипт fw_tools_install.bash:
root@Hub1-n1:~/fw_tools# ./fw_tools_install.bash
##############################################################
# INFO: ndpi-netfilter and conntrackd successfully installed #
##############################################################
4. При помощи утилиты «iptables» просмотреть список поддерживаемых модулем nDPI интернет-ресурсов (полный список доступен в главе «Приложение»):
root@Hub1-n1:~# iptables -m ndpi -h | grep youtube
xdmcp xiaomi yahoo youtube
5. Убедиться в том, что сервис conntrackd установлен:
root@Hub1-n1:~# systemctl status conntrackd.service
● conntrackd.service - Conntrack Daemon
Loaded: loaded (/lib/systemd/system/conntrackd.service; disabled; vendor preset: enabled)
Active: inactive (dead)
Docs: man:conntrackd(8)
man:conntrackd.conf(5)
Будьте внимательны! В силу программных ограничений, настройка синхронизации сетевых сессий может осуществляться только в том случае, когда модуль nDPI не загружен. Совместное использование модуля nDPI и сервиса conntrackd может привести к падению ядра операционной системы. Модуль nDPI не будет загружен в том случае, если соответствующие правила, настроенные при помощи утилиты «iptables», не содержат настройки -m ndpi.
В данной главе приведены примеры использования глубокого инспектирования пакетов при помощи модуля nDPI. DPI анализирует не только заголовки пакетов, но и полезную нагрузку, позволяя принимать решение по косвенным признакам, присущим каким-то определённым приложениям или протоколам. При этом, для идентификации приложения или протокола достаточно указать название.
Правила глубокого инспектирования настраиваются при помощи утилиты «iptables». Например, для того, чтобы заблокировать транзитный трафик youtube, telegram, instagram, ssh из доверенной зоны в недоверенную зону сети (например, нужно ограничить пользователям доступ к некоторым ресурсам в контексте уже настроенных выше stateful-правил), необходимо воспользоваться командой:
root@Hub1-n1:~# iptables -A from_TRUSTED_to_UNTRUSTED -m ndpi --clevel -port --proto youtube,telegram,instagram,ssh -j DROP
Для того, чтобы глубокое инспектирование на межсетевом экране типа stateful работало корректно, правило, использующее модуль nDPI, должно быть самым первым в цепочке from_TRUSTED_to_UNTRUSTED.
Для удаления правила необходимо воспользоваться командой:
root@Hub1-n1:~# iptables -D from_TRUSTED_to_UNTRUSTED -m ndpi --proto youtube,telegram,instagram,ssh -j DROP
Ключ --proto позволяет указать название приложения или протокола.
Если рассматривать использование модуля nDPI без зонирования, но в контексте межсетевого экрана типа stateful, то настройку глубокого инспектирования пакетов можно осуществить двумя способами:
1. Создать «белый» список доступа (запретить по умолчанию прохождение всех пакетов и при помощи модуля nDPI разрешить прохождение, например, следующих пакетов: google, microsoft и HTTP). Список правил будет выглядеть следующим образом:
root@Hub1-n1:~# iptables -A FORWARD -m conntrack --ctstate NEW,ESTABLISHED,RELATED -m ndpi --inprogress google,microsoft,http -j ACCEPT
root@Hub1-n1:~# iptables -A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -m ndpi --proto google,microsoft,http -j ACCEPT
root@Hub1-n1:~# <все остальные разрешающие правила, в которых не используется модуль ndpi>
Ключ --inprogress позволяет корректно использовать процесс обнаружения необходимых пакетов, если модуль nDPI используется совместно со stateful-фильтрацией. Например, необходимо разрешить доступ к google, microsoft и подключения по протоколу HTTP. Если удалить правило с ключом --inprogress и оставить только лишь правило с ключом --proto (см. правила выше), то может произойти следующая ситуация:
1.1 Предположим, инициируется входящее или транзитное HTTP-соединение из недоверенной зоны. Прежде чем осуществлять соединение по протоколу HTTP, нужно построить TCP-сессию. Модуль nDPI определит, что осуществляется новое TCP-соединение и так как оно инициируется на порт 80, то предварительно будет обнаружен трафик HTTP (при передаче первых трёх пакетов SYN, SYN-ACK, ACK модуль nDPI пытается заранее определить, какой протокол будет использоваться далее). Подключение будет разрешено, так как протокол (HTTP) и состояние (NEW) соответствуют второму правилу.
1.2 Далее, после обмена пакетами SYN, SYN-ACK, ACK, будет установлена TCP-сессия (ESTABLISHED), в рамках которой уже можно будет передавать HTTP-трафик.
1.3 Затем HTTP-трафик будет передаваться в рамках установленной ESTABLISHED-сессии.
1.4 Однако, модуль nDPI в п.1.1 может ошибочно определить, что доступ осуществляется именно по протоколу HTTP (так как подключение может инициироваться, например, по протоколу SHH, но на 80 порт). Так как соединение уже будет находиться в состоянии ESTABLISHED, то фактически получится передавать пакеты протокола SSH на 80 порт под видом протокола HTTP, что представляет угрозу для безопасности системы (так как фактически пользователь в «белом» списке доступа разрешает только google, microsoft и HTTP, но никак не SSH).
При использовании протокола TCP ключ --inprogress позволяет начать процесс обнаружения необходимых сервисов или протоколов не в самом начале по первому пакету, а только после того, как TCP-сессия уже будет установлена (после обмена сообщениями SYN, SYN-ACK, ACK, то есть, фактически начиная с четвёртого пакета - с того, что будет передаваться уже в рамках созданной TCP-сессии).
2. Создать «чёрный» список доступа (разрешить по умолчанию прохождение всех пакетов и при помощи модуля nDPI запретить прохождение пакетов от необходимых пользователю сервисов и протоколов, например, от ssh):
root@Hub1-n1:~# iptables -A FORWARD -m ndpi --clevel -port --proto ssh -j DROP
root@Hub1-n1:~# iptables -A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
root@Hub1-n1:~# <все остальные запрещающие правила, в которых не используется модуль ndpi>
В данном случае используется ключ --clevel, который позволяет начать процесс обнаружения необходимых сервисов или протоколов с выбранного уровня обработки. Список уровней следующий: unknown, port, ip, user, nbpf, dpart, dcpart, dcache, dpi. В правиле, указанном выше, процесс обнаружения будет начинаться с уровня «ip», то есть с уровня, который находится после уровня «port». Использование --clevel -port для протокола ssh позволяет начать процесс обнаружения, не затрагивая при этом порт. То есть, если существует необходимость использовать 22 порт для каких-нибудь других протоколов, но, при этом, нужно заблокировать протокол ssh, то данное правило позволит это сделать.
По умолчанию сервис conntrackd выключен и удалён из автозапуска. Перед запуском сервиса необходимо убедиться в том, что модуль nDPI не загружен и внести изменения в конфигурационный файл /etc/conntrackd/conntrackd.conf (содержимое по умолчанию конфигурационного файла /etc/conntrackd/conntrackd.conf можно найти в главе «Приложение»).
При использовании сервиса conntrackd необходимо различать такие понятия, как internal cache (внутренний кэш) и external cache (внешний кэш). Internal cache – это кэш, содержащий информацию о состояниях локальных сетевых сессий. External cache – это кэш, содержащий информацию о состояниях сетевых сессий, полученных от других межсетевых экранов, находящихся в VRRP-кластере. При правильной настройке сервиса conntrackd, внутренний кэш ноды, находящейся в состоянии MASTER, должен совпадать с внешнем кэшем ноды, находящейся в состоянии BACKUP.
Будьте внимательны! Перед настройкой сервиса conntrackd необходимо убедиться в том, что на обеих нодах VRRP-кластера сетевые интерфейсы, по которым будет осуществляться передача информации о состояниях сетевых сессий, добавлены в доверенную зону сети.
Будем считать, что на схеме (см. рисунок 1) сетевые интерфейсы, по которым будет осуществляться передача информации о состояниях сетевых сессий между нодами Hub1-n1 и Hub1-n2, имеют адреса 192.168.100.10/24 и 192.168.100.20/24 соответственно.
Для того, чтобы настроить синхронизацию сетевых сессий на устройствах, которые находятся в одном VRRP-кластере, необходимо осуществить следующие настройки:
1. Приведите файл /etc/keepalived/notify_common.conf к виду:
root@Hub1-n1:~# vim.tiny /etc/keepalived/notify_common.conf
FLAG_MANAGE_ROUTES="true"
RESERVE_ROUTES="0.0.0.0/0"
RESERVE_NEXTHOP="192.168.100.1"
RESERVE_METRIC="1"
Настройка данного конфигурационного файла требуется для того, чтобы резервная нода, находящаяся в состояниях Backup или Fault, имела доступ до заданной подсети (в данном сценарии в Интернет) через активную ноду.
При изменении данных параметров на уже работающей ноде кластера нужно перезапустить сервис keepalived:
root@Hub1-n1:~# systemctl restart keepalived.service
2. Привести файл /etc/conntrackd/conntrackd.conf к следующему виду:
root@Hub1-n1:~# vim.tiny /etc/conntrackd/conntrackd.conf
Sync {
Mode FTFW {
DisableExternalCache off
CommitTimeout 5
PurgeTimeout 5
}
UDP {
# Dedicated link for connection replication
IPv4_address 192.168.100.10
IPv4_Destination_Address 192.168.100.20
Port 3780
Interface eth7
SndSocketBuffer 1249280
RcvSocketBuffer 1249280
Checksum on
}
}
General {
Systemd on
Nice -20
HashSize 32768
HashLimit 131072
LogFile on
Syslog on
NetlinkOverrunResync 5
PollSecs 5
EventIterationLimit 200
LockFile /var/lock/conntrack.lock
UNIX {
Path /var/run/conntrackd.ctl
Backlog 20
}
NetlinkBufferSize 2097152
NetlinkBufferSizeMaxGrowth 8388608
Filter From Userspace {
Protocol Accept {
TCP
UDP
ICMP # This requires a Linux kernel >= 2.6.31
}
Address Ignore {
IPv4_address 127.0.0.1 # loopback
}
}
}
Где:
· IPv4_address <Address> - адрес локального устройства;
· IPv4_Destination_Address <Address> - адрес устройства, с которым будет осуществляться синхронизация сетевых сессий;
· Port <Number> - номер порта;
· Interface <Name> - имя интерфейса, по которому будет осуществляться синхронизация.
Это основные параметры, значения которых следует менять при настройке конфигурационного файла /etc/conntrackd/conntrackd.conf. Остальные параметры можно оставить без изменений (настройки файлов /etc/conntrackd/conntrackd.conf на обеих нодах VRRP-кластера можно найти в главе «Приложение»).
3. Разрешить приём пакетов синхронизации по протоколу UDP на порт 3780 из доверенной зоны на межсетевой экран:
root@Hub1-n1:~# iptables -A from_TRUSTED_to_SELF -m conntrack --ctstate NEW -p udp --dport 3780 -m comment --comment "For conntrackd.service" -j ACCEPT
По умолчанию устройства могут передавать информацию о состояниях сетевых сессий из внутреннего кэша во внешний, но не наоборот. Для того, чтобы информация из внешнего кэша переходила во внутренний, необходимо выполнить команду conntrackd -c. Однако, данная команда должна выполняться лишь в том случае, когда нода VRRP кластера переходит из состояния Backup в состояние Master. На нодах присутствует скрипт /etc/keepalived/scripts/notify_common, который автоматически выполняется при изменении состояния (включить автоматическое выполнение скрипта /etc/keepalived/scripts/notify_common при изменении состояния ноды необходимо через cisco-like консоль).
4. Настроить процесс перехода внешнего кэша во внутренний при переходе межсетевого экрана из состояния BACKUP/FAULT в состояние MASTER, а именно, добавить команду conntrackd -c в скрипт /etc/keepalived/scripts/notify_common (строка 69):
root@Hub1-n1:~# vim.tiny /etc/keepalived/scripts/notify_common
...
case $STATE in
"MASTER")
to_syslog "info" "sync group $GROUP_NUMBER in $STATE state."
conntrackd -c
if [[ $FLAG_MANAGE_ROUTES == "true" ]]; then
ip_routes_mgr "flush" "$RTPROTO"
fi
...
5. Если запуск скрипта /etc/keepalived/scripts/notify_common при переходах между состояниями кластера не включён, то необходимо его включить через cisco-like консоль:
5.1. Зайти в cisco-like консоль криптошлюза:
root@Hub1-n1:~# su cscons
5.2. Перейти в привилегированный режим настройки:
Hub1-n1# configure terminal
5.3. Включить запуск скрипта/etc/keepalived/scripts/notify_common:
Hub1-n1(config)# vrrp notify common
6. Добавить сервис conntrackd в автозапуск:
root@Hub1-n1:~# systemctl enable conntrackd.service
Synchronizing state of conntrackd.service with SysV service script with /lib/systemd/systemd-sysv-install.
Executing: /lib/systemd/systemd-sysv-install enable conntrackd
7. Запустить сервис:
root@Hub1-n1:~# systemctl start conntrackd.service
8. Просмотреть информацию о синхронизации сетевых сессий:
root@Hub1-n1:~# conntrackd -s
cache internal:
current active connections: 22
connections created: 1068499 failed: 0
connections updated: 6092740 failed: 0
connections destroyed: 1068477 failed: 0
cache external:
current active connections: 17
connections created: 1068020 failed: 0
connections updated: 6071951 failed: 0
connections destroyed: 1068003 failed: 0
traffic processed:
0 Bytes 0 Pckts
UDP traffic (active device=eth1):
448801428 Bytes sent 447626432 Bytes recv
1906738 Pckts sent 1928210 Pckts recv
0 Error send 0 Error recv
message tracking:
0 Malformed msgs 126 Lost msgs
Настройка синхронизации сетевых сессий при помощи сервиса conntrackd завершена.
Содержимое конфигурационного файла /etc/conntrackd/conntrackd.conf разделяется на несколько секций:
· Sync – секция синхронизации, в ней указывается режим работы сервиса и протокол, по которому будет передаваться информация о состояниях сетевых сессий;
· General – основная секция, в ней указываются основные параметры, касающиеся функциональности сервиса (логирование, размеры буферов приёма и отправки, адреса и т.д.).
Режимы работы, которые могут быть указаны в секции Sync:
· FTFW – данный режим является самым надёжным, так как набор его параметров синхронизации позволяет восстанавливать во внешнем кэше таблицы conntrackd потерянную, повреждённую или не до конца подтвержденную информацию о состояниях сетевых сессий. При работе с сервисом conntrackd рекомендуется использовать именно этот режим. Используемые параметры:
- ResendQueueSize (размер очереди повторной отправки в сессиях) – максимальное количество сессий, которое будет сохранено до подтверждения того, что информация о них получена устройством-соседом (значение по умолчанию 131072);
- CommitTimeout (время подтверждения состояний в секундах) – если некоторые сессии не были восстановлены надлежащим образом, то после указанного тайм-аута во внешнем кэше таблицы conntrackd сохранятся только корректно восстановленные сессии, - остальные будут удалены (значение по умолчанию 180);
- PurgeTimeout (время очистки таблицы состояний в секундах) – время очистки внешнего кэша таблицы conntrackd (вызов команды conntrackd -t), когда устройство переходит из состояния основной ноды в состояние резервной (значение по умолчанию 60);
- ACKWindowSize (размер ACK-окна в байтах) – количество ACK-байтов, которое принимающая сторона готова принять в настоящий момент без подтверждения. Чем меньше данное значение, тем больше пакетов подтверждения будет отправлено (значение по умолчанию 300);
- DisableExternalCache (отключение внешнего кэша) – отключение внешнего кэша таблицы conntrackd для того, чтобы записи не сохранялись в нём, а переносились сразу во внутреннюю таблицу conntrackd. Данный параметр рекомендуется использовать только с флагом off, так как запись сразу во внутреннюю таблицу состояний требует больших аппаратных затрат, что может значительно снизить производительность (значение по умолчанию off);
- StartupResync (повторная синхронизация при запуске) – повторная синхронизация внешнего кэша таблицы conntrackd при запуске резервной ноды (значение по умолчанию off).
· ALARM – данный режим является так называемой «спам-рассылкой», так как его набор параметров синхронизации позволяет быстро осуществить синхронизацию устройств. Важно понимать, что, несмотря на скорость синхронизации, данный режим требует больших аппаратных затрат и отдельный канал для передачи данных. Используемые параметры:
- RefreshTime (время обновления в секундах) – если таблица contrackd не была изменена в течение данного тайм-аута, то на broadcast-адрес передаётся соответствующее сообщение всем устройствам в данной подсети (значение по умолчанию 15);
- CacheTimeout (тайм-айут внешнего кэша) – если не будет получено уведомление о состоянии сессии во внешнем кэше таблицы conntrackd через данный тайм-аут, то данная сессия будет удалена;
- CommitTimeout;
- PurgeTimeout.
· NOTRACK – самый простой режим, так как набор его параметров синхронизации позволяет получать информацию во внешний кэш таблицы conntrackd без каких-либо проверок:
- DisableInternalCache – отключение внутреннего кэша;
- DisableExternalCache;
- CommitTimeout;
- PurgeTimeout;
- StartupResync.
При использовании сервиса conntrackd рекомендуется выбирать режим FTFW, так как он позволяет наиболее корректно и гибко обрабатывать и передавать информацию о состояниях сетевых сессий.
Протоколы синхронизации, которые могут быть указаны в секции Sync:
· Multicast – информация о состояниях сетевых сессий будет передаваться при помощи multicast-пакетов. Используемые параметры:
- IPv4_address – multicast-адрес группы получателей;
- Group – номер multicast-группы получателей;
- IPv4_interface – адрес интерфейса, который будет использоваться в качестве отправителя;
- Interface – имя интерфейса, который будет использоваться в качестве отправителя;
- SndSocketBuffer – буфер постановки в очередь пакетов, которые будут переданы. Размер буфера по умолчанию доступен в файле /proc/sys/net/core/wmem_default. Чем больше размер данного буфера, тем меньше вероятность того, что пакеты с информацией о состояниях сетевых сессий будут потеряны.
- RcvSocketBuffer – буфер постановки в очередь пакетов, которые будут приняты (пакетов, ожидающих обработки сокетом). Размер буфера по умолчанию доступен в файле /proc/sys/net/core/rmem_default. Чем больше размер данного буфера, тем меньше вероятность того, что пакеты с информацией о состояниях сетевых сессий будут потеряны.
- Checksum – подсчёт контрольной суммы пакетов с информацией о состояниях сетевых сессий.
· UDP – информация о состояниях сетевых сессий будет передаваться при помощи UDP-пакетов. При работе с сервисом conntrackd рекомендуется использовать именно этот протокол синхронизации. Используемые параметры:
- IPv4_address – IPv4-адрес для получения сообщений о состояниях сетевых сессий;
- IPv6_address – IPv6-адрес для получения сообщений о состояниях сетевых сессий;
- IPv4_Destination_Address –IPv4-адрес получателя сообщений о состояниях сетевых сессий;
- IPv6_Destination_Address –IPv6-адрес получателя сообщений о состояниях сетевых сессий;
- Port – номер порта, который будет использовать протокол UDP;
- Interface;
- SndSocketBuffer;
- RcvSocketBuffer;
- Checksum.
· TCP – информация о состояниях сетевых сессий будет передаваться при помощи TCP-пакетов. Используемые параметры аналогичны тем, которые используются при выборе UDP.
Пример секции Sync:
Sync
{
Mode FTFW
{
DisableExternalCache off
CommitTimeout 5
PurgeTimeout 5
}
# Mode ALARM
# {
# RefreshTime 5
# CommitTimeout 5
# PurgeTimeout 5
# }
# Mode NOTRACK
# {
# DisableInternalCache off
# DisableExternalCache off
# }
UDP
{
IPv4_address 192.168.100.10
IPv4_Destination_Address 192.168.100.20
Port 3780
Interface eth0
SndSocketBuffer 1249280
RcvSocketBuffer 1249280
Checksum on
}
# Multicast
# {
# IPv4_address 225.0.0.51
# Group 3782
# IPv4_interface 192.168.100.102
# Interface eth4
# SndSocketBuffer 1249280
# RcvSocketBuffer 1249280
# Checksum on
# }
}
Параметры, которые могут быть указаны в секции General:
· Systemd <on|off> – поддержка systemd;
· Nice <value> – в текущей версии conntrackd данный параметр присутствует, но игнорируется, в дальнейшем, он будет удалён;
· HashSize <value> – количество сегментов в хеш-таблице кэша;
· HashLimit <value> – максимальное количество подключений (оно должно быть вдвое больше, чем в файле /proc/sys/net/netfilter/nf_conntrack_max);
· Logfile <on|off|filename> – логирование (при включении этой опции логирование будет производиться в файл /var/log/conntrackd.log);
· Syslog <on|off|facility> – логирование через syslog;
· Lockfile <filename> – Lockfile, который будет использоваться сервисом conntrackd (при включении этой опции по умолчанию этим файлом будет /var/lock/conntrack.lock);
· NetlinkBufferSize <value> – размер буфера событий Netlink. Размер буфера по умолчанию доступен в файле /proc/sys/net/core/rmem_default. Чем больше размер данного буфера, тем меньше вероятность того, что сообщения о событиях будут потеряны;
· NetlinkBufferSizeMaxGrowth <value> – размер буфера, который может быть максимально достигнут. Размер буфера NetlinkBufferSize будет удваиваться при обнаружении того, что сообщения о событиях Netlink были потеряны;
· NetlinkOverrunResync <on|off|value> – повторная синхронизация с ядром через 30 секунд (по умолчанию), если обнаружен факт того, что Netlink отбрасывает события изменения состояния;
· NetlinkEventsReliable <on|off> – опция может работать при условии установленного пакета NetlinkOverrunResync;
· PollSecs <seconds> – сброс состояний в ядре каждые N-секунд;
· EvenIterationLimit <value> – максимальное количество событий изменения состояний сетевых сессий (поступающих из ядра), которые будет обрабатывать демон, после чего он будет обрабатывать другие события, поступающие из сети или пользовательского окружения. Чем меньше значение, тем выше интерактивность;
· UNIX – секция, определяющая конфигурацию сокета Unix. Данный сокет используется сервисом conntrackd для прослушивания внешних команд. В данной секции указывается путь к сокету;
· Filter From Userspace – секция, при помощи которой осуществляется фильтрация событий. Доступно три набора фильтров: по протоколам, по адресам, по состояниям. Фильтр может быть привязан к действию: можно принять пакет, можно проигнорировать его. Таким образом, можно определить политику фильтрации событий наборов фильтров в зависимости от потребностей:
- Protocol Accept – секция, в которой указывается список протоколов, которые будут разрешены;
- Address Ignore – секция, в которой указывается список адресов, которые будут игнорироваться (если в пакете в качестве адреса отправителя будет указан какой-то из данных адресов, то сервис conntrackd будет игнорировать содержимое таких пакетов);
- State Accept – секция, в которой указывается список состояний, которые будут разрешены.
Пример секции General:
General
{
Systemd on
Nice -20
HashSize 32768
HashLimit 131072
LogFile on
Syslog on
NetlinkOverrunResync 5
PollSecs 5
EventIterationLimit 200
LockFile /var/lock/conntrack.lock
UNIX
{
Path /var/run/conntrackd.ctl
Backlog 20
}
NetlinkBufferSize 2097152
NetlinkBufferSizeMaxGrowth 8388608
Filter From Userspace
{
Protocol Accept
{
TCP
UDP
ICMP # This requires a Linux kernel >= 2.6.31
}
Address Ignore
{
IPv4_address 127.0.0.1 # loopback
IPv4_address 10.0.0.1
IPv4_address 10.0.0.2
IPv4_address 10.0.0.3
IPv4_address 192.168.255.2
IPv4_address 192.168.255.52
IPv4_address 192.168.255.250
}
State Accept
{
ESTABLISHED CLOSED TIME_WAIT CLOSE_WAIT for TCP
}
}
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
iptables -N from_TRUSTED_to_SELF
iptables -N from_UNTRUSTED_to_SELF
iptables -N from_TRUSTED_to_UNTRUSTED
iptables -N from_UNTRUSTED_to_TRUSTED
iptables -N NO_SOURCE_NAT -t nat
iptables -N SOURCE_NAT -t nat
iptables -A INPUT -m conntrack --ctstate NEW -i lo -j ACCEPT
iptables -A INPUT -m devgroup --src-group trusted -j from_TRUSTED_to_SELF
iptables -A from_TRUSTED_to_SELF -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A from_TRUSTED_to_SELF -m conntrack --ctstate NEW -p udp --dport 53 -m comment --comment "DNS" -j ACCEPT
iptables -A from_TRUSTED_to_SELF -m conntrack --ctstate NEW -p udp --dport 123 -m comment --comment "NTP" -j ACCEPT
iptables -A from_TRUSTED_to_SELF -m conntrack --ctstate NEW -p udp --dport 67 -m comment --comment "DHCP server" -j ACCEPT
iptables -A from_TRUSTED_to_SELF -m conntrack --ctstate NEW -p udp --dport 68 -m comment --comment "DHCP client" -j ACCEPT
iptables -A from_TRUSTED_to_SELF -m conntrack --ctstate NEW -p tcp --dport 22 -m comment --comment "SSH" -j ACCEPT
iptables -A from_TRUSTED_to_SELF -m conntrack --ctstate NEW -p udp --dport 179 -m comment --comment "BGP" -j ACCEPT
iptables -A from_TRUSTED_to_SELF -m conntrack --ctstate NEW -p udp --dport 3780 -m comment --comment "CONNTRACKD" -j ACCEPT
iptables -A from_TRUSTED_to_SELF -m conntrack --ctstate NEW -p vrrp -m comment --comment "VRRP" -j ACCEPT
iptables -A from_TRUSTED_to_SELF -m conntrack --ctstate NEW -p icmp -m comment --comment "ICMP" -j ACCEPT
iptables -A INPUT -m devgroup --src-group untrusted -j from_UNTRUSTED_to_SELF
iptables -A from_UNTRUSTED_to_SELF -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A from_UNTRUSTED_to_SELF -m conntrack --ctstate NEW -p icmp -m comment --comment "ICMP" -j ACCEPT
iptables -A from_UNTRUSTED_to_SELF -m conntrack --ctstate NEW -p udp --dport 500 -m comment --comment "IKE" -j ACCEPT
iptables -A from_UNTRUSTED_to_SELF -m conntrack --ctstate NEW -p udp --dport 4500 -m comment --comment "IKEv1/NAT-T" -j ACCEPT
iptables -A from_UNTRUSTED_to_SELF -m conntrack --ctstate NEW -p vrrp -m comment --comment "VRRP" -j ACCEPT
iptables -A from_UNTRUSTED_to_SELF -m conntrack --ctstate NEW -m mark --mark 0xc0000000/0xc0000000 -m comment --comment "Decrypted traffic" -j ACCEPT
iptables -A FORWARD -m devgroup --src-group trusted --dst-group untrusted -j from_TRUSTED_to_UNTRUSTED
iptables -A from_TRUSTED_to_UNTRUSTED -m ndpi --clevel -port --proto youtube,telegram,Instagram,ssh -j DROP
iptables -A from_TRUSTED_to_UNTRUSTED -m conntrack --ctstate NEW,ESTABLISHED,RELATED -j ACCEPT
iptables -A from_TRUSTED_to_UNTRUSTED -m conntrack --ctstate DNAT -j ACCEPT
iptables -A FORWARD -m devgroup --src-group untrusted --dst-group trusted -j from_UNTRUSTED_to_TRUSTED
iptables -A from_UNTRUSTED_to_TRUSTED -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A from_UNTRUSTED_to_TRUSTED -m conntrack --ctstate NEW -m mark --mark 0xc0000000/0xc0000000 -m comment --comment "Decrypted traffic" -j ACCEPT
iptables -I POSTROUTING -m devgroup --dst-group untrusted -t nat -j NO_SOURCE_NAT -m comment --comment 'pass traffic to chain to bypass source NAT'
iptables -A POSTROUTING -m devgroup --dst-group untrusted -t nat -j SOURCE_NAT -m comment --comment 'pass traffic to chain to do source NAT'
iptables -t nat -A NO_SOURCE_NAT -m mark --mark 0x8000000/0x8000000 -j ACCEPT -m comment --comment 'local IKE packets'
iptables -t nat -A NO_SOURCE_NAT -m mark --mark 0x40000000/0x40000000 -j ACCEPT -m comment --comment 'local ESP/NAT-T packets'
iptables -t nat -A NO_SOURCE_NAT -p 112 -j ACCEPT -m comment --comment 'local VRRP packets'
iptables -t nat -A NO_SOURCE_NAT -d 127.0.0.0/8 -j ACCEPT -m comment --comment 'traffic to loopback iface'
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'
iptables -t nat -A SOURCE_NAT -p udp --sport 500 -j SNAT --to-source 172.16.100.100:40500-40540 -m comment --comment 'transit IKE packets'
iptables -t nat -A SOURCE_NAT -p udp --sport 4500 -j SNAT --to-source 172.16.100.100:44500-44540 -m comment --comment 'transit ESP/NAT-T packets'
iptables -t nat -A SOURCE_NAT -s 192.168.100.0/24 -j SNAT --to-source 172.16.100.100
1kxun accuweather activision afp
aimini ajp alibaba alicloud
amazon amazonalexa amazonaws amazonvideo
amongus amqp anydesk apple
appleicloud appleitunes applejuice applepush
applesiri applestore appletvplus armagetron
avast avastsecuredns ayiya azure
badoo bgp bittorrent bjnp
bloomberg cachefly capwap cassandra
checkmk ciscoskinny ciscovpn citrix
cloudflare cloudflarewarp cnn coap
collectd corba cpha crashlytics
crossfire crynetwork csgo cybersec
dailymotion datasaver dazn deezer
dhcp dhcpv6 diameter direct_download_link
directconnect directv discord disneyplus
dnp3 dns dnscrypt dofus
doh_dot drda dropbox dtls
eaq ebay edgecast edonkey
egp elasticsearch ethernetip facebook
facebookvoip fastcgi fasttrack fiesta
fix florensia forticlient ftp_control
ftp_data ftps fuze genshinimpact
git github gitlab gmail
gnutella google googleclassroom googlecloud
googledocs googledrive googlehangoutduo googlemaps
googleplus googleservices goto gre
gtp gtp_c gtp_prime gtp_u
guildwars h323 halflife2 hbo
hotspotshield hp_virtgrp hsrp http
http_connect http_proxy hulu i3d
iax icecast icloudprivaterelay icmp
icmpv6 iec60870 iflix igmp
iheartradio imap imaps imo
instagram ip_in_ip ip_pim ipp
ipsec irc jabber kakaotalk
kakaotalk_voice kerberos kismet kontiki
lastfm ldap likee line
linecall linkedin lisp livestream
llmnr lotusnotes maplestory mdns
megaco memcached messenger mgcp
microsoft microsoft365 mining modbus
mongodb mpeg_ts mpegdash mqtt
ms_onedrive mssql-tds munin mysql
nat-pmp nats nestlogsink netbios
netflix netflow nfs nintendo
noe ntop ntp ocs
ocsp ookla opendns openft
openvpn oracle ospf outlook
pandora pastebin pgm pinterest
playstation playstore pluralsight pop3
pops postgresql ppstream pptp
psiphon qq quic radius
raknet rdp reddit redis
riotgames rpc rsh rsync
rtcp rtmp rtp rtsp
rx s7comm salesforce sap
sctp sd-rtn sflow shoutcast
showtime signal signalvoip sina(weibo)
sip siriusxmradio skype_teams skype_teamscall
slack smbv1 smbv23 smpp
smtp smtps snapchat snapchatcall
snmp soap socks softether
someip sopcast soundcloud spotify
ssdp ssh starcraft stealthnet
steam stun syncthing syslog
targusdataspeed teams teamspeak teamviewer
telegram telnet tencent tencentvideo
teredo tftp threema thunder
tidal tiktok tinc tivoconnect
tls tocaboca tor truphone
tuenti tumblr tunein tunnelbear
tvuplayer twitch twitter ubntac2
ubuntuone ultrasurf usenet vevo
vhua viber vimeo vmware
vnc vrrp vudu vxlan
warcraft3 waze webex websocket
wechat whatsapp whatsappcall whatsappfiles
whois-das wikipedia windowsupdate wireguard
worldofkungfu worldofwarcraft wsd xbox
xdmcp xiaomi yahoo youtube
youtubeupload z3950 zabbix zattoo
zeromq zoom
1. Файл /etc/conntrackd/conntrackd.conf (содержимое по умолчанию)
# Default debian config. Please, take a look at conntrackd.conf(5)
General {
HashSize 8192
HashLimit 65535
Syslog on
LockFile /var/lock/conntrackd.lock
UNIX {
Path /var/run/conntrackd.sock
Backlog 20
}
SocketBufferSize 262142
SocketBufferSizeMaxGrown 655355
# default debian service unit file is of Type=notify
Systemd on
}
Stats {
LogFile on
}
2. Файл /etc/conntrackd/conntrackd.conf
Sync {
Mode FTFW {
DisableExternalCache off
CommitTimeout 5
PurgeTimeout 5
}
UDP {
# Dedicated link for connection replication
IPv4_address 192.168.100.10
IPv4_Destination_Address 192.168.100.20
Port 3780
Interface eth7
SndSocketBuffer 1249280
RcvSocketBuffer 1249280
Checksum on
}
}
General {
Systemd on
Nice -20
HashSize 32768
HashLimit 131072
LogFile on
Syslog on
NetlinkOverrunResync 5
PollSecs 5
EventIterationLimit 200
LockFile /var/lock/conntrack.lock
UNIX {
Path /var/run/conntrackd.ctl
Backlog 20
}
NetlinkBufferSize 2097152
NetlinkBufferSizeMaxGrowth 8388608
Filter From Userspace {
Protocol Accept {
TCP
UDP
ICMP # This requires a Linux kernel >= 2.6.31
}
Address Ignore {
IPv4_address 127.0.0.1 # loopback
}
}
}
3. Файл /etc/keepalived/notify_common.conf:
FLAG_MANAGE_ROUTES="true"
RESERVE_ROUTES="0.0.0.0/0"
RESERVE_NEXTHOP="192.168.100.1"
RESERVE_METRIC="1"
1. Файл /etc/conntrackd/conntrackd.conf:
Sync {
Mode FTFW {
DisableExternalCache off
CommitTimeout 5
PurgeTimeout 5
}
UDP {
# Dedicated link for connection replication
IPv4_address 192.168.100.20
IPv4_Destination_Address 192.168.100.10
Port 3780
Interface eth7
SndSocketBuffer 1249280
RcvSocketBuffer 1249280
Checksum on
}
}
General {
Systemd on
Nice -20
HashSize 32768
HashLimit 131072
LogFile on
Syslog on
NetlinkOverrunResync 5
PollSecs 5
EventIterationLimit 200
LockFile /var/lock/conntrack.lock
UNIX {
Path /var/run/conntrackd.ctl
Backlog 20
}
NetlinkBufferSize 2097152
NetlinkBufferSizeMaxGrowth 8388608
Filter From Userspace {
Protocol Accept {
TCP
UDP
ICMP # This requires a Linux kernel >= 2.6.31
}
Address Ignore {
IPv4_address 127.0.0.1 # loopback
}
}
}
2. Файл /etc/keepalived/notify_common.conf:
FLAG_MANAGE_ROUTES="true"
RESERVE_ROUTES="0.0.0.0/0"
RESERVE_NEXTHOP="192.168.100.1"
RESERVE_METRIC="1"