Всем привет, дорогие друзья!
Я принял решение абсолютно бесплатно выложить небольшой, но для некоторых достаточно актуальный курс (название в заголовке поста).
В курсе вы развернете стенд в VirtualBox. Произведете базовую настройку сети используя iproute2, ifcfg, netplan, nmcli/nmtui). Обезопасите сетевое взаимодействие политиками iptables. Разберетесь как Linux обрабатывает трафик с помощью netfilter. Изучите вариации NAT и настроите их. В конце свяжете главный офис и филиал с помощью туннеля GRE, обеспечив безопасность с помощью IPsec (Stronswan).
Каждую неделю я буду выкладывать по 1-му блоку. Всего их 7:
1.Подготовка стенда в VirtualBox, базовая настройка сети и сервисов.
1.1 Подготовка лабораторного стенда;
1.2 -1.3 Создание виртуальных машин и определение типа сетевых подключений в VirtualBox;
1.4 Запуск виртуальных машин и их настройка в части базовой конфигурации сети
2. Продвинутая настройка безопасности в Linux. NAT (погружение). VPN GRE/IPsec
2.1 Iptables/netfilter;
2.2 Ограничиваем адреса с которых можно подключиться по ssh;
2.3 Логируем срабатывание правил в цепочках;
3. Bash скрипт базовой настройки iptables
4. Схемы и виды NAT
5. Настраиваем SNAT и DNAT
6. Двойной NAT или неприятная ситуация
7. Безопасность GRE туннеля. IPsec на базе StrongSwan
Если посчитаете, что материал вам полезен и возникнет непреодолимое желание отблагодарить, то это можно сделать через сервис Tinkoff CloudTips. IT's UP to YOU :)
И так погнали, первый блок...
1.Подготовка стенда в VirtualBox, базовая настройка сети и сервисов
1.1 Подготовка лабораторного стенда
В данном занятии я расскажу о том как подготовить лабораторный стенд.
Для развертывания вам понадобится VirtualBox версии 7.0. Можете конечно поэкспериментировать с другими версиями или даже использовать VMware Workstation, но тут я вам подробно не опишу порядок. Мной стенд разворачивался именно на VB 7.0. и на данной версии все гарантированно будет работать. Забегая вперед скажу, что стенд будет состоять базово из 4 машин (Головной офис):
Ubuntu 20.04.6 LTS (Focal Fossa серверной версии) -2 шт., CentOS Stream 9 (версия с графикой) - 1 шт., CentOS Linux 7 (серверная версия) - 1 шт.. На этапе отработки темы двойного NAT и построении GRE/IPsec потребуется еще две машины (филиальный офис): Ubuntu 20.04.6 LTS (Focal Fossa серверной версии) -1 шт., CentOS Stream 9 (версия с графикой) - 1 шт.
Работа со стендом разделена на этапы:
1.1 Скачивание и подготовка iso образов для головного офиса;
1.2 Создание виртуальных машин в VB;
1.3 Настройка сети виртуальных машин;
1.4 Запуск виртуальных машин и их настройка в части базовой конфигурации сети и необходимых сетевых сервисов.
Пошли по пунктам:
1.1 Скачивание и подготовка iso образов для головного офиса:
Мы уже определились, что базово для головного офиса нам необходимы следующие образы:
- Ubuntu 20.04.6 LTS (Focal Fossa серверной версии);
- CentOS Stream 9 (версия с графикой);
- CentOS Linux 7 (серверная версия).
По ссылкам вы можете скачать необходимые iso образы!
1.2 -1.3 Создание виртуальных машин и определение типа сетевых подключений в VirtualBox;
Я покажу вам на примере Ubuntu 20.04.6 LTS (Focal Fossa) как создать виртуальную машину, а VM из образов CentOS вы уже создадите сами (там все +- одинаково).
Перед тем как приступить к созданию виртуальных машин взглянем на то как должен по итогу выглядеть стенд:
Внимание! На схеме (сетевой мост 192.168.31.0/24) указана моя адресация исходя из того, что мой роутер раздает адреса из этой подсети. Ниже я приложу эту схему в качестве редактируемого файла в формате .drawio
Я вам настоятельно рекомендую мою схему оставить без изменений, сохранить вторую версию под другим названием и вносить туда свои подсети. Адреса хостов в сетях LAN1/2/3 старайтесь не менять для того чтобы вконец не запутаться. Моя схема необходима вам для того чтобы идти по курсу - все настройки базируются на моей адресации. Делайте по аналогии, но помните, что там где у меня адрес 192.168.31.X у вас может быть адрес 192.168.1.Y (в качестве примера)! Надеюсь вы уловили. Вообще внутри вашей сети может быть все что угодно, но в рамках RFC 1918.
Ниже представлены приватные сети классов A/B/C в рамках которых у вас может быть настроена внутренняя адресация:
10.0.0.0 - 10.255.255.255 (10/8 prefix)
172.16.0.0 - 172.31.255.255 (172.16/12 prefix)
192.168.0.0 - 192.168.255.255 (192.168/16 prefix)
Помните: подсеть сетевого моста в нашей лабе - своего рода публичная сеть для имитация сети Интернет (Как-бы интернет), разделяющей головной офис и филиальную сеть.
Итак. Начнем с развертывания первой VM. На схеме она обозначена как Ubuntu20_04_1 (Router1).
Справка:
Тонкая и толстая провизия - два метода выделения дискового пространства виртуальным машинам или приложеням. Тонкая провизия означает, что потребляется только необходимое пространство. В то время как толстая провизия это резервирование конкретного количества пространства с прицелом на будущее использование. Есть ньюансы у обоих методов. Первый метод экономит дисковое пространство, но является менее безопасным и должен использоваться в продуктивной среде с осторожностью. Наша лаба это не продуктивная среда, а количество пространства нашего компьютера имеет ограничения, так что это наш вариант. Толстая провизия это более безопасное решение с точки зрения менеджмента дисковой подсистемы, но не оптимальна с точки зрения использования. Можно выделить машине 100Гб, а использоваться будет только 30, 70 будет простаивать и не использоваться. Однако если вдруг пространстово понадобится, то оно точно будет. В системе с тонкой провизией гараний нет.
Т.е. указывая 25 ГБ мы как-бы указываем предел до которого машина может попросить дискового ресурса. Но при условии, что будет откуда выдавать) Поэтому по факту каждая Ваша виртуалка будет занимать гораздо меньше фактического пространства и это позволит развернуть вам 6 машин по 25ГБ при наличии свободно пространства в 50Гб :)
Ниже пример того, сколько занимает файл виртуальной машины после выделения ей 25ГБ дискового пространства с тонкой провизией (без галочки Выделить место в полном размере):
На этом этапе надо остановиться и попить чайка :)
Чтобы упростить задачу и не разворачивать с нуля Ubuntu20_04_2 и Ubuntu20_04_3 (смотри схему) можно просто клонировать уже развернутую Ubuntu20_04_1.
Выключите VM предварительно!
Далее следуют скрины процесса клонирования:
После того как клонировали машины, можете их ПООЧЕРЕДИ включить, чтобы проверить, что они являются точными копиями исходной машины и в целом работают и затем выключите и не трогайте. Вернемся к ним позже!
Теперь остается создать виртуальные машины Centos 9_1 и Centos7. Аналогично тому как я создавал Ubuntu20_04_1 создайте их.
После того как создадите Centos9_1 клонируйте ее в Centos9_2.
Машина Centos9_2 и Ubuntu20_04_3 относятся к филиальному офису, их стоит держать выключенными до того момента пока мы не дойдем до этапа создания GRE туннеля между головным и филиальным офисами.
А теперь я покажу вам настройки типов сетевых подключений машин головного офиса (делать в выключенном состоянии машин):
Наверное вы заметили, что количество задействованных адаптеров, типы их подключений и имена соответствуют схеме лабораторного стенда и логике заложенной в сетевую топологию.
1.4 Запуск виртуальных машин и их настройка в части базовой конфигурации сети
Итак, на предыдущих шагах мы создали виртуальные машины для головного и филиального офисов, при этом машины филиала мы выключили и пока оставили в стороне. Мы также определили типы сетевых адаптеров, их принадлежность к виртуальным сетям LAN1, LAN2 и подключили Ubuntu20_04_1 к сети нашего компьютера (тип подключения "сетевой мост"). Далее будем поочередно включать машины и производить базовую конфигурацию сети и необходимых сервисов используя при этом различные инструменты и способы.
Совет: после включения машин и проверки работоспособности ssh сервера создавайте ssh подключения с помощью putty или mobaxterm. Вам будет гораздо удобнее работать с машинами из терминальных подключений, а не из консоли VirtualBox.
Ниже во вложении прикреплена инструкция как подключаться с помощью Putty!
Советую использовать mobaxterm так как он исключительно удобен и позволяет подключаться в режиме "connect through SSH gateway (jumphost)" без костылей:
Для чего может понадобиться такой вариант подключения? Дело в том, что из вашей системы напрямую будут доступны машины Ubuntu20_04_1 и Ubuntu20_04_3, так как они подключены в режиме сетевого моста. Машины размещаемые в LAN1/2/3 будут доступны за ними. В такой схеме доступа как раз и подходит SSH туннель. Mobaxterm создает SSH туннель до Gateway SSH сервера (Ubuntu20_04_1 и Ubuntu20_04_3), а Gateway в свою очередь проксирует SSH соединение уже в рамках локальных подсетей LAN1/2/3.
1.Включаем Ubuntu 20_04_1 (Router1) и подключаемся к ней по ssh;
Перед тем как приступать к настройке сети необходимо прописать hostname. Делается это в файле /etc/hostname. Откройте файл в режиме редактирования и внесите запись вида:
Если не разу не пользовались редактором nano, вот коротенькое видео, описывающее основные возможности:
Linux для Начинающих - Редактирование Файлов: vim, pico, nano
Внимание!
Не забывайте настраивать hostname на всех виртуалках, чтобы проще было потом с ними работать - в консоли имя будет отображаться после @. Если этого не сделать, то у вас будут сюрпризы.
2.Проверяем какие у нас сетевые интерфейсы и что с их настройками:
Видим, что интерфейс enp0s3, подключенный в сетевой мост уже имеет адрес. Это признак того, что отработал DHCP. Посмотреть детали можно так:
Из вывода команды netplan ip leases enp0s3 хорошо видно кто там выдал IP, это был Router с адресом 192.168.31.1, он же DSN сервер.
Обратите внимание на CLIENTID. Мы еще вернемся к этому ID когда будем запускать клонированную машину Ubuntu20_04_3 (Router2). С этим ID будет нюанс.
3.Необходимо настроить и включить второй интерфейс (в моем случае это enp0s8):
sudo nano /etc/netplan/00-installer-config.yaml # открыть файл конфигурации с правами рута
Примечание:
Netplan — это утилита для конфигурации сети. Настройка сети через Netplan выполняется в конфигурационном файле, который находится в папке /etc/netplan/. Это текстовый файл с расширением .yaml.
YAML — это формат данных с простым синтаксисом. YAML использует систему отступов, в качестве которых выступают пробелы. При создании и редактировании конфигурационного файла такого формата легко ошибиться — указать неверное количество пробелов. Из-за этого возникнет ошибка “expected mapping” и файл будет невозможно прочитать.
Netplan позволяет проверить корректность конфигурации перед применением. Для этого введите команду:
sudo netplan try
Если с новой конфигурацией в Ubuntu сеть перестанет работать, через 2 минуты будут восстановлены предыдущие настройки и сетевые подключения восстановятся:
Чтобы применить настройки без проверки, введите команду:
sudo netplan apply
Чтобы увидеть подробную информацию об ошибках, запустите Netplan в режиме отладки:
sudo netplan -d generate
4.Проверим на этот раз какие у нас сетевые интерфейсы и что с их настройками:
Отступление:
В ядре Linux по умолчанию выключена возможность пропускать через себя транзитный трафик:
Команда sysctl net.ipv4.ip_forward даст вам вывод:
net.ipv4.ip_forward = 0 - значит транзит трафика запрещен. Чтобы изменить это необходимо выставить параметр в 1.
Для этого на Ubuntu20_04_1 в файле /etc/sysctl.conf необходимо добавить строку и сохранить изменения:
net.ipv4.ip_forward = 1
Чтобы зафиксировать изменения в sysctl необходимо выполнить следующую команду:
sudo sysctl -p /etc/sysctl.conf
Ну и для контроля рестарт сетевого сервиса:
sudo systemctl restart systemd-networkd
Эти настройки необходимы для того чтобы Ubuntu20_04_1 могла обрабатывать транзитный трафик из внешних сетей к внутренним сетям LAN1, LAN2
5.Приступаем к настройке Centos 7:
У Centos 7, согласно схемы, всего один интерфейс, подключенный к сети LAN1:
В данной версии центы у нас по умолчанию работает NetworkManager (NM). Т.е. можем производить настройки как с помощью псевдографики (nmtui), так и используя инструментарий ifupdown, редактируя файлы-скрипты в директории /etc/sysconfig/network-scripts. Для данного дистрибутива настроим базовые сетевые настройки вторым способом.
Для начала посмотрим какие у нас сетевые интерфейсы и что с их настройками:
Перейдите в директорию /etc/sysconfig/network-scripts:
cd /etc/sysconfig/network-scripts
и с помощью grep найдите файл конфигурации сети интерфейса enp0s3:
ls -la | grep enp0s3
отредактируйте файл, обязательные параметры IPADDR, NETMASK, GATEWAY, ONBOOT:
sudo nano ifcfg-enp0s3
Внимание: По умолчанию в Centos 7 нет всеми любимого редактора Nano, поэтому вам придется отредактировать файл с помощью vi (необходимо уметь им базово пользоваться!). Если вы не сталкивались с vi/vim советую прерваться и посмотреть короткое видео Кирилла Семаева на эту тему:
LPIC 103.8 Текстовый редактор Vi
Остальные параметры должны подтянуться автоматом. Должно получиться примерно так:
Применяем настройки:
ifdown ifcfg-enp0s3 && ifup ifcfg-enp0s3 #рестартуем интерфейс
ip -br -c a #смотрим что у нас сетевыми интерфейсами и что с их настройками
Должно быть так:
6.Приступаем к настройке Centos 9_1:
В VirtualBox включаем два интерфейса: первый смотрит в сторону LAN1, второй в сторону LAN2. Для настройки будем использовать утилиту nmcli.
Начиная с CentOS 8 по умолчанию существует два варианта управления сетью с постоянным эффектом: nmcli (cli от NetworkManager) и nmtui (псевдографика от NetworkManager). Мы для разнообразия будем использовать nmcli. После того как в VB подключены два интерфейса внутренней сети вывод nmcli будет выглядеть следующим образом:
Необходимо определить режим работы интерфейса, сконфигурировать и включить:
По итогу вывод nmcli должен стать таким:
Взглянем на то применились ли настройки привычной нам командой ip:
Следующим этапом проверьте, что на Centos9_1 запущен ssh сервер и создайте в Mobaxterm/Putty подключение по ssh через SSH Gateway:
Разберемся со вторым интерфейсом enp0s8, подключенным к LAN2:
nmcli оперирует не только таким понятием как “connection”, но и “device”. Если вылезают ошибки необходимо сделать рестарт интерфейса таким образом:
Проверяем таблицу интерфейсов:
По схеме на Centos9_1 интерфейсе LAN2 будет работать DHCP сервер.
Нам потребуется выпустить машину в Интернет для того чтобы скачать и установить. Так как на Ubuntu20_04_1 (Router1) у нас еще не настроен NAT (рассматривается во второй степени курса), нам придется временно отключить интерфейсы enp0s3 и enp0s8 и в настройках VB временно добавить третий интерфейс типа NAT для прямого доступа в Интернет.
Выключите машину и перейдите в настройки:
Включаем машину, переходим в консоль управления VB и выполняем следующие манипуляции:
Следующим этапом, после того как мы обеспечили для CentOS9_1 L3 связность в сеть Интернет, необходимо настроить DNS клиента. Отредактируйте файл /etc/resolv.conf добавив строку nameserver 8.8.8.8
после этого проверьте, что машина способна резолвить имена в IP адреса:
Установим и настроим на Centos9_1 машине DHCP сервер и делегируем ему раздавать IP в сети LAN2:
sudo yum install dhcp-server.x86_64
Если пакет встал корректно, то можете выключить машину и вернуть конфигурацию с адаптерами в исходное состояние: Адаптеры 1/2 нужно вернуть галочку обратно, а Адаптеру 3 галочку выключить!
Включите машину и проверьте, что enp0s3 и enp0s8 активны и вся маршрутная информация на месте.
Теперь вы опять можете работать через Putty/Mobaxterm!
Перейдем в директорию конфигурационного файла:
cd /etc/dhcp/
ls -la
Нас интересует файл dhcpd.conf. Внесем конфигурацию вида:
subnet 192.168.1.0 netmask 255.255.255.0 {
range 192.168.1.2 192.168.1.5;
option domain-name-servers 8.8.8.8, 1.1.1.1;
#option domain-name "internal.example.org";
option routers 192.168.1.1;
#option broadcast-address 10.5.5.31;
default-lease-time 600;
max-lease-time 7200;
}
Ставим dhcpd в автозагрузку и включаем демон:
Специально внес в конфигурацию ошибку! Дело в том, что если в листинге возникла ошибка демон не стартанет. Необходимо последовать совету и вывести информацию из подсистемы журналирования journalctl -xeu dhcpd.service и нам конкретизируют проблему:
Если взглянуть на листинг, то после ключевого слова options я забыл указать domain-name-servers и еще была забыта запятая между IP адресами:
Поправляем и пробуем стартовать DHCP сервер: systemctl start dhcpd. Если bash скушал и ничего не выдал на консоль, то конфигурация не содержит синтаксических ошибок. Проверяем статус DHCP сервиса:
Наступило время включения машины Ubuntu20_04_2 и настройки с помощью netplan получения IP адреса от DHCP сервера, предварительно настроенного на CentOS9.
Взглянем на состояние сети:
А тут уже все каким-то магическим образом настроено!
Дело в том, что в netplan, по умолчанию, на активном интерфейсе запускается dhcp клиент.
Очевидно, что Centos9_1 видит Ubuntu20_04_2 и наоборот. Но что можно сказать про наличие L3 связности между Ubuntu20_04_1(Router1) и Ubuntu20_04_2?
Давайте проверим:
Обратите внимание на команду ip r g, это сокращение от ip route get. Это одна из самых популярных команд поиска маршрута для указанного адреса.
Первое, что необходимо сделать это разрешить транзитный трафик как мы это делали для Ubuntu20_04_1 (см. выше). Речь про net.ipv4.ip_forward = 1.
Трассировка от Ubuntu20_04_2 к Ubuntu20_04_1 показывает, что CentOS9_1 (192.168.1.1) отправляет ICMP дальше, но в ответ no replay.
А на Ubuntu20_04_1 картина еще интереснее. Трасса к адресу Ubuntu20_04_2 ведет через default маршрут (наш домашний роутер). Дело в том, что когда в таблице маршрутизации нет конкретного маршрута, то пакет отправляется в маршрут умолчанию. Эта картина нас наводит на мысль, что для того чтобы попасть в сеть LAN2 (192.168.1.0/24) нам необходим статический маршрут (обратный). Давайте настроим его на Ubuntu20_04_1:
Не забываем применить настройки: sudo netplan apply
Проверим как теперь обстоит дело:
На этом базовая настройка сети главного офиса завершается. На данном этапе у вас работает внутренняя связность между машинами Ubuntu20_04_1, Centos9_1, Centos7, Ubuntu20_04_2.
Вы попробовали как работает инструмент netplan, nmcli, ifcfg скрипты. На Centos9 вы запустили DHCP сервер. Разобрались с тем, что если узлы не находятся в одной сети, то требуется статическая маршрутизация.
На следующем шаге вас ждет сложный, интересный и полезный материал:
- Вы разберетесь с тем, что такое netfilter/iptables и как ядро Linux обрабатывает трафик (это основа для работы любого сетевого устройства);
- Научитесь создавать безопасную основу для эксплуатации сетевых сервисов, размещаемых в DMZ (и что такое DMZ в том числе) и конечных станций пользователей;
- Изучите виды и разновидности NAT, способы настройки и применения. Реализуете двойной NAT для решения проблемы пересечения адресных пространств;
- Научитесь мониторить события информационной безопасности путем логирования нелегитимных попыток доступа к защищаемым узлам;
- Коснетесь того, что такое bash скрипт и как его запускать с помощью cron (планировщик в Linux);
- Научитесь объединять распределенную инфраструктуру с помощью VPN и продвинутых техник маршрутизации;
- Изучите основы IPSec на базе модуля StrongSwan и обезопасите VPN взаимодействие.
Следующий выпуск будет на тему: "Продвинутая настройка безопасности в Linux. NAT (погружение). VPN GRE/IPsec"
Пишите комментарии, делитесь с друзьями, ставьте лайки - этим вы помогаете материалу быть виднее!