Пошаговое руководство по настройке сетевой инфраструктуры, сервисов и безопасности
Данное руководство содержит последовательный план развертывания сети, состоящей из провайдера (ISP), головного офиса (HQ) и филиала (BR). Настройка включает в себя конфигурирование маршрутизаторов, коммутатора, серверов, развертывание Active Directory, сетевых служб (NFS, NTP), автоматизацию через Ansible и публикацию веб-ресурсов через Docker и Nginx.
Часть 1. Базовая настройка хостов (Имена и Сеть)
Первым делом необходимо задать корректные имена хостов (hostname), чтобы ориентироваться в инфраструктуре и обеспечить правильную работу доменных служб.
1.1. Настройка ISP
Задаем имя хоста для сервера провайдера:
Bash
hostnamectl set-hostname isp; exec bash
(Опционально) Для сохранения имени после перезагрузки в некоторых дистрибутивах проверяем конфигурационный файл:
Bash
nano /etc/sysconfig/network
# Меняем значение на: HOSTNAME=isp
1.2. Настройка маршрутизаторов HQ-RTR и BR-RTR
Переходим в режим конфигурации сетевого оборудования (EcoRouter) и задаем системные имена и доменную зону:
- На HQ-RTR:Plaintextecorouter>enable
ecorouter#configure terminal
hq-rtr(config)#hostname hq-rtr
hq-rtr(config)#ip domain-name au-team.irpo
hq-rtr(config)#write memory - На BR-RTR:Выполняем аналогичные команды, но адаптируем под филиал:Plaintextecorouter>enable
ecorouter#configure terminal
br-rtr(config)#hostname br-rtr
br-rtr(config)#ip domain-name au-team.irpo
br-rtr(config)#write memory
1.3. Настройка серверов HQ-SRV и BR-SRV
Задаем полные доменные имена (FQDN) для будущих серверов приложений и контроллеров домена:
- На HQ-SRV:Bashhostnamectl set-hostname hq-srv.au-team.irpo; exec bash
nano /etc/sysconfig/network # Указываем HOSTNAME=hq-srv.au-team.irpo - На BR-SRV:Bashhostnamectl set-hostname br-srv.au-team.irpo; exec bash
nano /etc/sysconfig/network # Указываем HOSTNAME=br-srv.au-team.irpo
Примечание: На следующих этапах IP-адреса могут быть скорректированы в соответствии с вашей индивидуальной топологией (заданием).
Часть 2. Сетевые интерфейсы, VLAN, Маршрутизация и NAT
Построение сетевой логики: создание виртуальных сетей (VLAN), привязка их к физическим портам через сервисные экземпляры (service-instance), настройка статической маршрутизации и NAT для выхода в интернет.
2.1. Конфигурация интерфейсов на HQ-RTR
Создаем виртуальные интерфейсы (VLAN) для сегментации сети штаб-квартиры:
Plaintext
hq-rtr(config)#interface vl100
hq-rtr(config-if)#description "VLAN 100"
hq-rtr(config-if)#ip address 192.168.100.1/27
hq-rtr(config-if)#exit
hq-rtr(config)#interface vl200
hq-rtr(config-if)#description "VLAN 200"
hq-rtr(config-if)#ip address 192.168.200.1/24
hq-rtr(config-if)#exit
hq-rtr(config)#interface vl999
hq-rtr(config-if)#description "VLAN 999"
hq-rtr(config-if)#ip address 192.168.99.1/29
hq-rtr(config-if)#exit
Привязываем созданные VLAN к физическому магистральному порту te1 с тегированием dot1q:
Plaintext
hq-rtr(config)#port te1
hq-rtr(config-port)#service-instance te1/vl100
hq-rtr(config-service-instance)#encapsulation dot1q 100 exact
hq-rtr(config-service-instance)#rewrite pop 1
hq-rtr(config-service-instance)#connect ip interface vl100
hq-rtr(config-service-instance)#exit
hq-rtr(config-port)#service-instance te1/vl200
hq-rtr(config-service-instance)#encapsulation dot1q 200 exact
hq-rtr(config-service-instance)#rewrite pop 1
hq-rtr(config-service-instance)#connect ip interface vl200
hq-rtr(config-service-instance)#exit
hq-rtr(config-port)#service-instance te1/vl999
hq-rtr(config-service-instance)#encapsulation dot1q 999 exact
hq-rtr(config-service-instance)#rewrite pop 1
hq-rtr(config-service-instance)#connect ip interface vl999
hq-rtr(config-service-instance)#exit
hq-rtr(config-port)#exit
hq-rtr(config)#write memory
2.2. Конфигурация Open vSwitch (SW)
Настройка виртуального или физического Linux-коммутатора для пропуска тегированного трафика от HQ-RTR.
Сначала подготавливаем сетевые интерфейсы в текстовом редакторе:
Bash
nano /etc/network/interfaces
Вносим структуру (активация интерфейсов без IP):
Plaintext
auto eth0
iface eth0 inet static
auto eth1
iface eth1 inet static
auto eth2
iface eth2 inet static
Затем создаем виртуальный мост и распределяем порты (eth0 — транк, остальные — в режиме access с тегом):
Bash
ovs-vsctl add-br sw
ovs-vsctl add-port sw eth0
ovs-vsctl set port eth0 trunks=100,200,999
ovs-vsctl add-port sw eth1
ovs-vsctl set port eth1 tag=100
ovs-vsctl add-port sw eth2
ovs-vsctl set port eth2 tag=200
ovs-vsctl show
Важно: После настройки коммутатора обязательно отправляем его в перезагрузку:
Bash
reboot
2.3. Конфигурация интерфейсов на BR-RTR
В филиале сеть устроена проще — используется один нетегированный (untagged) сегмент:
Plaintext
br-rtr(config)#interface int1
br-rtr(config-if)#description "BR-Net"
br-rtr(config-if)#ip address 192.168.0.1/28
br-rtr(config-if)#exit
br-rtr(config)#port te1
br-rtr(config-port)#service-instance te1/int1
br-rtr(config-service-instance)#encapsulation untagged
br-rtr(config-service-instance)#connect ip interface int1
br-rtr(config-service-instance)#exit
br-rtr(config-port)#exit
br-rtr(config)#write memory
2.4. Настройка сетевых адресов на серверах (HQ-SRV и BR-SRV)
Настройку рекомендуется выполнять через удобный псевдографический интерфейс:
Bash
nmtui
Выставляем следующие параметры для сетевых карт:
- HQ-SRV: IP 192.168.100.2/27, Шлюз 192.168.100.1, DNS 77.88.8.8. Перезапускаем интерфейс (выкл/вкл).
- BR-SRV: IP 192.168.0.2/28, Шлюз 192.168.0.1, DNS 77.88.8.8. Перезапускаем интерфейс (выкл/вкл).
2.5. Настройка роутинга и NAT на стороне ISP
Настраиваем адресацию на стороне провайдера (в сторону HQ — 172.16.1.1/28, в сторону BR — 172.16.2.1/28). Для обеспечения интернетом внутренних сетей настраиваем маскарадинг (MASQUERADE).
Bash
# Обновляем репозитории и ставим утилиту iptables
apt-get update && apt-get install -y iptables
# Включаем NAT для внешнего интерфейса (замените ens5 на ваш актуальный WAN-интерфейс)
iptables -t nat -A POSTROUTING -o ens5 -j MASQUERADE
# Сохраняем правила iptables и добавляем в автозапуск [cite: 4]
iptables-save >> /etc/sysconfig/iptables
systemctl enable --now iptables
2.6. Подключение маршрутизаторов к ISP и статические маршруты
Настраиваем внешние ("белые") стыковочные интерфейсы на маршрутизаторах и указываем дефолтный шлюз (0.0.0.0/0) в сторону ISP.
- На HQ-RTR:Plaintexthq-rtr(config)#interface isp
hq-rtr(config-if)#description "ISP"
hq-rtr(config-if)#ip address 172.16.1.2/28
hq-rtr(config-if)#exit
hq-rtr(config)#ip route 0.0.0.0/0 172.16.1.1
hq-rtr(config)#port te0
hq-rtr(config-port)#service-instance te0/isp
hq-rtr(config-service-instance)#encapsulation untagged
hq-rtr(config-service-instance)#connect ip interface isp
hq-rtr(config-service-instance)#exit
hq-rtr(config-port)#exit
hq-rtr(config)#write memory - На BR-RTR:Plaintextbr-rtr(config)#interface isp
br-rtr(config-if)#description "ISP"
br-rtr(config-if)#ip address 172.16.2.2/28
br-rtr(config-if)#exit
br-rtr(config)#ip route 0.0.0.0/0 172.16.2.1
br-rtr(config)#port te0
br-rtr(config-port)#service-instance te0/isp
br-rtr(config-service-instance)#encapsulation untagged
br-rtr(config-service-instance)#connect ip interface isp
br-rtr(config-service-instance)#exit
br-rtr(config-port)#exit
br-rtr(config)#write memory
2.7. Динамический NAT (Overload) на маршрутизаторах
Чтобы устройства из локальных подсетей могли выходить наружу, определяем внутренние (inside) и внешние (outside) зоны NAT.
- На HQ-RTR:Plaintexthq-rtr(config)#interface isp
hq-rtr(config-if)#ip nat outside
hq-rtr(config-if)#exit
hq-rtr(config)#interface vl100
hq-rtr(config-if)#ip nat inside
hq-rtr(config-if)#exit
hq-rtr(config)#interface vl200
hq-rtr(config-if)#ip nat inside
hq-rtr(config-if)#exit
hq-rtr(config)#interface vl999
hq-rtr(config-if)#ip nat inside
hq-rtr(config-if)#exit
# Создаем пулы адресов для трансляции
hq-rtr(config)#ip nat pool VLAN100 192.168.100.1-192.168.100.30
hq-rtr(config)#ip nat pool VLAN200 192.168.200.1-192.168.200.254
hq-rtr(config)#ip nat pool VLAN999 192.168.99.1-192.168.99.6
# Включаем трансляцию с перегрузкой (PAT) через интерфейс isp
hq-rtr(config)#ip nat source dynamic inside-to-outside pool VLAN100 overload interface isp
hq-rtr(config)#ip nat source dynamic inside-to-outside pool VLAN200 overload interface isp
hq-rtr(config)#ip nat source dynamic inside-to-outside pool VLAN999 overload interface isp
hq-rtr(config)#write memory - На BR-RTR:Plaintextbr-rtr(config)#interface isp
br-rtr(config-if)#ip nat outside
br-rtr(config-if)#exit
br-rtr(config)#interface int1
br-rtr(config-if)#ip nat inside
br-rtr(config-if)#exit
hq-rtr(config)#ip nat pool BR-Net 192.168.0.1-192.168.0.14
br-rtr(config)#ip nat source dynamic inside-to-outside pool BR-Net overload interface isp
br-rtr(config)#exit
br-rtr#write memory
Проверка: На данном этапе с серверов и роутеров должен успешно проходить пинг до внешних ресурсов (интернета).
2.8. Настройка DHCP-сервера на HQ-RTR
Настраиваем автоматическую раздачу IP-адресов для клиентов в VLAN 200.
Plaintext
hq-rtr(config)#ip pool VLAN200
hq-rtr(config-dhcp-server-pool)#range 192.168.200.2-192.168.200.254
hq-rtr(config-dhcp-server-pool)#dhcp-server 1
hq-rtr(config-dhcp-server)#pool VLAN200 1
# Основные сетевые параметры пула
hq-rtr(config-dhcp-server-pool)#mask 24
hq-rtr(config-dhcp-server-pool)#gateway 192.168.200.1
hq-rtr(config-dhcp-server-pool)#dns 192.168.100.2
hq-rtr(config-dhcp-server-pool)#domain-name au-team.irpo
hq-rtr(config-dhcp-server-pool)#exit
hq-rtr(config-dhcp-server)#exit
# Привязываем службу DHCP к интерфейсу vl200
hq-rtr(config)#interface vl200
hq-rtr(config-if)#dhcp-server 1
hq-rtr(config-if)#exit
hq-rtr(config)#write memory
Проверка на клиенте: Перезапустите сетевой интерфейс на клиентской машине и проверьте полученный адрес командой ip -c a.
Часть 3. Защищенные каналы связи (GRE-туннель) и Динамическая маршрутизация (OSPF)
Объединяем HQ и BR защищенным виртуальным туннелем поверх сети провайдера и запускаем протокол динамической маршрутизации для обмена внутренними маршрутами.
3.1. Создание GRE-туннеля
- На HQ-RTR:Plaintexthq-rtr(config)#interface tunnel.0
hq-rtr(config-if-tunnel)#description "GRE"
hq-rtr(config-if-tunnel)#ip address 10.10.10.1/30
hq-rtr(config-if-tunnel)#ip tunnel 172.16.1.2 172.16.2.2 mode gre
hq-rtr(config-if-tunnel)#exit
hq-rtr(config)#write memory - На BR-RTR:Plaintextbr-rtr(config)#interface tunnel.0
br-rtr(config-if-tunnel)#description "GRE"
br-rtr(config-if-tunnel)#ip address 10.10.10.2/30
br-rtr(config-if-tunnel)#ip tunnel 172.16.2.2 172.16.1.2 mode gre
br-rtr(config-if-tunnel)#exit
br-rtr(config)#write memory
Интерфейс tunnel.0 должен перейти в статус UP.
3.2. Настройка OSPF с аутентификацией
Объявляем внутренние подсети в OSPF (Area 0) и защищаем стык паролем. Используем passive-interface default, чтобы не слать служебные OSPF-пакеты в пользовательские сети.
- На HQ-RTR:Plaintexthq-rtr(config)#router ospf 1
hq-rtr(config-router)#ospf router-id 10.10.10.1
hq-rtr(config-router)#passive-interface default
hq-rtr(config-router)#no passive-interface tunnel.0
hq-rtr(config-router)#network 10.10.10.0/30 area 0
hq-rtr(config-router)#network 192.168.100.0/27 area 0
hq-rtr(config-router)#network 192.168.200.0/24 area 0
hq-rtr(config-router)#network 192.168.99.0/29 area 0
hq-rtr(config-router)#exit
# Включение MD5/простой аутентификации на интерфейсе туннеля
hq-rtr(config)#interface tunnel.0
hq-rtr(config-if-tunnel)#ip ospf authentication
hq-rtr(config-if-tunnel)#ip ospf authentication-key P@ssw0rd
hq-rtr(config-if-tunnel)#exit
hq-rtr(config)#write memory - На BR-RTR:Plaintextbr-rtr(config)#router ospf 1
br-rtr(config-router)#ospf router-id 10.10.10.2
br-rtr(config-router)#passive-interface default
br-rtr(config-router)#no passive-interface tunnel.0
br-rtr(config-router)#network 192.168.0.0/28 area 0
br-rtr(config-router)#network 10.10.10.0/30 area 0
br-rtr(config-router)#exit
br-rtr(config)#interface tunnel.0
br-rtr(config-if-tunnel)#ip ospf authentication
br-rtr(config-if-tunnel)#ip ospf authentication-key P@ssw0rd
br-rtr(config-if-tunnel)#exit
br-rtr(config)#write memory
Часть 4. Системная безопасность, Пользователи и Синхронизация времени (NTP)
4.1. Локальные администраторы на роутерах
Создаем единую учетную запись управления для сетевых устройств:
Plaintext
# Выполнить на HQ-RTR и BR-RTR
username net_admin
password P@ssw0rd
role admin
exit
write memory
4.2. Безопасность SSH и локальные пользователи на Linux-серверах
Создаем сервисного пользователя sshuser с UID 2026, добавляем его в группу администраторов (wheel) и разрешаем sudo без пароля.
Bash
# Выполнить на HQ-SRV и BR-SRV
useradd sshuser –u 2026
usermod -aG wheel sshuser
echo "sshuser ALL=(ALL:ALL) NOPASSWD: ALL" >> /etc/sudoers
Ужесточаем правила подключения по SSH:
Bash
# Редактируем конфигурационный файл SSH демона
nano /etc/openssh/sshd_config
Приводим к виду / изменяем строки:
Plaintext
Port 2026
AllowUsers sshuser
MaxAuthTries 2
Banner /etc/openssh/banner
Создаем баннер безопасности и перезапускаем службу:
Bash
echo "Authorized access only" > /etc/openssh/banner
systemctl restart sshd
4.3. Настройка точного времени (NTP / Chrony)
Синхронизация критически важна для работы Active Directory и логов.
- На ISP (Сервер времени):Bashnano /etc/chrony.conf
Добавляем строки, чтобы ISP брал время из внешнего мира и доверял сам себе как источнику:Plaintextserver ntp0.ntp-servers.net iburst prefer minstratum 4
local stratum 5
allow 0.0.0.0/0
Bashsystemctl restart chronyd - На сетевом оборудовании (HQ-RTR и BR-RTR):Plaintext# Сначала выставляем часовой пояс
hq-rtr(config)#ntp timezone utc+3
hq-rtr(config)#write memory
# Указываем адрес NTP-сервера (ISP)
# На HQ-RTR:
ntp server 172.16.1.1
# На BR-RTR:
ntp server 172.16.2.1 - На Linux-нодах (HQ-SRV, BR-SRV, HQ-CLI):Сначала выставляем единую временную зону:Bashtimedatectl set-timezone Europe/Moscow
Конфигурируем chrony:Bashnano /etc/chrony.conf
# Прописываем адрес роутера/провайдера своего сегмента:
# Для HQ: server 172.16.1.1 iburst
# Для BR: server 172.16.2.1 iburst
systemctl restart chronyd
chronyc sources -v # Проверяем успешность синхронизации
Часть 5. Инфраструктурные сервисы (Active Directory, Samba, NFS)
Развертывание службы каталогов (AD DC) на стороне филиала и сетевого хранилища в головном офисе. 1
5.1.
Подготовка Samba Active Directory Domain Controller (на BR-SRV)
Bash
apt-get update && apt-get install -y task-samba-dc
rm -rf /etc/samba/smb.conf
# Запуск интерактивного мастера развертывания домена
samba-tool domain provision
# !!! Пропускаем все настройки по умолчанию, кроме пункта DNS:
# Указываем DNS сервер головного офиса: 192.168.100.2
Настраиваем авторизацию Kerberos:
Bash
nano /etc/krb5.conf
Редактируем блоки:
Plaintext
[realms]
AU-TEAM.IRPO = {
default_domain = au-team.irpo
}
[domain_realm]
.au-team.irpo = AU-TEAM.IRPO
au-team.irpo = AU-TEAM.IRPO
Активируем службу, правим DNS локально на заглушку и выпускаем первый тикет билета Kerberos:
Bash
systemctl enable --now samba
nano /etc/resolv.conf # Выставляем: nameserver 127.0.0.1
# Получаем доменный токен администратора
kinit Administrator@AU-TEAM.IRPO
Создаем структуру пользователей и групп внутри домена:
Bash
samba-tool group add hq
samba-tool user add hquser1 P@ssw0rd # Повторить для пользователей 1-5
samba-tool user setexpiry hquser1 --noexpiry # Отменяем истечение пароля
samba-tool group addmembers hq hquser1 # Добавляем пользователей в группу
samba-tool group listmembers hq # Проверка состава группы
5.2. Ввод клиента HQ-CLI в домен
На клиентской машине переводим интерфейс с DHCP на статику (для стабильности доменных запросов):
- IP: 192.168.200.2/24, Шлюз: 192.168.200.1, DNS: 192.168.0.2 (Контроллер домена BR-SRV).
- Обязательно переподключаем сетевой интерфейс!
Проверяем доступность домена:
Bash
host au-team.irpo # Должно вернуть 192.168.0.2 [cite: 12]
Устанавливаем клиентские пакеты интеграции с AD:
Bash
apt-get update && apt-get install -y task-auth-ad-sssd
После чего вводим машину в домен через графический/консольный "Центр управления системой" и отправляем её в перезагрузку.
Для связывания доменных привилегий с локальной группой безопасности wheel (SUDO) на клиенте:
Bash
apt-get install -y libnss-role
roleadd hq wheel
control libnss-role enabled # Включаем модуль (статус должен быть enabled)
Добавляем права на запуск конкретных утилит доменным пользователям в файле /etc/sudoers:
Plaintext
Cmnd_Alias SHELLCMD = /bin/cat, /bin/grep, /usr/bin/id
WHEEL_USERS ALL=(ALL:ALL) SHELLCMD
Проверка: Перезайти в систему под доменной учетной записью hquser1 и проверить работу разрешенных команд через sudo.
5.3. Отказоустойчивое хранилище (RAID-0) и NFS (на HQ-SRV)
Сборка дискового массива и организация сетевой папки для клиентов. 2
Bash
apt-get update && apt-get install -y mdadm
lsblk # Смотрим имена подключенных пустых дисков (например, sdb и sdc)
# Очищаем суперблоки и собираем RAID-0 (Striping) из двух дисков
mdadm --zero-superblock --force /dev/sdb /dev/sdc
mdadm --create --verbose /dev/md0 --level=0 --raid-devices=2 /dev/sdb /dev/sdc
# Сохраняем конфигурацию массива
mdadm --detail --scan --verbose | tee -a /etc/mdadm.conf
# Создаем файловую систему и монтируем ее перманентно
mkfs.ext4 /dev/md0
mkdir /raid
nano /etc/fstab
# Добавляем строчку (разделяя параметры клавишей TAB):
# /dev/md0 /raid ext4 defaults 0 0
mount -av # Монтируем всё, что указано в fstab
df -h # Проверяем доступный объем
Разворачиваем NFS-сервер поверх RAID:
Bash
apt-get install -y nfs-server nfs-utils
mkdir /raid/nfs
chmod 777 /raid/nfs
nano /etc/exports
# Разрешаем доступ на чтение и запись только для подсети клиентов (VLAN 200)
# /raid/nfs 192.168.200.0/24(rw,no_root_squash)
exportfs -arv # Применяем конфигурацию экспорта папок
systemctl enable --now nfs-server
На стороне клиента (HQ-CLI):
Bash
apt-get update && apt-get install -y nfs-utils nfs-clients
mkdir /mnt/nfs
chmod 777 /mnt/nfs
nano /etc/fstab
# Прописываем точку монтирования к серверу головного офиса:
# 192.168.100.2:/raid/nfs /mnt/nfs nfs defaults 0 0
mount -av
df -h
Проверка: Создайте файл на клиенте (touch /mnt/nfs/test.txt) и проверьте его наличие на сервере (ls -l /raid/nfs).
Часть 6. Автоматизация (Ansible), Контейнеризация (Docker) и Веб-сервисы
6.1. Настройка Ansible на BR-SRV
Устанавливаем систему управления конфигурациями и зависимости для работы с сетевым оборудованием cisco-like. 5
Bash
apt-get update && apt-get install -y ansible sshpass
nano /etc/ansible/hosts
Заполняем инвентарь (базу управляемых хостов):
Plaintext
HQ-SRV ansible_host=192.168.100.2 ansible_user=sshuser ansible_password=P@ssw0rd ansible_port=2026
HQ-CLI ansible_host=192.168.200.2 ansible_user=user ansible_password=student
HQ-RTR ansible_host=10.10.10.1 ansible_user=net_admin ansible_password=P@ssw0rd ansible_connection=network_cli ansible_network_os=ios
BR-RTR ansible_host=192.168.0.1 ansible_user=net_admin ansible_password=P@ssw0rd ansible_connection=network_cli ansible_network_os=ios
Конфигурируем сам Ansible:
Bash
nano /etc/ansible/ansible.cfg
Plaintext
[defaults]
inventory = /etc/ansible/hosts
host_key_checking = False
Загружаем необходимые сетевые коллекции и модули авторизации:
Bash
ansible-galaxy collection install ansible.netcommon
ansible-galaxy collection install cisco.ios
apt-get install python3-module-pip
pip3 install ansible-pylibssh
Важно: На роутерах (HQ-RTR, BR-RTR) временно или постоянно отключаем строгую проверку безопасности командной строкой: security none.
Bash
# Проверка связи со всеми нодами (все ответы должны быть успешными/зелеными)
ansible -m ping all
6.2. Развертывание Docker-стека (на BR-SRV)
Установка Docker и запуск контейнеров с веб-приложением и СУБД MariaDB из локальных архивов (офлайн-режим). 6
Bash
apt-get install -y docker-engine docker-compose-v2
systemctl enable --now docker.service
# Монтируем ISO-образ с ресурсами
mount /dev/sr0 /mnt/
# Импортируем готовые образы в Docker
docker load < /mnt/docker/site_latest.tar
docker load < /mnt/docker/mariadb_latest.tar
docker image ls # Проверка импорта
Создаем конфигурацию стека compose.yaml:
Bash
nano compose.yaml
YAML
services:
database:
container_name: db
[cite_start]image: mariadb:10.11 [cite: 17]
restart: always
ports:
- "3306:3306"
environment:
MARIADB_DATABASE: "testdb"
MARIADB_USER: "testc"
MARIADB_PASSWORD: "P@ssw0rd"
MARIADB_ROOT_PASSWORD: "toor"
app:
container_name: testapp
image: site:latest
restart: always
ports:
- "8080:8000"
environment:
DB_TYPE: "maria"
DB_HOST: "192.168.0.2"
DB_PORT: "3306"
DB_NAME: "testdb"
DB_USER: "testc"
DB_PASS: "P@ssw0rd"
depends_on:
- database
Запуск Docker-композиции в фоновом режиме (-d):
Bash
docker compose up -d
docker compose ps # Проверка статуса запущенных контейнеров
Проверка: Веб-приложение станет доступно внутри локальной сети по адресу 192.168.0.2:8080.
6.3. APACHE
Развертывание классического LAMP-сервера (на HQ-SRV) 7
Bash
apt-get install -y lamp-server
mount /dev/sr0 /mnt/ # Если еще не примонтирован
# Копируем исходный код сайта в корень веб-сервера Apache
cp /mnt/web/index.php /var/www/html
cp /mnt/web/logo.png /var/www/html
# Конфигурируем подключение к СУБД в коде сайта
nano /var/www/html/index.php
# Правим переменные подключения:
# $servername = "localhost";
# $username = "webc";
# $password = "P@ssw0rd";
# $dbname = "webdb";
systemctl enable --now mariadb
Инициализируем базу данных MariaDB:
Bash
mariadb –u root
Внутри консоли СУБД выполняем sql-запросы:
SQL
CREATE DATABASE webdb; [cite: 19]
CREATE USER 'webc'@'localhost' IDENTIFIED BY 'P@ssw0rd'; [cite: 20]
GRANT ALL PRIVILEGES ON webdb.* TO 'webc'@'localhost' WITH GRANT OPTION; [cite: 21]
EXIT; [cite: 22]
Импортируем готовую схему данных (дамп) и запускаем веб-сервер:
Bash
mariadb –u webc –p –D webdb < /mnt/web/dump.sql
systemctl enable --now httpd2
Проверка: Проверяем локальный доступ к сайту через браузер по IP 192.168.100.2.
Часть 7. Публикация сервисов наружу (Проброс портов и Reverse Proxy)
Окончательный этап: проброс портов (Destination NAT) на пограничных роутерах до серверов приложений и настройка Nginx в качестве единой точки входа для внешних клиентов. 8
7.1. Статический NAT на роутерах
Пробрасываем трафик, приходящий на внешние адреса роутеров (порты 8080 и 2026), на внутренние сервера приложений.
- На HQ-RTR:Plaintexthq-rtr(config)#ip nat source static tcp 192.168.100.2 80 172.16.1.2 8080
hq-rtr(config)#ip nat source static tcp 192.168.100.2 2026 172.16.1.2 2026
hq-rtr(config)#write memory - На BR-RTR:Plaintextbr-rtr(config)#ip nat source static tcp 192.168.0.2 8080 172.16.2.2 8080
br-rtr(config)#ip nat source static tcp 192.168.0.2 2026 172.16.2.2 2026
br-rtr(config)#write memory
7.2. Конфигурация Nginx в качестве реверс-прокси (на ISP)
Клиенты будут обращаться по доменным именам к ISP, а тот перенаправит их на соответствующие роутеры. 9
Bash
apt-get install -y nginx
nano /etc/nginx/sites-available.d/default.conf
Прописываем конфигурацию виртуальных хостов (server), распределяя запросы по заголовкам Host:
Nginx
server {
listen 80;
server_name web.au-team.irpo; [cite: 23]
location / {
proxy_pass http://172.16.1.2:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme; [cite: 24]
}
}
server {
listen 80;
server_name docker.au-team.irpo;
location / {
proxy_pass http://172.16.2.2:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme; [cite: 25]
}
}
Активируем конфигурационный файл через символическую ссылку, проверяем синтаксис и запускаем веб-сервер:
Bash
ln -s /etc/nginx/sites-available.d/default.conf /etc/nginx/sites-enabled.d/
nginx -t
Убеждаемся, что синтаксис Nginx в порядке (syntax is ok)
systemctl enable --now nginx
Финальная проверка работоспособности всей инфраструктуры
apt-get install -y apache2-htpasswd
Средствами утилиты htpasswd создать пользователя WEB и добавить информацию о нём в файл /etc/nginx/.htpasswd, задав пароль P@ssw0rd:
htpasswd –c /etc/nginx/.htpasswd WEB
Добавить web-based аутентификацию для доступа к сайту web.au-team.irpo в конфигурационный файл /etc/nginx/sites-available.d/default.conf:
nano /etc/nginx/sites-available.d/default.conf
server {
listen 80;
server_name web.au-team. irpo;
location / {
proxy_pass http://172.16.1.2:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
auth_basic “Restricted area”;
auth_basic_user_file /etc/nginx/.htpasswd;
}
}
server {
listen 80;
server_name docker.au-team. irpo;
location / {
proxy_pass http://172.16.2.2:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
Проверить наличие ошибок в конфигурационных файлах: nginx -t
Systemctl restart nginx
HQ-CLI
Проверяем возможность доступа до веб ресурса с браузера на клиенте по адресу web.au-team.irpo/ :
Имя пользователя: WEB
Пароль: P@ssw0rd
Установка яндекс браузера:
apt-get install -y yandex-browser-stable
С внешнего клиента пробуем открыть в браузере ресурсы по их доменным именам:
- http://web.au-team.irpo/ — должен открыть сайт LAMP-сервера головного офиса.
- http://docker.au-team.irpo/ — должен открыть сайт из Docker-контейнера филиала.
HQ-RTR:
Включить протокол IKE:
hq-rtr(config)#crypto-ipsec ike enable
hq-rtr(config)#
Настроить профили IPsec:
для создания туннеля IPsec используется протокол IKE (Internet Key Exchange);
есть две фазы построения IPsec туннеля: IKE фаза 1 и IKE фаза 2;
hq-rtr(config)#crypto-ipsec profile CIPROFILE ike-v2
hq-rtr(config-ipsec-ikev2)#mode tunnel
hq-rtr(config-ipsec-ikev2)#
IKE фаза 1:
на IKE этапе 1 два узла договариваются о протоколах шифрования, аутентификации, хеширования и других протоколах, которые они хотят использовать, а также о некоторых других необходимых параметрах;
на этом этапе устанавливается сеанс ISAKMP (Internet Security Association and Key Management Protocol);
это также называется туннелем ISAKMP или туннелем первой фазы IKE;
туннель IKE фазы 1 используется только для управляющего трафика.
hq-rtr(config-ipsec-ikev2)#ike-phase1
hq-rtr(config-ipsec-ikev2-ph1)#proposal aes256-sha256-modp2048
hq-rtr(config-ipsec-ikev2-ph1)#auth pre-shared-key P@ssw0rd
hq-rtr(config-ipsec-ikev2-ph1)#exit
hq-rtr(config-ipsec-ikev2)#
IKE фаза 2:
этот туннель используется как безопасный метод для организации второго туннеля, называемого туннелем IKE фазы 2 или туннелем IPsec;
второй туннель предназначен уже для непосредственной передачи пользовательских данных а также для управляющих данных;
после завершения фазы 2 IKE появится туннель фазы 2 IKE (или туннель IPsec), который можно использовать для защиты пользовательских данных.
hq-rtr(config-ipsec-ikev2)#ike-phase2
hq-rtr(config-ipsec-ikev2-ph2)#protocol esp
hq-rtr(config-ipsec-ikev2-ph2)#proposal aes256-sha256
hq-rtr(config-ipsec-ikev2-ph2)#local-ts 172.16.1.2
hq-rtr(config-ipsec-ikev2-ph2)#remote-ts 172.16.2.2
hq-rtr(config-ipsec-ikev2-ph2)#exit
hq-rtr(config-ipsec-ikev2)#exit
hq-rtr(config)#
Задать крипто-карту:
необходимо указать, к какому пиру следует применять соответствующий профиль IPsec
hq-rtr(config)#crypto-map CMAP 10
hq-rtr(config-crypto-map)#match peer 172.16.2.2
hq-rtr(config-crypto-map)#set crypto-ipsec profile CIPROFILE
hq-rtr(config-crypto-map)#exit
hq-rtr(config)#
Задать карты фильтрации:
для каждого маршрутизатора необходимо вычленить исходящий трафик который нужно зашифровать и входящий, который нужно дешифровать;
исходящий (из локальной сети в туннель) трафик фильтруется по адресам локальной и удалённой подсети;
фильтруется любой тип трафика;
к фильтр-карте привязана криптографическая карта crypto-map, которая, в свою очередь, ссылается на профиль crypto-ipsec;
трафик шифруется в соответствии с параметрами указанными в профиле IPsec и отправляется в туннель.
для туннеля используется одна карта фильтрации, которая последовательно обрабатывает исходящий и входящий трафик, и оканчивается разрешающим правилом для прочего трафика:
hq-rtr(config)#filter-map ipv4 FMAP 5
hq-rtr(config-filter-map-ipv4)#match gre host 172.16.1.2 host 172.16.2.2
hq-rtr(config-filter-map-ipv4)#set crypto-map CMAP peer 172.16.2.2
hq-rtr(config-filter-map-ipv4)#exit
hq-rtr(config)#
hq-rtr(config)#filter-map ipv4 FMAP 10
hq-rtr(config-filter-map-ipv4)#match udp host 172.16.2.2 eq 4500 host 172.16.1.2 eq 4500
hq-rtr(config-filter-map-ipv4)#set crypto-map CMAP peer 172.16.2.2
hq-rtr(config-filter-map-ipv4)#exit
hq-rtr(config)#
hq-rtr(config)#filter-map ipv4 FMAP 15
hq-rtr(config-filter-map-ipv4)#match any any any
hq-rtr(config-filter-map-ipv4)#set accept
hq-rtr(config-filter-map-ipv4)#exit
hq-rtr(config)#
Применить фильтр-карты к необходимым L3-интерфейсам во входящем направлении:
hq-rtr(config)#interface isp
hq-rtr(config-if)#set filter-map in FMAP 10
hq-rtr(config-if)#exit
hq-rtr(config)#
hq-rtr(config)#interface tunnel.0
hq-rtr(config-if-tunnel)#set filter-map in FMAP 10
hq-rtr(config-if-tunnel)#exit
hq-rtr(config)#
hq-rtr(config)#write memory
Building configuration...
hq-rtr(config)#
P.S.
Для шифрования туннеля используется протокол IKEv2, для которого NAT traversal включён по умолчанию.
BR-RTR:
Аналогично HQ-RTR, но зеркально:
br-rtr(config)#crypto-ipsec ike enable
br-rtr(config)#
br-rtr(config)#crypto-ipsec profile CIPROFILE ike-v2
br-rtr(config-ipsec-ikev2)#mode tunnel
br-rtr(config-ipsec-ikev2)#ike-phase1
br-rtr(config-ipsec-ikev2-ph1)#proposal aes256-sha256-modp2048
br-rtr(config-ipsec-ikev2-ph1)#auth pre-shared-key P@ssw0rd
br-rtr(config-ipsec-ikev2-ph1)#exit
br-rtr(config-ipsec-ikev2)#
br-rtr(config-ipsec-ikev2)#ike-phase2
br-rtr(config-ipsec-ikev2-ph2)#protocol esp
br-rtr(config-ipsec-ikev2-ph2)#proposal aes256-sha256
br-rtr(config-ipsec-ikev2-ph2)#local-ts 172.16.2.2
br-rtr(config-ipsec-ikev2-ph2)#remote-ts 172.16.1.2
br-rtr(config-ipsec-ikev2-ph2)#exit
br-rtr(config-ipsec-ikev2)#exit
br-rtr(config)#
br-rtr(config)#crypto-map CMAP 10
br-rtr(config-crypto-map)#match peer 172.16.1.2
br-rtr(config-crypto-map)#set crypto-ipsec profile CIPROFILE
br-rtr(config-crypto-map)#exit
br-rtr(config)#
br-rtr(config)#filter-map ipv4 FMAP 5
br-rtr(config-filter-map-ipv4)#match gre host 172.16.2.2 host 172.16.1.2
br-rtr(config-filter-map-ipv4)#set crypto-map CMAP peer 172.16.1.2
br-rtr(config-filter-map-ipv4)#exit
br-rtr(config)#
br-rtr(config)#filter-map ipv4 FMAP 10
br-rtr(config-filter-map-ipv4)#match udp host 172.16.1.2 eq 4500 host 172.16.2.2 eq 4500
br-rtr(config-filter-map-ipv4)#set crypto-map CMAP peer 172.16.1.2
br-rtr(config-filter-map-ipv4)#exit
br-rtr(config)#
br-rtr(config)#filter-map ipv4 FMAP 15
br-rtr(config-filter-map-ipv4)#match any any any
br-rtr(config-filter-map-ipv4)#set accept
br-rtr(config-filter-map-ipv4)#exit
br-rtr(config)#
br-rtr(config)#interface isp
br-rtr(config-if)#set filter-map in FMAP 10
br-rtr(config-if)#exit
br-rtr(config)#
br-rtr(config)#interface tunnel.0
br-rtr(config-if-tunnel)#set filter-map in FMAP 10
br-rtr(config-if-tunnel)#exit
br-rtr(config)#
br-rtr(config)#write memory
Building configuration...
br-rtr(config)#
HQ-SRV:
Установить необходимые пакеты:
apt-get update && apt-get install -y cups cups-pdf
Включить и добавить в автозагрузку службу cups:
systemctl enable --now cups
Включить общий доступ к принтеру на сервере и разрешить печатать из любой сети:
cupsctl --share-printers --remote-any
Поскольку в домене SambaDC нет DNS записи ссылающейся на необходимое имя, а на HQ-CLI в качестве DNS-сервера задан адрес именно контроллера домена, поэтому необходимо добавить записи в файл /etc/hosts на виртуальной машине HQ-CLI:
или же используя утилиту samba-tool добавить необходимые записи на DNS-сервере BR-SRV;
172.16.1.1 web.au-team.irpo web
172.16.2.1 docker.au-team.irpo docker
192.168.100.2 hq-srv.au-team.irpo hq-srv
Затем подключить виртуальный принтер как принтер по умолчанию
На HQ-SRV результат печати
ls -l /var/spool/cups/