Лабораторная работа №13 — Межсетевые экраны
- Все лабораторные работы по сетевым протоколам в Linux
- Предыдущая лабораторная работа — Маршрутизация сетей с помощью протокола MPLS
Быстрый поиск
Цель лабораторной — познакомить изучающего с основами работы с межсетевыми экранами
Задачи лабораторной:
- Изучить логику работы межсетевых экранов;
- Познакомиться с межсетевым экраном NFTables;
- Реализовать тестовую топологию с применением межсетевого экрана.
Межсетевые экраны
Межсетевой экран — FireWall — особая программная (или аппаратно-программная) технология обработки сетевого трафика. Межсетевые экраны работают на всех уровнях стека протоколов, и с помощью описываемых в них правил занимаются ограничением (контроль количества и скорости поступления трафика), перенаправлением (DNAT, Port Forwarding), преобразованием (в самом частом случае трансляцией (SNAT) ) и учётом трафика на любом этапе его взаимодействия с устройством.
Межсетевой экран NFTables
Для разных уровней стека протоколов существуют разные межсетевые экраны. В данной работе рассматривается универсальный межсетевой экран nftables. Его особенность заключается в покрытии наибольшего числа уровней стека протоколов, а также расширенные возможности обработки трафика за счёт работы специальной виртуальной машины, анализирующей задаваемые правила и выполняющей их.
Схема работы межсетевого экрана представлена на картинке:

В рамках лабораторной рассматривается IP Layer - уровень обработки, соответствующий сетевому и транспортному уровням стека протоколов.

Особенности структуры NFTables
В зависимости от типа поступающего трафика он может обрабатываться на разных контрольных точках (“хуках”) сервиса.
Все поступающие пакеты первоначально проходят контрольную точку Prerouting, после чего проверяется адресат пакета. В случае обработки пакета своего сервиса производится передача его приложению через контрольную точку Input. При маршрутизации пакета он проходит контрольную точку Forward, после чего отправляется, на выходе проходя контрольную точку Postrouting. При отправке пакета из приложения он проходит контрольную точку Output и также отправляется, проходя Postrouting.
Все правила представляют из себя некоторые единичные действия над пакетами, точками входа-выхода трафика, некоторыми статически или динамически собранными множествами и т.д.

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

Для работы создайте 2 клона согласно топологии сети. Для создания соединений между машинами необходимо в VirtualBox настроить сетевые интерфейсы (описание настройки подключения находится в разделе настройки сетевых подключений):
srv:- Adapter2 — intnet
client:- Adapter2 — intnet
Базовая настройка сети
Для настройки сетей воспользуйтесь Systemd, аналогично настройке прошлой лабораторной. С помощью конфигурационных файлов задайте:
- Адреса на соответствующих интерфейсах;
- Пробрасывание пакетов между интерфейсами (IPv4Forwarding);
Также для абонента srv необходимо включить автоконфигурирование сети на интерфейсе eth0, через который осуществляется соединение с внешней сетью. За конфигурирование сети отвечает протокол DHCP. Он автоматически настраивает DNS, трансляцию адресов для srv, позволяя обращаться с него в глобальную сеть.
📍 1. Скопируйте или перепишите конфигурационные файлы настройки в соответствующие виртуальные машины.
@srv:/etc/systemd/network/10-inet.network
[Match]
Name=eth0
[Network]
DHCP=ipv4
IPv4Forwarding=yes
@srv:/etc/systemd/network/50-intnet.network
[Match]
Name=eth1
[Network]
Address=10.0.1.1/24
IPv4Forwarding=yes
@client:/etc/systemd/network/50-intnet.network`
[Match]
Name=eth1
[Network]
Address=10.0.1.254/24
[Route]
Gateway=10.0.1.1
Destination=0.0.0.0/0
📍 2. На каждой виртуальной машине включите службу systemd-networkd
srv
[root@srv ~]# systemctl enable --now systemd-networkd
[root@srv ~]#
client
[root@client ~]# systemctl enable --now systemd-networkd
[root@client ~]#
Настройка NFTables
📍 1. На srv включите службу nftables
srv
[root@srv ~]# systemctl enable --now nftables.service
Created symlink '/etc/systemd/system/multi-user.target.wants/nftables.service' -> '/usr/lib/systemd/sys
tem/nftables.service'.
[root@srv ~]#
📍 2. С помощью команды nft list ruleset выведите текущий вид таблиц межсетевого экрана
srv
[root@srv ~]# nft list ruleset
table inet filter {
chain input {
type filter hook input priority filter; policy accept;
}
chain forward {
type filter hook forward priority filter; policy accept;
}
chain output {
type filter hook output priority filter; policy accept;
}
}
[root@srv ~]#
ℹ По умолчанию в системе присутствует единственная таблица с именем filter (имя таблицы может быть любым и никак не связано с типом входящих в него цепочек), цепочки из которой применяются для пакетов всех типов (ключевое слово inet используется для цепочек, подходящих под все пакеты, слова ip и ipv6 - только для пакетов соответствующих протоколов).
ℹ Таблица содержит три пустые цепочки (имена цепочек могут быть любыми и никак не связаны с контрольными точками, куда они привязываются). Для каждой цепочки задаются тип правил в ней (nat - преобразование, filter - фильтрация, route - перенаправление), соответствующий хук (если он есть), а также приоритет цепочки с помощью ключевых слов. Также следует явно указывать политику использования цепочки (некоторые могут иметь явный reject и не обрабатывать трафик до наступления некоторых условий или явной смены политики).
Настройка трансляции адресов
При настройке выхода в интернет с помощью DHCP для настраиваемого узла автоматически включается трансляция адресов. В данном разделе необходимо включить трансляцию адресов для внутреннего абонента сети client.
📍 1. С помощью команд мониторинга сети проверьте невозможность выхода в интернет с абонента client:
@client
[root@client ~]# ping -c5 77.88.44.242
PING 77.88.44.242 56(84) bytes of data.
^C
--- 77.88.44.242 ping statistics ---
4 packets transmitted, 0 received, 100% packet loss, time 4005ms
[root@client ~]#
📍 2. Скопируйте или перепишите в конфигурационный файл межсетевого экрана srv настройку трансляции адресов.
@srv: /etc/nftables/nftables.nft
table inet filter {
chain input {
type filter hook input priority filter; policy accept;
}
chain forward {
type filter hook forward priority filter; policy accept;
}
chain output {
type filter hook output priority filter; policy accept;
}
}
table ip masq {
chain do_masq {
type nat hook postrouting priority srcnat; policy accept;
oifname "eth0" masquerade
}
}
ℹ Данное изменение читается так:
- Создать новую таблицу с именем
masqдля обработки пакетов протоколаIPv4; - В таблице создать цепочку
do_masqтипа “Преобразование” в привязкой к контрольной точкеPostrouting, приоритет цепочки -srcnat; - На выходе с интерфейса
eth0(oif-Output InterFace) проводить трансляцию исходящего адреса.
📍 3. С помощью команд мониторинга сети проверьте возможность выхода в интернет с client
@client
[root@client ~]# ping -c5 77.88.44.242
PING 77.88.44.242 56(84) bytes of data.
64 bytes from 77.88.44.242: icmp_seq=1 ttl=254 time=8.43 ms
64 bytes from 77.88.44.242: icmp_seq=2 ttl=254 time=65.3 ms
64 bytes from 77.88.44.242: icmp_seq=3 ttl=254 time=54.8 ms
64 bytes from 77.88.44.242: icmp_seq=4 ttl=254 time=37.7 ms
64 bytes from 77.88.44.242: icmp_seq=5 ttl=254 time=47.3 ms
--- 77.88.44.242 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4005ms
rtt min/avg/max/mdev = 8.427/41.569/65.326/21.522 ms
[root@client ~]#
Ограничение доступа
📍 1. Опишите следующие правила для настройки ограничений доступа к srv
@srv
[root@srv ~]# nft add table ip limiter
[root@srv ~]# nft add chain ip limiter netcatstop "{type filter hook input priority filter;}"
[root@srv ~]# nft add rule ip limiter netcatstop "tcp dport 1234 ct state new limit rate over 15/minute drop"
[root@srv ~]#
ℹ Данные правила описывают следующие действия с межсетевым экраном:
- В таблицу для пакетов протокола
IPv4названияlimiterдобавить цепочкуnetcatstop; - Добавить в цепочку правило “Если по
TCPна порт 1234 происходит более 15 новых подключений (ct state new-Connection Tracker state == new) в минуту, сбрасывать пакеты”
📍 2. Добавьте сервис для проверки подключения к абоненту:
@srv
[root@srv ~]# socat TCP-LISTEN:1234,reuseaddr,fork EXEC:"echo Success!" &
[1] 1502
[root@srv ~]# ss -lntp
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
LISTEN 0 5 0.0.0.0:1234 0.0.0.0:* users:(("socat",pid=1502,fd=5))
LISTEN 0 128 0.0.0.0:22 0.0.0.0:* users:(("sshd",pid=693,fd=3))
[root@srv ~]#
ℹ Об особенностях работы с сетевыми сервисами можно прочитать в отдельной главе методического пособия, поддерживающего данные лабораторные. Здесь же достаточно понимать, что теперь при обращении к порту 1234 данного абонента будет возвращаться строчка “Success!”
📍 3. С помощью короткого shell-сценария совершите множество обращений с client на srv на указанный порт, используя утилиту netcat:
@client
[root@client ~]# for n in `seq 10`; do echo $n; netcat 10.0.1.1 1234 < /dev/null; done
1
Success!
2
Success!
3
Success!
4
Success!
5
Success!
6
<4 seconds pause>
Success!
7
<4 seconds pause>
Success!
8
<4 seconds pause>
Success!
9
<4 seconds pause>
Success!
10
<4 seconds pause>
Success!
[root@client ~]#
ℹ Заметьте, что после превышения допустимого порога по подключениям (15 в минуту → подключение не чаще, чем раз в 4 секунды) доступ блокируется до окончания интервала подключения.
Самостоятельная работа

Для работы создайте 3 клона согласно топологии сети. Для создания соединений между машинами необходимо в VirtualBox настроить сетевые интерфейсы (описание настройки подключения находится в разделе настройки сетевых подключений):
srv:- Adapter2 — intnet
router:- Adapter2 — intnet
- Adapter3 — deepnet
client:- Adapter2 — deepnet
📍 Предварительно настроить сеть:
- «выход в интернет» должен работать на всех трёх машинах через
server - Все сетевые настройки выполняются перманентно с помощью
sytemd-networkd- (маршрут по умолчанию, маршрут с
srvнаclientи обратно)
- (маршрут по умолчанию, маршрут с
SNATнаserverдолжен быть настроен перманентно с помощью/etc/nftables/nftables.nft
📍 Настроить на router с помощью межсетевого экрана сброс любого ssh-подключения, проходящего через router (forward)
- Нужно убрать некоторые лишние условия из последнего примера лабораторной, а также поменять порт
- Не забудьте также поменять hook
📍 Запустить отчёты на каждой машине и выполнить соответствующие команды:
report 13 srv- ip a
- ip route
- cat /etc/systemd/networkd/*
- nft list ruleset
- ssh -o ConnectTimeout=2 10.0.23.3
- ssh -o ConnectTimeout=2 10.0.23.2
report 13 router- ip a
- ip route
- cat /etc/systemd/networkd/*
- nft list ruleset
report 13 client- ip a
- ip route
- cat /etc/systemd/networkd/*
- nft list ruleset
- ssh -o ConnectTimeout=2 10.0.12.1
- ssh -o ConnectTimeout=2 10.0.12.2
📍 Полученные отчёты report.13.srv, report.13.router, report.13.client перенести из виртуальной машины и прислать преподавателю с подписью выполненного варианта.