Общие сведения о системе РЕД ОС
РЕД ОС — российская многопользовательская, многозадачная операционная система общего назначения для серверов и рабочих станций, предоставляющая универсальную среду для использования прикладного программного обеспечения. Она создана на основе ведущих мировых технологий с открытым исходным кодом, глубоко доработана отечественными инженерами и полностью независима от зарубежных инфраструктур поддержки.
Система обладает высоким уровнем встроенной защиты информации, проходя регулярные аудиторские проверки на отсутствие скрытых закладок и недекларированных возможностей. Платформа сертифицирована ФСТЭК России по 4 уровню доверия, что делает ее идеальным выбором для развертывания в медицинских учреждениях, финансовых структурах, силовых ведомствах и крупных промышленных предприятиях.
Благодаря модульной архитектуре, РЕД ОС легко адаптируется под любые корпоративные задачи: от простой офисной печатной машины до сложнейших вычислительных кластеров и баз данных высокой доступности. Система включает в себя полноценную поддержку шифрования по стандартам ГОСТ, встроенные механизмы мандатного контроля доступа и надежные инструменты аудита системных логов.
В отличие от классических дистрибутивов общего назначения, РЕД ОС предлагает широкую экосистему совместимости, в которую входят сотни отечественных программных продуктов: CRM-системы, офисные редакторы, средства криптографии и специализированное банковское ПО.
РЕД ОС 7.3 Муром
Дистрибутив РЕД ОС 7.3 представляет собой надежную LTS-платформу. Он ориентирован на корпоративных пользователей и государственные ведомства. Включает ядра веток 5.15 LTS и 6.1 LTS, современные пакеты совместимости и графические среды MATE и Cinnamon.
Система обладает расширенным пакетом безопасности для предотвращения несанкционированного доступа. Разработчики постоянно выпускают исправления ошибок и уязвимостей, делая данную платформу одной из самых стабильных для развертывания критически важной инфраструктуры.
Пакетная база 7.3 Муром также полностью поддерживает установку российских криптографических модулей КриптоПро CSP для работы с электронными подписями на государственных порталах.
РЕД ОС 8.0
Новейшая версия операционной системы РЕД ОС 8 предлагает современный интерфейс, усовершенствованную подсистему рендеринга Wayland и оптимизированные инструменты виртуализации. Снижено время отклика ядра и повышена стабильность СУБД под высокими нагрузками.
Платформа также включает встроенную поддержку Flatpak и Docker, позволяя развертывать современные контейнеризированные приложения за несколько кликов с высокой степенью изоляции процессов.
Добавлена поддержка современных протоколов удаленного рабочего стола и тонких клиентов для построения эффективных терминальных станций.
Процесс обновления РЕД ОС
Обновление пакетной базы осуществляется с помощью менеджера пакетов dnf. Перед процедурой рекомендуется обновить локальный индекс пакетов:
dnf clean all
dnf makecache
dnf update -y
Для перехода на новые LTS-версии ядра используйте встроенные системные скрипты обновления, которые автоматически пересобирают необходимые модули для сетевых карт и видеоускорителей.
Вы также можете настроить автоматическое скачивание только критических патчей безопасности через службу dnf-automatic.
Программное обеспечение РЕД ОС
Официальные репозитории содержат тысячи прикладных программ: офисные пакеты (LibreOffice, Р7-Офис), графические редакторы (GIMP, Inkscape), базы данных и средства контейнеризации.
Все программы проходят строгую цифровую подпись и проверку безопасности перед добавлением в репозитории РЕД СОФТ.
Системные администраторы могут использовать локальные зеркала репозиториев для снижения расхода внешнего интернет-трафика.
Поддерживаемое оборудование
РЕД ОС поддерживает широкий спектр периферии, включая сетевые карты, сканеры, МФУ и дискретные графические чипы Nvidia. Для установки закрытых драйверов Nvidia выполните:
dnf install akmod-nvidia nvidia-driver -y
Для принтеров используется встроенная служба CUPS, настройку которой можно производить через веб-интерфейс на порту 631.
Поддерживаются популярные российские архитектуры процессоров, включая Эльбрус и Байкал-М.
Графический интерфейс пользователя
Пользователю доступны две основные легковесные графические оболочки — MATE и Cinnamon. Обе среды поддерживают глубокую кастомизацию, горячие клавиши и виджеты мониторинга ресурсов.
Для тонкой настройки тем оформления и иконок вы можете использовать встроенный «Центр управления».
Для терминальных серверов поддерживается оптимизированная среда XFCE, снижающая нагрузку на оперативную память.
Командная строка и терминал
Командный интерпретатор bash позволяет автоматизировать любые процессы администрирования. Основные команды навигации по файловой системе:
cd /etc/sysconfig
ls -la
pwd
Для просмотра вывода системного журнала используйте journalctl -xe.
Вы также можете использовать шелл Zsh с плагином автодополнения для повышения эффективности работы.
Сетевые настройки и безопасность
За сетевую конфигурацию отвечает служба NetworkManager. Управление брандмауэром firewalld производится через CLI:
firewall-cmd --state
firewall-cmd --get-active-zones
Все изменения брандмауэра записывайте с флагом --permanent для сохранения после перезагрузки.
Для глубокого анализа трафика вы можете использовать консольный сниффер tcpdump.
Администрирование пользователей
Для добавления новых пользователей в систему и настройки их прав sudo используйте команды:
useradd -m newuser
passwd newuser
usermod -aG wheel newuser
Файл настроек привилегий расположен по пути /etc/sudoers.
Управление парольными политиками (срок действия, минимальная длина) настраивается в файле /etc/login.defs.
11.1 Подготовка к установке серверной ОС
Установка серверной версии РЕД ОС начинается с подготовки аппаратного обеспечения и разметки дискового пространства. Для серверных платформ критически важно обеспечить отказоустойчивость дисковой подсистемы, поэтому на этапе разметки дисков настоятельно рекомендуется использовать технологию LVM (Logical Volume Manager) или аппаратный/программный RAID-массив.
Рекомендуемая схема разметки диска для сервера:
/boot— не менее 1 ГБ (файловая система ext4) для размещения ядер Linux и файлов загрузчика GRUB./boot/efi— 500 МБ (FAT32) для систем с UEFI./(root) — от 20 ГБ до 50 ГБ (XFS или ext4) под системные файлы./var— основной объем диска (XFS), так как здесь будут располагаться базы данных, логи веб-служб и конфигурации домена.swap— размер равен объему RAM (если RAM < 8 ГБ) или половине объема (если RAM > 8 ГБ).
При выборе пакетов на этапе установки выберите профиль "Минимальная установка" (Minimal Install) для минимизации площади атаки и снижения потребления ресурсов сервера, либо "Сервер" без графического окружения.
11.2 Пошаговая настройка служб
1. ISP
# Имя и часовой пояс
hostnamectl hostname isp.au-team.irpo
timedatectl set-timezone Europe/Moscow
# Маршрутизация пакетов
echo "net.ipv4.ip_forward=1" > /etc/sysctl.conf
sysctl -p
# Сетевые интерфейсы
nmcli connection modify ens33 ipv4.method auto
nmcli connection modify ens34 ipv4.method manual ipv4.addresses 172.16.1.1/28
nmcli connection modify ens35 ipv4.method manual ipv4.addresses 172.16.2.1/28
nmcli connection up ens33
nmcli connection up ens34
nmcli connection up ens35
# NAT и фаервол
dnf install iptables-services -y
systemctl enable --now iptables
iptables -F
iptables -t nat -F
iptables -A FORWARD -s 172.16.0.0/16 -j ACCEPT
iptables -A FORWARD -d 172.16.0.0/16 -j ACCEPT
iptables -t nat -A POSTROUTING -o ens33 -s 172.16.0.0/16 -j MASQUERADE
iptables-save > /etc/sysconfig/iptables
2. HQ-RTR
# Имя и часовой пояс
hostnamectl hostname hq-rtr.au-team.irpo
timedatectl set-timezone Europe/Moscow
# Маршрутизация пакетов
echo "net.ipv4.ip_forward=1" > /etc/sysctl.conf
sysctl -p
# Внешний интерфейс
nmcli connection modify ens33 ipv4.method manual ipv4.addresses 172.16.1.2/28 ipv4.gateway 172.16.1.1 ipv4.dns "192.168.100.10" ipv4.dns-search "au-team.irpo"
nmcli connection up ens33
# VLAN интерфейсы на ens34
nmcli connection add type vlan con-name ens34.vlan100 ifname ens34.100 dev ens34 id 100 ipv4.method manual ipv4.addresses 192.168.100.1/27
nmcli connection add type vlan con-name ens34.vlan200 ifname ens34.200 dev ens34 id 200 ipv4.method manual ipv4.addresses 192.168.200.1/28
nmcli connection add type vlan con-name ens34.vlan999 ifname ens34.999 dev ens34 id 999 ipv4.method manual ipv4.addresses 192.168.99.1/29
nmcli connection up ens34.vlan100
nmcli connection up ens34.vlan200
nmcli connection up ens34.vlan999
# GRE туннель
nmcli connection add type ip-tunnel con-name tun0 ifname tun0 mode gre remote 172.16.2.2 local 172.16.1.2 ipv4.method manual ipv4.addresses 10.10.10.1/30 ip-tunnel.ttl 64
nmcli connection up tun0
# Пользователь net_admin
useradd -m -U -s /bin/bash net_admin
echo "net_admin:P@ssw0rd" | chpasswd
echo "net_admin ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers
# NAT
dnf install iptables-services -y
systemctl enable --now iptables
iptables -F
iptables -t nat -F
iptables -t nat -A POSTROUTING -o ens33 -j MASQUERADE
iptables-save > /etc/sysconfig/iptables
# DHCP Сервер
dnf install dhcp-server -y
cat << 'EOF' > /etc/dhcp/dhcpd.conf
subnet 192.168.200.0 netmask 255.255.255.240 {
range 192.168.200.2 192.168.200.14;
option routers 192.168.200.1;
option domain-name-servers 192.168.100.10;
option domain-name "au-team.irpo";
}
EOF
systemctl enable --now dhcpd
# FRR (OSPF)
dnf install frr -y
sed -i 's/ospfd=no/ospfd=yes/g' /etc/frr/daemons
systemctl enable --now frr
vtysh << 'EOF'
conf t
router ospf
ospf router-id 172.16.1.2
network 192.168.100.0/27 area 0
network 192.168.200.0/28 area 0
network 192.168.99.0/29 area 0
network 10.10.10.0/30 area 0
passive-interface ens33
passive-interface ens34
exit
interface tun0
ip ospf authentication message-digest
ip ospf message-digest-key 1 md5 P@ssw0rd
exit
do wr
exit
EOF
3. BR-RTR
# Имя и часовой пояс
hostnamectl hostname br-rtr.au-team.irpo
timedatectl set-timezone Europe/Moscow
# Маршрутизация пакетов
echo "net.ipv4.ip_forward=1" > /etc/sysctl.conf
sysctl -p
# Сетевые интерфейсы
nmcli connection modify ens33 ipv4.method manual ipv4.addresses 172.16.2.2/28 ipv4.gateway 172.16.2.1 ipv4.dns "192.168.100.10" ipv4.dns-search "au-team.irpo"
nmcli connection modify ens34 ipv4.method manual ipv4.addresses 172.30.100.1/30
nmcli connection up ens33
nmcli connection up ens34
# GRE туннель
nmcli connection add type ip-tunnel con-name tun0 ifname tun0 mode gre remote 172.16.1.2 local 172.16.2.2 ipv4.method manual ipv4.addresses 10.10.10.2/30 ip-tunnel.ttl 64
nmcli connection up tun0
# Пользователь net_admin
useradd -m -U -s /bin/bash net_admin
echo "net_admin:P@ssw0rd" | chpasswd
echo "net_admin ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers
# NAT
dnf install iptables-services -y
systemctl enable --now iptables
iptables -F
iptables -t nat -F
iptables -t nat -A POSTROUTING -o ens33 -j MASQUERADE
iptables-save > /etc/sysconfig/iptables
# FRR (OSPF)
dnf install frr -y
sed -i 's/ospfd=no/ospfd=yes/g' /etc/frr/daemons
systemctl enable --now frr
vtysh << 'EOF'
conf t
router ospf
ospf router-id 172.16.2.2
network 172.30.100.0/30 area 0
network 10.10.10.0/30 area 0
passive-interface ens33
exit
interface tun0
ip ospf authentication message-digest
ip ospf message-digest-key 1 md5 P@ssw0rd
exit
do wr
exit
EOF
4. BR-FW
# Имя и часовой пояс
hostnamectl hostname br-fw.au-team.irpo
timedatectl set-timezone Europe/Moscow
# Маршрутизация пакетов
echo "net.ipv4.ip_forward=1" > /etc/sysctl.conf
sysctl -p
# Сетевые интерфейсы
nmcli connection modify ens33 ipv4.method manual ipv4.addresses 172.30.100.2/30 ipv4.gateway 172.30.100.1 ipv4.dns "192.168.100.10" ipv4.dns-search "au-team.irpo"
nmcli connection modify ens34 ipv4.method manual ipv4.addresses 172.30.200.1/28
nmcli connection up ens33
nmcli connection up ens34
# FRR (OSPF)
dnf install frr -y
sed -i 's/ospfd=no/ospfd=yes/g' /etc/frr/daemons
systemctl enable --now frr
vtysh << 'EOF'
conf t
router ospf
ospf router-id 172.30.100.2
network 172.30.100.0/30 area 0
network 172.30.200.0/28 area 0
passive-interface ens34
exit
do wr
exit
EOF
5. HQ-SRV
# Имя и часовой пояс
hostnamectl hostname hq-srv.au-team.irpo
timedatectl set-timezone Europe/Moscow
# Сетевой интерфейс (VLAN 100)
nmcli connection add type vlan con-name ens33.vlan100 ifname ens33.100 dev ens33 id 100 ipv4.method manual ipv4.addresses 192.168.100.10/27 ipv4.gateway 192.168.100.1 ipv4.dns "127.0.0.1" ipv4.dns-search "au-team.irpo"
nmcli connection up ens33.vlan100
# Пользователь sshuser
useradd -m -U -s /bin/bash -u 2027 sshuser
echo "sshuser:P@ssw0rd" | chpasswd
echo "sshuser ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers
# Настройка SSH
echo "Authorized access only" > /etc/ssh/banner.txt
cat << 'EOF' >> /etc/ssh/sshd_config
Port 2027
AllowUsers sshuser
MaxAuthTries 2
Banner /etc/ssh/banner.txt
EOF
semanage port -a -t ssh_port_t -p tcp 2027 || setenforce 0
systemctl restart sshd
# Настройка DNS (BIND)
dnf install bind bind-utils -y
cat << 'EOF' > /etc/named.conf
options {
listen-on port 53 { any; };
listen-on-v6 port 53 { ::1; };
directory "/var/named";
dump-file "/var/named/data/cache_dump.db";
statistics-file "/var/named/data/named_stats.txt";
memstatistics-file "/var/named/data/named_mem_stats.txt";
secroots-file "/var/named/data/named.secroots";
recursing-file "/var/named/data/named.recursing";
allow-query { any; };
forwarders { 8.8.8.8; 1.1.1.1; };
recursion yes;
dnssec-validation no;
};
zone "au-team.irpo" IN {
type master;
file "/opt/dns/au-team.irpo";
};
zone "100.168.192.in-addr.arpa" IN {
type master;
file "/opt/dns/100.168.192.in-addr.arpa";
};
zone "200.30.172.in-addr.arpa" IN {
type master;
file "/opt/dns/200.30.172.in-addr.arpa";
};
EOF
mkdir -p /opt/dns
cat << 'EOF' > /opt/dns/au-team.irpo
$TTL 3H
@ IN SOA au-team.irpo. root.au-team.irpo. (
0 ; serial
1D ; refresh
1H ; retry
1W ; expire
3H ) ; minimum
@ IN NS hq-srv.au-team.irpo.
hq-rtr IN A 172.16.1.2
br-rtr IN A 172.16.2.2
br-fw IN A 172.30.100.2
hq-srv IN A 192.168.100.10
hq-cli IN A 192.168.200.2
br-srv IN A 172.30.200.10
docker IN A 172.16.1.1
web IN A 172.16.2.1
EOF
cat << 'EOF' > /opt/dns/100.168.192.in-addr.arpa
$TTL 3H
@ IN SOA au-team.irpo. root.au-team.irpo. (
0 ; serial
1D ; refresh
1H ; retry
1W ; expire
3H ) ; minimum
@ IN NS hq-srv.au-team.irpo.
10 IN PTR hq-srv.au-team.irpo.
EOF
cat << 'EOF' > /opt/dns/200.30.172.in-addr.arpa
$TTL 3H
@ IN SOA au-team.irpo. root.au-team.irpo. (
0 ; serial
1D ; refresh
1H ; retry
1W ; expire
3H ) ; minimum
@ IN NS hq-srv.au-team.irpo.
10 IN PTR br-srv.au-team.irpo.
EOF
chown -R named:named /opt/dns/
named-checkconf -z
systemctl enable --now named
6. BR-SRV
# Имя и часовой пояс
hostnamectl hostname br-srv.au-team.irpo
timedatectl set-timezone Europe/Moscow
# Сетевой интерфейс
nmcli connection modify ens33 ipv4.method manual ipv4.addresses 172.30.200.10/28 ipv4.gateway 172.30.200.1 ipv4.dns "192.168.100.10" ipv4.dns-search "au-team.irpo"
nmcli connection up ens33
# Пользователь sshuser
useradd -m -U -s /bin/bash -u 2027 sshuser
echo "sshuser:P@ssw0rd" | chpasswd
echo "sshuser ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers
# Настройка SSH
echo "Authorized access only" > /etc/ssh/banner.txt
cat << 'EOF' >> /etc/ssh/sshd_config
Port 2027
AllowUsers sshuser
MaxAuthTries 2
Banner /etc/ssh/banner.txt
EOF
semanage port -a -t ssh_port_t -p tcp 2027 || setenforce 0
systemctl restart sshd
7. HQ-CLI
# Имя и часовой пояс
hostnamectl hostname hq-cli.au-team.irpo
timedatectl set-timezone Europe/Moscow
# Сетевой интерфейс (VLAN 200 с получением по DHCP)
nmcli connection add type vlan con-name ens33.vlan200 ifname ens33.200 dev ens33 id 200 ipv4.method auto
nmcli connection up ens33.vlan200
11.3 Завершение установки и проверка серверной ОС
После того как все службы настроены, необходимо провести комплексное тестирование всей сетевой инфраструктуры. Начните с проверки получения IP-адреса на клиентской машине HQ-CLI по протоколу DHCP в VLAN 200.
Чек-лист для проверки работоспособности сети:
- Проверка связности между филиалами: отправьте ICMP-запросы по GRE-туннелю с роутера HQ-RTR на BR-RTR.
- Проверка работы DNS: выполните утилиту dig или nslookup на клиенте HQ-CLI для разрешения имени сервера
hq-srv.au-team.irpo. - Аудит безопасности портов: убедитесь с помощью утилиты ss, что службы SSH и DNS слушают только разрешенные интерфейсы и порты:
ss -tulnp | grep -E "2026|53"
После прохождения всех тестов сервер готов к сдаче в промышленную эксплуатацию.
РЕД АДМ
РЕД АДМ позволяет централизованно управлять инфраструктурой на базе ОС Linux и Windows, развертывать домены, управлять учетными записями пользователей и настраивать групповые политики GPO.
Инструмент включает веб-консоль для удаленного администрирования, позволяя развертывать ПО на рабочие станции без прямого физического доступа к ним.
Администраторы могут настраивать шаблоны конфигураций для разных отделов, обеспечивая гибкое разграничение доступов к принтерам и дисковым массивам.
РЕД Виртуализация
РЕД Виртуализация — это отечественное решение для построения отказоустойчивых облачных сред, управления виртуальными машинами, хранологическим размещением данных и сетевыми коммутаторами на базе KVM.
Благодаря поддержке кластеризации вы можете организовывать пулы высокой доступности для СУБД и веб-ресурсов.
Интегрирована поддержка "живой" миграции виртуальных машин между физическими хостами без приостановки выполнения задач пользователями.
СУБД в РЕД ОС
РЕД ОС обеспечивает отличную совместимость с популярными СУБД, включая защищенную версию Ред База Данных, PostgreSQL 15, MariaDB и ClickHouse. Обеспечена высокая скорость транзакций.
Для баз данных высокой емкости рекомендуется использовать файловую систему XFS с оптимизированным размером блока ввода-вывода.
Для крупных ERP-систем поставляется преднастроенная конфигурация PostgreSQL, учитывающая специфику российских учетных систем.
15.1 Общие сведения о веб-серверах и прокси
Веб-сервер — это специализированное серверное программное обеспечение, предназначенное для обработки HTTP/HTTPS запросов от клиентов (веб-браузеров) и выдачи им ответов в виде HTML-страниц, медиафайлов или текстовых данных. В экосистеме РЕД ОС основными веб-серверами являются Nginx и Apache HTTP Server (httpd).
Прокси-сервер выполняет роль посредника между клиентским устройством и конечным веб-ресурсом. Он принимает запросы от пользователей, при необходимости модифицирует их (например, кэширует статические элементы, фильтрует нежелательное содержимое, балансирует нагрузку между серверами бэкенда или маскирует реальный IP-адрес отправителя) и перенаправляет целевому серверу.
Использование веб-серверов в связке с обратными прокси-серверами (Reverse Proxy) позволяет строить высокодоступные, защищенные и легко масштабируемые сетевые архитектуры любой сложности.
15.2 Настройка и оптимизация веб-сервисов
Для достижения максимальной скорости обработки конкурентных запросов веб-серверы требуют тонкой настройки конфигурационных параметров под выделенные системные ресурсы.
Рекомендации по оптимизации Nginx:
- Параметр
worker_processes auto;позволяет автоматически распределить рабочие процессы Nginx по всем доступным ядрам центрального процессора. - Настройка пула соединений
worker_connections 1024;определяет максимальное количество одновременных подключений к одному процессу. - Включение сжатия Gzip снижает объем передаваемого трафика на 50–70%, ускоряя рендеринг у конечного пользователя.
Кэширование статических файлов (картинок, стилей, JS-скриптов) на уровне прокси-сервера позволяет значительно разгрузить бэкенд-серверы приложений и ускорить обработку динамической выдачи.
15.3 Завершение установки и проверка
1. Samba DC и домен
# На HQ-SRV:
systemctl restart named
# На BR-SRV (Установка и первичная инициализация домена):
dnf install -y samba* krb5*
mv /etc/samba/smb.conf /etc/samba/smb.conf.bak
mv /etc/krb5.conf /etc/krb5.conf.bak
cat << 'EOF' > /etc/krb5.conf.d/crypto-policies
[libdefaults]
default_tgs_enctypes = aes256-cts-hmac-sha1-96 aes256-cts-hmac-sha384-192
default_tkt_enctypes = aes256-cts-hmac-sha1-96 aes256-cts-hmac-sha384-192
permitted_enctypes = aes256-cts-hmac-sha1-96 aes256-cts-hmac-sha384-192 camellia256-cts-cmac aes128-cts-hmac-sha1-96 aes128-cts-hmac-sha256-128 camellia128-cts-cmac
EOF
samba-tool domain provision --realm=AU-TEAM.IRPO --domain=AU-TEAM --server-role=dc --dns-backend=NONE --adminpass="P@ssw0rd" --use-rfc2307
cp /var/lib/samba/private/krb5.conf /etc/krb5.conf
cat << 'EOF' > /etc/krb5.conf
[libdefaults]
default_realm = AU-TEAM.IRPO
dns_lookup_realm = false
dns_lookup_kdc = true
[realms]
AU-TEAM.IRPO = {
default_domain = au-team.irpo
kdc = br-srv.au-team.irpo
}
[domain_realm]
br-srv = AU-TEAM.IRPO
EOF
systemctl enable --now samba
# Проверка билета Kerberos и настройка политик паролей:
echo "P@ssw0rd" | kinit administrator@AU-TEAM.IRPO
samba-tool domain passwordsettings set --min-pwd-length=8 --account-lockout-threshold=5
samba-tool domain passwordsettings show
# Создание пользователей и группы:
samba-tool group add hq
for i in {1..5}; do samba-tool user add hquser$i P@ssw0rd; samba-tool group addmembers hq hquser$i; done
samba-tool group listmembers hq
# На HQ-CLI (Ввод в домен и настройка SSSD/sudo):
echo "172.30.200.10 au-team.irpo" >> /etc/hosts
cat << 'EOF' > /etc/krb5.conf
includedir /etc/krb5.conf.d/
[logging]
default = FILE:/var/log/krb5libs.log
kdc = FILE:/var/log/krb5kdc.log
admin_server = FILE:/var/log/kadmind.log
[libdefaults]
dns_lookup_realm = false
ticket_lifetime = 24h
renew_lifetime = 7d
forwardable = true
rdns = false
pkinit_anchors = FILE:/etc/pki/tls/certs/ca-bundle.crt
spake_preauth_groups = edwards25519
dns_canonicalize_hostname = fallback
qualify_shortname = ""
default_ccache_name = KEYRING:persistent:%{uid}
udp_preference_limit = 0
default_realm = AU-TEAM.IRPO
[realms]
AU-TEAM.IRPO = {
kdc = br-srv.au-team.irpo
admin_server = br-srv.au-team.irpo
}
[domain_realm]
.au-team.irpo = AU-TEAM.IRPO
au-team.irpo = AU-TEAM.IRPO
EOF
echo "P@ssw0rd" | realm join -U Administrator AU-TEAM.IRPO
sed -i '/\[domain\/au-team.irpo\]/a ad_server = br-srv.au-team.irpo' /etc/sssd/sssd.conf
systemctl restart sssd
sss_cache -E
echo "%hq@au-team.irpo ALL=(ALL) NOPASSWD: /bin/cat, /bin/grep, /bin/id" >> /etc/sudoers
2. RAID 0 (HQ-SRV)
# Создание разделов на дисках sdb и sdc
echo -e "g\nn\n\n\n\nw" | fdisk /dev/sdb
echo -e "g\nn\n\n\n\nw" | fdisk /dev/sdc
# Сборка массива RAID 0 и форматирование
mdadm --create /dev/md0 --level=0 --raid-device=2 /dev/sdb1 /dev/sdc1
mdadm --detail --scan --verbose >> /etc/mdadm.conf
mkfs.ext4 /dev/md0
# Автомонтирование /raid
mkdir -p /raid
echo "/dev/md0 /raid ext4 defaults 0 0" >> /etc/fstab
systemctl daemon-reload
mount -a
df -h
3. NFS Сервер и Клиент
# На HQ-SRV:
dnf install nfs4-acl-tools exportfs -y
mkdir -p /raid/nfs
chown nobody:nobody /raid/nfs
chmod 777 /raid/nfs
echo "/raid/nfs 192.168.200.0/28(rw)" >> /etc/exports
exportfs -a
systemctl enable --now nfs-server
# На HQ-CLI:
mkdir -p /mnt/nfs
echo "192.168.100.10:/raid/nfs /mnt/nfs nfs auto 0 0" >> /etc/fstab
systemctl daemon-reload
mount -a
df -h
4. Chrony (NTP)
# На ISP:
cat << 'EOF' > /etc/chrony.conf
server ntp1.vniiftri.ru iburst
local stratum 5
allow 0/0
hwtimestamp *
EOF
systemctl restart chronyd
chronyc sources
# На HQ-SRV, HQ-CLI, BR-RTR, BR-SRV:
sed -i 's/^server/#server/' /etc/chrony.conf
echo "server 172.16.1.1 iburst prefer" >> /etc/chrony.conf
systemctl restart chronyd
chronyc sources
5. Ansible (BR-SRV)
# На BR-SRV:
dnf install ansible -y
mkdir -p /etc/ansible
cat << 'EOF' > /etc/ansible/demo.ini
[HQ_SRV]
192.168.100.10 ansible_user=sshuser ansible_port=2027
[HQ_CLI]
192.168.200.2 ansible_user=username
[HQ_RTR]
192.168.100.1 ansible_user=net_admin
[BR_RTR]
172.30.100.1 ansible_user=net_admin
EOF
cat << 'EOF' > /etc/ansible/ansible.cfg
[defaults]
inventory = /etc/ansible/demo.ini
ask_pass = False
host_key_checking = False
interpreter_python = /usr/bin/python
EOF
ssh-keygen -t rsa -N "" -f ~/.ssh/id_rsa
ssh-copy-id -p 2027 sshuser@192.168.100.10
ssh-copy-id username@192.168.200.2
ssh-copy-id net_admin@192.168.100.1
ssh-copy-id net_admin@172.30.100.1
ansible -m ping all
6. Docker (BR-SRV)
# Монтирование ISO и установка Docker
mount /dev/cdrom /mnt
dnf install docker-ce docker-compose -y
systemctl enable --now docker
# Загрузка образов и запуск приложения
docker load < /mnt/docker/site_latest.tar
docker load < /mnt/docker/mariadb_latest.tar
cp /mnt/docker/compose.yml .
docker-compose -f compose.yml up -d
docker ps
7. Веб-приложение LAMP (HQ-SRV)
# Монтирование ISO и установка стека
mount /dev/cdrom /mnt
dnf install mariadb-server httpd php php-mysqlnd php-cli -y
systemctl enable --now mariadb httpd
# База данных
mysql -u root << 'EOF'
CREATE USER 'web'@'localhost' IDENTIFIED BY 'P@ssw0rd';
CREATE DATABASE webdb DEFAULT CHARACTER SET utf8;
GRANT ALL PRIVILEGES ON webdb.* TO 'web'@'localhost';
FLUSH PRIVILEGES;
EOF
mysql -u root webdb < /mnt/web/dump.sql
# Копирование файлов сайта
cp /mnt/web/index.php /var/www/html/
cp /mnt/web/logo.png /var/www/html/
cat << 'EOF' > /var/www/html/index.php
/etc/sysconfig/iptables
# На HQ-RTR:
iptables -t nat -A PREROUTING -p tcp -m tcp -d 172.16.1.2 --dport 8080 -j DNAT --to-destination 192.168.100.10:80
iptables -t nat -A PREROUTING -p tcp -m tcp -d 172.16.1.2 --dport 2027 -j DNAT --to-destination 192.168.100.10:2027
iptables-save > /etc/sysconfig/iptables
9. Яндекс браузер
• Установку браузера отметьте в отчёте.
На HQ-CLI:
Заходим в «Окно настройки РЕДОС», переходим во вкладку «Партнерские приложения» и нажимаем на Яндекс браузер. После загрузки нажимаем на клавишу WIN и выбираем «Другие приложения». Переходим на вторую страницу и запускаем браузер.
Средства разработки
Для программистов доступны компиляторы GCC, Clang, интерпретаторы Python 3, PHP, Node.js, а также популярные средства контроля версий (Git) и сборщики проектов.
Все компиляторы оптимизированы для сборки бинарных файлов под российские процессоры «Эльбрус» и «Байкал».
Поддерживается интеграция со средами разработки Eclipse, VS Code и IntelliJ IDEA.
17.1 Настройка служб (Модуль 3)
1. Импорт пользователей в домен Samba DC (BR-SRV)
# Подключаем диск с доп. материалами
mount /dev/cdrom /mnt
cat /mnt/Users.csv
# Копируем готовый скрипт импорта и даём права на запуск
cp /mnt/import.sh .
chmod +x import.sh
./import.sh
# ВАЖНО:
# Проверяем успешность импорта и авторизацию на машине HQ-CLI:
# Логин: MalachiAlexander@au-team.irpo
# Пароль: P@ssw0rd1
2. Nginx Reverse Proxy (ISP)
# Установка веб-сервера
dnf install nginx -y
systemctl enable --now nginx
# Настройка виртуальных хостов для перенаправления HTTP-запросов
cat << 'EOF' > /etc/nginx/conf.d/proxy.conf
server {
listen 80;
server_name docker.au-team.irpo;
location / {
proxy_pass http://172.16.2.2:8080;
}
}
server {
listen 80;
server_name web.au-team.irpo;
location / {
proxy_pass http://172.16.1.2:8080;
}
}
EOF
systemctl restart nginx
# ВАЖНО:
# Обязательно отключаем SELinux, иначе проксирование выдаст 502 Bad Gateway
sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config
reboot
# Проверка:
# На HQ-CLI открываем docker.au-team.irpo (сайт из Модуля 2)
# и web.au-team.irpo (база сотрудников).
3. Web-based аутентификация HTTP Basic Auth (ISP)
# Создание файла учётных записей и добавление пользователя WEB
dnf install httpd-tools -y
htpasswd -cb /etc/nginx/.htpasswd WEB P@ssw0rd
# Подключение базовой аутентификации только для сайта web.au-team.irpo
cat << 'EOF' > /etc/nginx/conf.d/proxy.conf
server {
listen 80;
server_name docker.au-team.irpo;
location / {
proxy_pass http://172.16.2.2:8080;
}
}
server {
listen 80;
server_name web.au-team.irpo;
location / {
auth_basic "Restricted Content";
auth_basic_user_file "/etc/nginx/.htpasswd";
proxy_pass http://172.16.1.2:8080;
}
}
EOF
nginx -t
systemctl restart nginx
# Проверка:
# При открытии web.au-team.irpo должно появиться окно авторизации. Вводим WEB / P@ssw0rd.
4. Центр сертификации ГОСТ и HTTPS (HQ-SRV -> ISP -> HQ-CLI)
# --- [ HQ-SRV: Развертывание CA и генерация сертификатов ] ---
dnf install openssl-gost-engine -y
openssl-switch-config gost
update-crypto-policies --set GOST-ONLY:GOST
update-crypto-policies --show
# 1. Генерация ключа и самоподписанного корневого сертификата (Root CA)
openssl genpkey -algorithm gost2012_256 -pkeyopt paramset:A -out CA.key
openssl req -new -x509 -md_gost12_256 -days 365 -key CA.key -out CA.crt -subj "/C=RU/ST=Russia/L=Kazan/O=MCK-KTITS/OU=MCK-KTITS CA/CN=MCK KTITS CA Root"
# 2. Ключ для веб-серверов и файл альтернативных имён (SAN)
openssl genpkey -algorithm gost2012_256 -pkeyopt paramset:A -out au-team.irpo.key
cat << 'EOF' > au-team.irpo.ext
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
subjectAltName = @alt_names
[alt_names]
DNS.1 = au-team.irpo
DNS.2 = docker.au-team.irpo
DNS.3 = web.au-team.irpo
IP.1 = 172.16.1.2
IP.2 = 172.16.2.2
EOF
# 3. Выпуск сертификата на 30 дней и сборка цепочки
openssl req -new -md_gost12_256 -key au-team.irpo.key -out au-team.irpo.csr -subj "/C=RU/L=Kazan/O=AU-TEAM Site GOST/CN=*.au-team.irpo"
openssl x509 -req -in au-team.irpo.csr -CA CA.crt -CAkey CA.key -CAcreateserial -out au-team.irpo.crt -days 30 -extfile au-team.irpo.ext
cat au-team.irpo.crt CA.crt > fullchain.crt
# Подготовка к передаче сертификатов
mkdir -p /home/sshuser/certs
cp fullchain.crt au-team.irpo.key CA.crt /home/sshuser/certs/
chmod 755 -R /home/sshuser/certs
# --- [ ISP: Настройка SSL с ГОСТ шифрованием в Nginx ] ---
dnf install openssl-gost-engine -y
openssl-switch-config gost
update-crypto-policies --set GOST-ONLY:GOST
mkdir -p /etc/ssl/site
scp -P 2027 sshuser@172.16.1.2:/home/sshuser/certs/* /etc/ssl/site/
cat << 'EOF' >> /etc/nginx/conf.d/proxy.conf
server {
listen 443 ssl;
server_name docker.au-team.irpo;
ssl_certificate /etc/ssl/site/fullchain.crt;
ssl_certificate_key /etc/ssl/site/au-team.irpo.key;
ssl_ciphers GOST2012-GOST8912-GOST8912:HIGH:MEDIUM;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
location / {
proxy_pass http://172.16.2.2:8080;
}
}
server {
listen 443 ssl;
server_name web.au-team.irpo;
ssl_certificate /etc/ssl/site/fullchain.crt;
ssl_certificate_key /etc/ssl/site/au-team.irpo.key;
ssl_ciphers GOST2012-GOST8912-GOST8912:HIGH:MEDIUM;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
location / {
auth_basic "Restricted Content";
auth_basic_user_file "/etc/nginx/.htpasswd";
proxy_pass http://172.16.1.2:8080;
}
}
EOF
nginx -t
systemctl restart nginx
# --- [ HQ-CLI: Установка КриптоПро и импорт Root CA ] ---
mount /dev/cdrom /mnt
cp -r /mnt/cryptopro/linux-amd64/ .
scp -P 2027 sshuser@192.168.100.10:/home/sshuser/certs/CA.crt /home/username/
chmod +x linux-amd64/*.sh
./linux-amd64/install_gui.sh
# ВАЖНО:
# 1. В установщике КриптоПро выбираем ВСЕ компоненты через Пробел. Лицензию выбираем «Позже».
# 2. Открываем приложение «Инструменты КриптоПро» (двигаем мышкой для ДСЧ).
# 3. Раздел «Сертификаты» -> выбираем хранилище «Доверенные корневые центры сертификации» -> «Установить сертификаты» -> указываем CA.crt.
# 4. В Яндекс.Браузере открываем https://docker.au-team.irpo и https://web.au-team.irpo — статус соединения должен быть зеленым/защищенным (Protect), без ошибок сертификата.
5. Мониторинг утилитой atop (HQ-SRV)
dnf install atop -y
# ВАЖНО: интервал сбора данных 7 минут = 420 секунд
cat << 'EOF' > /etc/sysconfig/atop
CURDAY=`date +%Y%m%d`
LOGPATH=/var/log/atop
BINPATH=/usr/bin
PIDFILE=/var/run/atop.pid
LOGINTERVAL=420
EOF
systemctl daemon-reload
systemctl enable --now atop atopacct
systemctl restart atop
# Проверка:
pgrep -a atop
ls -la /var/log/atop/
# Для просмотра лога: atop -r /var/log/atop/atop_YYYYMMDD (выход — клавиша q)
6. Виртуальный принт-сервер CUPS (HQ-SRV)
# Установка и запуск службы
dnf install cups cups-pdf -y --nogpgcheck
systemctl enable --now cups
# Разрешаем прослушивание всех интерфейсов и доступ для клиентов
sed -i 's/Listen localhost:631/Listen *:631/' /etc/cups/cupsd.conf
sed -i '/ /a \ \ Allow all' /etc/cups/cupsd.conf
sed -i '//a \ \ Allow all' /etc/cups/cupsd.conf
systemctl restart cups
# Создаем виртуальный PDF-принтер
lpadmin -p Virtual_PDF -v cups-pdf:/ -E -m CUPS-PDF_noopt.ppd
lpstat -p
# ВАЖНО (Настройка на HQ-CLI):
# 1. Открываем «Параметры» -> «Принтеры».
# 2. Нажимаем «Разблокировать» (пароль пользователя).
# 3. «Добавить принтер» -> вводим IP HQ-SRV: 192.168.100.10.
# 4. Выбираем найденный Virtual_PDF.
# 5. В свойствах принтера обязательно ставим галочку «Использовать по умолчанию».
7. Ansible сбор информации о хостах (BR-SRV)
mount /dev/cdrom /mnt
cp /mnt/playbook/get_hostname_address.yml /etc/ansible/
# Добавляем хосты в инвентарь demo.ini
cat << 'EOF' >> /etc/ansible/demo.ini
[inventory]
hq-cli ansible_host=192.168.200.2 ansible_user=username
hq-srv ansible_host=192.168.100.10 ansible_port=2027 ansible_user=sshuser
EOF
# Проверяем структуру плейбука (делегирование локально на BR-SRV):
cat << 'EOF' > /etc/ansible/get_hostname_address.yml
- name: Inventory of HQ-SRV and HQ-CLI
hosts: inventory
gather_facts: yes
tasks:
- name: получение данных с хоста
copy:
dest: /etc/ansible/PC-INFO/{{ ansible_hostname }}.yml
content: |
Hostname: {{ ansible_hostname }}
IP_Address: {{ ansible_default_ipv4.address }}
delegate_to: localhost
EOF
mkdir -p /etc/ansible/PC-INFO
cd /etc/ansible
ansible-playbook get_hostname_address.yml -i demo.ini
# Проверка: файлы отчетов должны появиться в папке PC-INFO
ls -la /etc/ansible/PC-INFO
cat /etc/ansible/PC-INFO/hq-cli.yml
cat /etc/ansible/PC-INFO/hq-srv.yml
8. Защита от подбора паролей Fail2ban (HQ-SRV)
dnf install fail2ban -y --nogpgcheck
# ВАЖНО: указываем порт SSH (2027), 3 попытки, бан 60 секунд (1 минута)
cat << 'EOF' > /etc/fail2ban/jail.local
[sshd]
enabled = true
port = 2027
filter = sshd
maxretry = 3
bantime = 60
findtime = 120
EOF
systemctl enable --now fail2ban
systemctl restart fail2ban
# Проверка статуса джейла:
fail2ban-client status sshd
9. Резервное копирование «Кибер Бэкап 18»
# --- [ HQ-SRV: Сервер управления и локальный агент ] ---
useradd -m -U -s /bin/bash irpoadmin
echo "irpoadmin:P@ssw0rd" | chpasswd
mount /dev/cdrom /mnt
cp /mnt/cyberbackup/CyberBackup_18_64-bit.x86_64 .
chmod +x CyberBackup_18_64-bit.x86_64
./CyberBackup_18_64-bit.x86_64
# В мастере установки выбираем:
# 1. Management Server + Agent for Linux
# 2. База данных: Встроенная SQLite
# 3. Порты по умолчанию: 9877 (Web), 7780 (TCP обмен)
# --- [ HQ-CLI: Узел хранения (Storage Node) ] ---
mount /dev/cdrom /mnt
cp /mnt/cyberbackup/CyberBackup_18_64-bit.x86_64 .
chmod +x CyberBackup_18_64-bit.x86_64
./CyberBackup_18_64-bit.x86_64
# В мастере установки выбираем:
# 1. Agent for Linux + Storage Node
# 2. Сервер управления: 192.168.100.10
# 3. Учётная запись для регистрации: root / P@ssw0rd
# Создаем папку под бэкапы на клиенте:
mkdir -p /backup
chmod 777 /backup
# --- [ Настройка через Веб-интерфейс (https://192.168.100.10:9877) ] ---
# Вход под root / P@ssw0rd:
# 1. Лицензия: активируем «Запустить пробную версию на 30 дней».
# 2. Настройки -> Учётные записи:
# - Создать отдел -> имя «irpo».
# - Внутри отдела добавить учётную запись «irpoadmin», назначить роль «Администратор».
# 3. Хранилища резервных копий -> Добавить хранилище:
# - Тип: «Узел хранения».
# - Выбираем узел: hq-cli.au-team.irpo (192.168.200.2).
# - Путь: /backup/.
# - Логин/пароль узла: root / P@ssw0rd.
# 4. Планы -> Защита -> Создать план:
# - Имя плана: «Резервная копия HQ-SRV».
# - Устройство: hq-srv.au-team.irpo.
# - Выбор данных: «Файлы/папки» -> указать каталог «/etc/».
# - Место сохранения: созданный Узел хранения (/backup).
# 5. Нажимаем кнопку воспроизведения («Запустить план») -> выбрать «Полное».
# 6. Проверяем в разделе «Хранилища», что появилась точка восстановления размером ~4.5 МБ.
17.2 Общие сведения о контейнеризации
Контейнеризация — это метод виртуализации на уровне операционной системы, позволяющий запускать изолированные приложения в единой среде (пространстве пользователя) без необходимости развертывания полноценной гостевой ОС. Контейнеры делят одно и то же ядро хостовой операционной системы, что делает их чрезвычайно быстрыми и экономичными с точки зрения потребления диска и оперативной памяти.
В отличие от традиционных виртуальных машин, каждый контейнер содержит в себе только само приложение и все необходимые для его работы зависимости (библиотеки, конфигурационные файлы). Основными инструментами контейнеризации в экосистеме РЕД ОС являются Docker и Podman.
17.3 Среды виртуализации и оркестрации
Гипервизорная виртуализация (KVM/QEMU) позволяет создавать полностью изолированные виртуальные машины с собственными ядрами операционных систем, что критически важно для изоляции несовместимых корпоративных сред или запуска устаревших систем.
Для управления большим числом контейнеров на нескольких серверах используются системы оркестрации, такие как Kubernetes или упрощенные легковесные кластеры. Они обеспечивают автоматическое масштабирование приложений, балансировку сетевых нагрузок, самовосстановление упавших контейнеров и непрерывное обновление ПО без прерывания обслуживания пользователей.
Мониторинг системы
Анализ журналов и логов в реальном времени осуществляется через journalctl. Для мониторинга потребления ресурсов используются утилиты htop, top, iotop и netstat.
Для постоянного логирования параметров сети рекомендуется использовать Prometheus Node Exporter.
Также в состав системы входит утилита sar для накопления и анализа долгосрочной статистики загрузки ресурсов.
Резервное копирование
Защита данных от утери обеспечивается утилитами rsync (синхронизация директорий), tar (архивирование логов), а также возможностью создания снапшотов LVM.
Скрипты инкрементального копирования rsync можно запускать по расписанию через планировщик cron.
Для создания резервных копий баз данных используйте стандартные дамперы СУБД с автоматическим сжатием.
Часто задаваемые вопросы (FAQ)
Сброс паролей пользователей, пересборка меню загрузчика GRUB при повреждениях системных секторов диска, устранение конфликтов библиотек dnf.
Для сброса пароля root перезагрузите сервер, в меню GRUB нажмите 'e', допишите init=/bin/sh в строку параметров ядра, смонтируйте корень в rw и смените пароль.
При ошибках монтирования разделов проверьте целостность файловой системы с помощью утилиты fsck.ext4 или xfs_repair.
21.1 Полная автоматизация развертывания типового филиала
Развертывание инфраструктурного узла филиала на базе РЕД ОС 8 представляет собой комплексную задачу по вводу в эксплуатацию сетевых служб, обеспечению защищенного связывания с центральным офисом и запуску прикладных микросервисов. Автоматизация этого процесса позволяет свести к минимуму человеческий фактор и обеспечить воспроизводимость конфигураций на всех филиальных серверах.
Представленный ниже мастер развертывания (deploy_filial.sh) реализует полный жизненный цикл инициализации сервера РЕД ОС 8.0:
- Сетевая подсистема: активация параметра ядра
net.ipv4.ip_nonlocal_bind, создание виртуального интерфейсаdummy0для изоляции филиальных IP-адресов (172.16.X.10и172.16.100.1NN), настройкаfirewalldи доверенной зоны для корпоративной подсети. - Служба DNS BIND9: авторитативный сервер с отключенной рекурсией, конфигурация SOA, NS и A-записей доменной зоны филиала.
- Межсетевой IPsec VPN (strongSwan): протокол IKEv2 с шифрованием
aes256-sha256-modp2048, конфигурация интерфейса VICI (swanctl.conf) и туннелирование трафика в центральный офис. - Контейнеризация Docker & СУБД: запуск изолированного моста, контейнеров MySQL 8 с постоянным хранилищем и прикладного микросервиса.
- Веб-сервер Nginx & SSL: виртуальные хосты, автоматический редирект на HTTPS, списки контроля доступа (ACL) с ограничением внутренних эндпоинтов для корпоративной подсети.
- Телеметрия и мониторинг: развертывание агентов Prometheus Node Exporter (порт 9100) и cAdvisor (порт 8080) с защитой от внешнего доступа.
- Сетевое хранилище NFSv4: экспорт каталога
/srv/shareс разграничением прав чтения и записи для отчетов.
Быстрый запуск на сервере
Для выполнения автоматического развертывания выполните в терминале РЕД ОС под учетной записью root команду:
curl -s https://sysaltdoc.ru/deploy_filial.sh -o /tmp/deploy.sh && bash /tmp/deploy.sh
Параметры мастера конфигурации
| Параметр | Назначение | Пример значения |
|---|---|---|
| Номер стенда / филиала (X) | Определяет внутреннюю адресацию узла (172.16.X.10, шлюз 172.16.X.249) | 3 (или номер из регламента) |
| Доменная зона филиала | Делегированный домен узла для BIND9 и Nginx | stand03.olimp.gogle.com |
| VPN-шлюз центрального офиса | IP-адрес или FQDN шлюза офиса для IPsec IKEv2 | vpn.olimp.gogle.com |
| IP-адрес офиса (опционально) | Локальный IP-адрес шлюза офиса для /etc/hosts (если FQDN не резолвится по DNS на полигоне) |
10.3.0.161 (или фактический IP офиса) |
| Ключ IPsec (PSK) | Секретный ключ предварительной аутентификации | SuperSecretPSKKey |
| Пароль СУБД MySQL | Пароль учетной записи пользователя techstart | TechStartPassword123! |
| Режим SSL-сертификата | 1 - Let's Encrypt (боевой контур) / 2 - OpenSSL (локальный/автономный стенд) | 2 (автономный режим) |
Полный исходный код скрипта deploy_filial.sh
Текст скрипта можно скопировать нажатием кнопки «Копировать» в правом верхнем углу блока кода:
#!/bin/bash
# ================================================================
# МАСТЕР АВТОМАТИЧЕСКОГО РАЗВЕРТЫВАНИЯ СТЕНДА ФИЛИАЛА (RED OS 8.0)
# Все 6 модулей задания Олимпиады 2026. Оценка: 70/70 баллов.
# ================================================================
# Цвета для вывода
GREEN='\033[0;32m'
BLUE='\033[0;34m'
YELLOW='\033[1;33m'
RED='\033[0;31m'
NC='\033[0m'
clear
echo -e "${BLUE}================================================================${NC}"
echo -e "${BLUE} МАСТЕР НАСТРОЙКИ СТЕНДА ФИЛИАЛА (RED OS / ОЛИМПИАДА) ${NC}"
echo -e "${BLUE}================================================================${NC}\n"
# 1. Номер стенда
read -p "1. Введите номер стенда X (от 1 до 10) [3]: " INPUT_X
X="${INPUT_X:-3}"
NN=$(printf "%02d" "$X")
STAND_NAME="stand${NN}"
# 2. Доменная зона
DEFAULT_DOMAIN="${STAND_NAME}.olimp.gogle.com"
read -p "2. Введите вашу DNS-зону [${DEFAULT_DOMAIN}]: " INPUT_DOMAIN
DOMAIN="${INPUT_DOMAIN:-$DEFAULT_DOMAIN}"
# 3. VPN-шлюз офиса
DEFAULT_GW="vpn.olimp.gogle.com"
read -p "3. Введите VPN-шлюз офиса [${DEFAULT_GW}]: " INPUT_GW
OFFICE_VPN_GW="${INPUT_GW:-$DEFAULT_GW}"
# 3.1 IP-адрес офиса (опционально, на случай отсутствия записи в DNS)
DEFAULT_OFFICE_IP="10.3.0.161"
read -p " IP-адрес офиса (опционально, если нет в DNS) [${DEFAULT_OFFICE_IP}]: " INPUT_OFFICE_IP
OFFICE_IP="${INPUT_OFFICE_IP:-$DEFAULT_OFFICE_IP}"
if [[ "${INPUT_OFFICE_IP}" =~ ^(none|no|-|dns)$ ]]; then
OFFICE_IP=""
fi
# 4. Ключ IPsec (PSK)
DEFAULT_PSK="SuperSecretPSKKey"
read -p "4. Введите ключ IPsec (PSK из карточки) [${DEFAULT_PSK}]: " INPUT_PSK
PSK="${INPUT_PSK:-$DEFAULT_PSK}"
# 5. Пароль для MySQL
DEFAULT_DB_PASS="TechStartPassword123!"
read -p "5. Введите пароль для MySQL [${DEFAULT_DB_PASS}]: " INPUT_DB_PASS
DB_PASS="${INPUT_DB_PASS:-$DEFAULT_DB_PASS}"
# 6. Определение IP
DETECTED_IP=$(curl -s4 --connect-timeout 2 ifconfig.me || curl -s4 --connect-timeout 2 icanhazip.com || ip route get 8.8.8.8 2>/dev/null | awk -F"src " 'NR==1{split($2,a," ");print a[1]}' || echo "10.3.0.160")
read -p "6. Введите публичный IP сервера [${DETECTED_IP}]: " INPUT_PUB
PUB_IP="${INPUT_PUB:-$DETECTED_IP}"
# 7. Выбор режима SSL
echo -e "\nРежим сертификата:"
echo " 1) Боевой в облаке (Let's Encrypt с автопроверкой)"
echo " 2) Локальный тестовый стенд (OpenSSL self-signed)"
read -p "Выберите режим (1 или 2) [2]: " SSL_MODE
SSL_MODE="${SSL_MODE:-2}"
# Сетевые адреса филиала и офиса
BRANCH_INT_IP="172.16.${X}.10"
OFFICE_INT_IP="172.16.${X}.249"
echo -e "\n${YELLOW}---------------- ПРОВЕРКА ВВЕДЕННЫХ ДАННЫХ ----------------${NC}"
echo -e "Имя стенда: ${GREEN}${STAND_NAME}${NC} (X=${X}, NN=${NN})"
echo -e "Делегированная зона:${GREEN}${DOMAIN}${NC}"
echo -e "Публичный IP: ${GREEN}${PUB_IP}${NC}"
echo -e "Внутренний IP: ${GREEN}${BRANCH_INT_IP}${NC}"
echo -e "VPN-шлюз офиса: ${GREEN}${OFFICE_VPN_GW}${NC} (IP: ${OFFICE_IP:-по DNS})"
echo -e "Ключ PSK: ${GREEN}${PSK}${NC}"
echo -e "Пароль к БД: ${GREEN}${DB_PASS}${NC}"
echo -e "Режим SSL: ${GREEN}$( [ "$SSL_MODE" == "1" ] && echo "Let's Encrypt" || echo "OpenSSL (Тест)" )${NC}"
echo -e "${YELLOW}-----------------------------------------------------------${NC}"
read -p "Все параметры верны? Начать развертывание? (y/n) [y]: " CONFIRM
CONFIRM="${CONFIRM:-y}"
if [[ "$CONFIRM" != "y" && "$CONFIRM" != "Y" ]]; then
echo -e "${RED}Развертывание отменено пользователем.${NC}"
exit 0
fi
echo -e "\n${BLUE}>>> [ШАГ 0/6] Базовая подготовка (Сеть, SELinux, Firewalld, Sysctl)...${NC}"
# Фикс запуска Nginx при перезагрузке системы (биндинг до появления IP на интерфейсе)
echo "net.ipv4.ip_nonlocal_bind=1" > /etc/sysctl.d/99-nonlocal-bind.conf
sysctl -p /etc/sysctl.d/99-nonlocal-bind.conf >/dev/null
# Настройка интерфейса dummy0 с внутренними IP филиала
modprobe dummy
echo "dummy" > /etc/modules-load.d/dummy.conf
nmcli connection delete dummy0 2>/dev/null || true
nmcli connection add type dummy ifname dummy0 con-name dummy0 ipv4.addresses "${BRANCH_INT_IP}/24" ipv4.method manual
nmcli connection modify dummy0 +ipv4.addresses "172.16.100.1${NN}/24"
nmcli connection modify dummy0 connection.autoconnect yes
nmcli connection up dummy0
# Имя хоста
hostnamectl set-hostname "${DOMAIN}"
# SELinux
setsebool -P httpd_can_network_connect 1 2>/dev/null || true
# Firewalld: открытие портов и доверенная зона для туннеля 172.16.0.0/16
systemctl enable --now firewalld
firewall-cmd --permanent --zone=public --add-service={ssh,dns,http,https,ipsec}
firewall-cmd --permanent --zone=public --add-port={500/udp,4500/udp}
firewall-cmd --permanent --zone=public --add-protocol=esp
firewall-cmd --permanent --zone=trusted --add-source=172.16.0.0/16
firewall-cmd --reload
echo -e "\n${BLUE}>>> [ШАГ 1/6] Модуль 1. DNS-сервер (BIND)...${NC}"
dnf install -y bind bind-utils
cat <<EOF > /etc/named.conf
options {
listen-on port 53 { any; };
listen-on-v6 port 53 { none; };
directory "/var/named";
dump-file "/var/named/data/cache_dump.db";
statistics-file "/var/named/data/named_stats.txt";
memstatistics-file "/var/named/data/named_mem_stats.txt";
allow-query { any; };
recursion no;
dnssec-validation no;
};
zone "${DOMAIN}" IN {
type master;
file "/var/named/${DOMAIN}.zone";
allow-query { any; };
};
EOF
cat <<EOF > /var/named/${DOMAIN}.zone
\$TTL 300
@ IN SOA ns.${DOMAIN}. admin.${DOMAIN}. (
2026110801 ; Serial
3600 ; Refresh
1800 ; Retry
604800 ; Expire
300 ) ; Minimum TTL
@ IN NS ns.${DOMAIN}.
ns IN A ${PUB_IP}
@ IN A ${PUB_IP}
app IN A ${PUB_IP}
site IN A ${PUB_IP}
www IN A ${BRANCH_INT_IP}
EOF
chown -R root:named /var/named/${DOMAIN}.zone
chmod 640 /var/named/${DOMAIN}.zone
named-checkconf /etc/named.conf
named-checkzone "${DOMAIN}" "/var/named/${DOMAIN}.zone"
systemctl enable --now named
systemctl restart named
echo -e "\n${BLUE}>>> [ШАГ 2/6] Модуль 2. IPsec туннель (strongSwan)...${NC}"
dnf install -y strongswan
# Если указан IP офиса и он отличается от DNS (или не резолвится в DNS), добавляем в /etc/hosts
if [ -n "${OFFICE_IP}" ]; then
if ! getent hosts "${OFFICE_VPN_GW}" >/dev/null 2>&1 || [ -n "${INPUT_OFFICE_IP}" ]; then
echo -e "${YELLOW}[!] Привязка адреса офиса: ${OFFICE_VPN_GW} -> ${OFFICE_IP} (/etc/hosts)...${NC}"
sed -i "/${OFFICE_VPN_GW}/d" /etc/hosts
echo "${OFFICE_IP} ${OFFICE_VPN_GW}" >> /etc/hosts
fi
fi
cat <<EOF > /etc/strongswan/swanctl/swanctl.conf
connections {
office-tunnel {
version = 2
proposals = aes256-sha256-modp2048
local_addrs = %defaultroute
remote_addrs = ${OFFICE_VPN_GW}
local {
auth = psk
id = @${DOMAIN}
}
remote {
auth = psk
id = @${OFFICE_VPN_GW}
}
children {
branch-to-office {
local_ts = ${BRANCH_INT_IP}/32, 172.16.100.1${NN}/32
remote_ts = 172.16.${X}.1/32, ${OFFICE_INT_IP}/32, 172.16.100.249/32
esp_proposals = aes256gcm16-modp2048
dpd_action = restart
start_action = start
close_action = restart
}
}
dpd_delay = 30s
}
}
secrets {
ike-office {
id-1 = @${DOMAIN}
id-2 = @${OFFICE_VPN_GW}
secret = "${PSK}"
}
}
EOF
systemctl enable --now strongswan
swanctl --load-all
swanctl --initiate --child branch-to-office || true
echo -e "\n${BLUE}>>> [ШАГ 3/6] Модуль 3. Docker, MySQL и приложение app...${NC}"
dnf install -y docker-ce docker-compose 2>/dev/null || dnf install -y docker docker-compose
systemctl enable --now docker
mkdir -p /opt/olimp/mysql_data
if [ ! -f /opt/olimp/app/Dockerfile ]; then
mkdir -p /opt/olimp
git clone https://github.com/VadimGarifullin/olimp-app /opt/olimp/app 2>/dev/null || true
fi
cat <<EOF > /opt/olimp/docker-compose.yml
services:
mysql:
image: mysql:8
container_name: mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: RootSecurePassword123!
MYSQL_DATABASE: techstart
MYSQL_USER: techstart
MYSQL_PASSWORD: ${DB_PASS}
volumes:
- /opt/olimp/mysql_data:/var/lib/mysql
- /opt/olimp/init.sql:/docker-entrypoint-initdb.d/init.sql:ro
networks:
- olimp_net
app:
build:
context: /opt/olimp/app
dockerfile: Dockerfile
container_name: app
restart: always
depends_on:
- mysql
ports:
- "127.0.0.1:8000:8000"
environment:
STAND: "${STAND_NAME}"
DB_HOST: "mysql"
DB_PORT: "3306"
DB_NAME: "techstart"
DB_USER: "techstart"
DB_PASSWORD: "${DB_PASS}"
networks:
- olimp_net
networks:
olimp_net:
driver: bridge
EOF
cd /opt/olimp && docker compose up -d --build
echo -e "\n${BLUE}>>> [ШАГ 4/6] Модуль 4. Nginx и HTTPS-сертификация...${NC}"
dnf install -y nginx certbot python3-certbot-nginx openssl
mkdir -p /etc/ssl/olimp /var/www/certbot
USE_OPENSSL=0
if [ "$SSL_MODE" == "1" ]; then
echo -e "${YELLOW}[*] Попытка выпуска Let's Encrypt для ${DOMAIN}...${NC}"
cat <<EOF > /etc/nginx/conf.d/acme.conf
server {
listen 80 default_server;
server_name _;
location /.well-known/acme-challenge/ {
root /var/www/certbot;
}
}
EOF
systemctl enable --now nginx
systemctl reload nginx 2>/dev/null || systemctl restart nginx
if certbot certonly --webroot -w /var/www/certbot -d "${DOMAIN}" --staging --agree-tos --register-unsafely-without-email --non-interactive && \
certbot certonly --webroot -w /var/www/certbot -d "${DOMAIN}" --force-renewal --agree-tos --register-unsafely-without-email --non-interactive; then
echo -e "${GREEN}[+] Сертификат Let's Encrypt успешно получен!${NC}"
SSL_CERT="/etc/letsencrypt/live/${DOMAIN}/fullchain.pem"
SSL_KEY="/etc/letsencrypt/live/${DOMAIN}/privkey.pem"
else
echo -e "${RED}[!] Let's Encrypt не смог подтвердить домен (NXDOMAIN или нет делегирования).${NC}"
echo -e "${YELLOW}[!] Автоматически переключаемся на OpenSSL для бесперебойной работы стенда...${NC}"
USE_OPENSSL=1
fi
rm -f /etc/nginx/conf.d/acme.conf
else
USE_OPENSSL=1
fi
if [ "$USE_OPENSSL" -eq 1 ]; then
echo -e "${GREEN}[+] Генерируем сертификат OpenSSL для ${DOMAIN}...${NC}"
openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
-keyout /etc/ssl/olimp/privkey.pem \
-out /etc/ssl/olimp/fullchain.pem \
-subj "/CN=${DOMAIN}" 2>/dev/null
SSL_CERT="/etc/ssl/olimp/fullchain.pem"
SSL_KEY="/etc/ssl/olimp/privkey.pem"
fi
cat <<EOF > /etc/nginx/conf.d/olimp.conf
# 1. standNN: редирект HTTP -> HTTPS
server {
listen 80;
server_name ${DOMAIN};
location /.well-known/acme-challenge/ {
root /var/www/certbot;
}
location / {
return 301 https://\$host\$request_uri;
}
}
# 1. standNN: HTTPS (доступ к /internal запрещен)
server {
listen 443 ssl;
server_name ${DOMAIN};
ssl_certificate ${SSL_CERT};
ssl_certificate_key ${SSL_KEY};
location /internal {
return 403;
}
location / {
proxy_pass http://127.0.0.1:8000;
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 https;
}
}
# 2. site: только HTTP без редиректа на HTTPS (/internal запрещен 403)
server {
listen 80;
server_name site.${DOMAIN};
location /internal {
return 403;
}
location / {
proxy_pass http://127.0.0.1:8000;
proxy_set_header Host \$host;
proxy_set_header X-Real-IP \$remote_addr;
proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for;
}
}
# 3. www: слушает строго на внутреннем адресе и отдает /internal
server {
listen ${BRANCH_INT_IP}:80;
server_name www.${DOMAIN};
location / {
proxy_pass http://127.0.0.1:8000/internal;
proxy_set_header Host \$host;
proxy_set_header X-Real-IP \$remote_addr;
proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for;
}
location /internal {
proxy_pass http://127.0.0.1:8000/internal;
proxy_set_header Host \$host;
proxy_set_header X-Real-IP \$remote_addr;
proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for;
}
}
EOF
nginx -t
systemctl enable --now nginx
systemctl restart nginx
echo -e "\n${BLUE}>>> [ШАГ 5/6] Модуль 5. Мониторинг (Node Exporter & cAdvisor)...${NC}"
dnf install -y prometheus-node_exporter
cat <<EOF > /etc/systemd/system/node_exporter.service
[Unit]
Description=Node Exporter
After=network.target
[Service]
User=root
ExecStart=/usr/sbin/node_exporter --web.listen-address="0.0.0.0:9100"
Restart=always
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable --now node_exporter
docker rm -f cadvisor 2>/dev/null || true
docker run \
--volume=/:/rootfs:ro \
--volume=/var/run:/var/run:ro \
--volume=/sys:/sys:ro \
--volume=/var/lib/docker/:/var/lib/docker:ro \
--volume=/dev/disk/:/dev/disk:ro \
--publish=${BRANCH_INT_IP}:8080:8080 \
--detach=true \
--name=cadvisor \
--privileged \
--device=/dev/kmsg \
--restart=always \
gcr.io/cadvisor/cadvisor:latest 2>/dev/null || \
docker run \
--volume=/:/rootfs:ro \
--volume=/var/run:/var/run:ro \
--volume=/sys:/sys:ro \
--volume=/var/lib/docker/:/var/lib/docker:ro \
--volume=/dev/disk/:/dev/disk:ro \
--publish=${BRANCH_INT_IP}:8080:8080 \
--detach=true \
--name=cadvisor \
--privileged \
--device=/dev/kmsg \
--restart=always \
cadvisor/cadvisor:latest
echo -e "\n${BLUE}>>> [ШАГ 6/6] Модуль 6. Файловый ресурс NFSv4...${NC}"
dnf install -y nfs-utils
id office 2>/dev/null || (groupadd -g 2000 office && useradd -u 2000 -g 2000 -s /sbin/nologin -M office)
mkdir -p /srv/share/reports
echo "${STAND_NAME}" > /srv/share/stand.txt
chown root:root /srv/share/stand.txt
chmod 644 /srv/share/stand.txt
chown root:root /srv/share
chmod 755 /srv/share
chown office:office /srv/share/reports
chmod 775 /srv/share/reports
cat <<EOF > /etc/exports
/srv/share ${OFFICE_INT_IP}(rw,sync,no_subtree_check,all_squash,anonuid=2000,anongid=2000) 172.16.100.249(rw,sync,no_subtree_check,all_squash,anonuid=2000,anongid=2000) 172.16.0.0/16(rw,sync,no_subtree_check,all_squash,anonuid=2000,anongid=2000)
EOF
exportfs -rav
systemctl enable --now nfs-server
systemctl restart nfs-server
echo -e "\n${GREEN}================================================================${NC}"
echo -e "${GREEN} РАЗВЕРТЫВАНИЕ СТЕНДА УСПЕШНО ЗАВЕРШЕНО! ${NC}"
echo -e "${GREEN}================================================================${NC}\n"
echo -e "Проверка статуса сервисов:"
echo -n "1. Docker (mysql, app, cadvisor): "
docker ps --format '{{.Names}}' | tr '\n' ' ' && echo ""
echo -n "2. IPsec SA: "
swanctl --list-sas | grep -q "ESTABLISHED" && echo -e "${GREEN}ESTABLISHED${NC}" || echo -e "${YELLOW}Ожидание соединения...${NC}"
echo -n "3. DNS local: "
dig @127.0.0.1 ${DOMAIN} SOA +short
echo -n "4. Healthcheck приложения: "
curl -s http://127.0.0.1:8000/health || echo "Ожидание запуска БД..."
echo ""
21.2 Помодульное выполнение
Скрипт из 21.1, разрезанный по модулям задания: один модуль — один блок команд, содержимое один в один. Блок копируется кнопкой «Копировать» и вставляется в терминал сервера под root (sudo -i), после вставки нажмите Enter. Сначала выполните шаг 0 (он спросит параметры стенда), затем модули по порядку.
Шаг 0. Ввод параметров и базовая подготовка
Выполняется первым. Вставьте блок и нажмите Enter: он задаёт те же вопросы, что мастер deploy_filial.sh из 21.1, показывает сводку и просит подтверждение. Ответы сохраняются в /root/olimp.env, поэтому модули ниже можно вставлять в любом новом терминале. Затем — шаг 0 из 21.1: ip_nonlocal_bind, dummy0 с 172.16.X.10 и 172.16.100.1NN, имя хоста, SELinux, firewalld.
# === ШАГ 0. Ввод параметров и базовая подготовка (как в 21.1). Выполнить первым, под root ===
# Вставьте блок целиком и нажмите Enter — он задаст вопросы мастера 21.1
set +H
{
# Цвета для вывода
GREEN='\033[0;32m'
BLUE='\033[0;34m'
YELLOW='\033[1;33m'
RED='\033[0;31m'
NC='\033[0m'
clear
echo -e "${BLUE}================================================================${NC}"
echo -e "${BLUE} МАСТЕР НАСТРОЙКИ СТЕНДА ФИЛИАЛА (RED OS / ОЛИМПИАДА) ${NC}"
echo -e "${BLUE}================================================================${NC}\n"
# 1. Номер стенда
read -p "1. Введите номер стенда X (от 1 до 10) [3]: " INPUT_X
X="${INPUT_X:-3}"
NN=$(printf "%02d" "$X")
STAND_NAME="stand${NN}"
# 2. Доменная зона
DEFAULT_DOMAIN="${STAND_NAME}.olimp.gogle.com"
read -p "2. Введите вашу DNS-зону [${DEFAULT_DOMAIN}]: " INPUT_DOMAIN
DOMAIN="${INPUT_DOMAIN:-$DEFAULT_DOMAIN}"
# 3. VPN-шлюз офиса
DEFAULT_GW="vpn.olimp.gogle.com"
read -p "3. Введите VPN-шлюз офиса [${DEFAULT_GW}]: " INPUT_GW
OFFICE_VPN_GW="${INPUT_GW:-$DEFAULT_GW}"
# 3.1 IP-адрес офиса (опционально, на случай отсутствия записи в DNS)
DEFAULT_OFFICE_IP="10.3.0.161"
read -p " IP-адрес офиса (опционально, если нет в DNS) [${DEFAULT_OFFICE_IP}]: " INPUT_OFFICE_IP
OFFICE_IP="${INPUT_OFFICE_IP:-$DEFAULT_OFFICE_IP}"
if [[ "${INPUT_OFFICE_IP}" =~ ^(none|no|-|dns)$ ]]; then
OFFICE_IP=""
fi
# 4. Ключ IPsec (PSK)
DEFAULT_PSK="SuperSecretPSKKey"
read -p "4. Введите ключ IPsec (PSK из карточки) [${DEFAULT_PSK}]: " INPUT_PSK
PSK="${INPUT_PSK:-$DEFAULT_PSK}"
# 5. Пароль для MySQL
DEFAULT_DB_PASS="TechStartPassword123!"
read -p "5. Введите пароль для MySQL [${DEFAULT_DB_PASS}]: " INPUT_DB_PASS
DB_PASS="${INPUT_DB_PASS:-$DEFAULT_DB_PASS}"
# 6. Определение IP
DETECTED_IP=$(curl -s4 --connect-timeout 2 ifconfig.me || curl -s4 --connect-timeout 2 icanhazip.com || ip route get 8.8.8.8 2>/dev/null | awk -F"src " 'NR==1{split($2,a," ");print a[1]}' || echo "10.3.0.160")
read -p "6. Введите публичный IP сервера [${DETECTED_IP}]: " INPUT_PUB
PUB_IP="${INPUT_PUB:-$DETECTED_IP}"
# 7. Выбор режима SSL
echo -e "\nРежим сертификата:"
echo " 1) Боевой в облаке (Let's Encrypt с автопроверкой)"
echo " 2) Локальный тестовый стенд (OpenSSL self-signed)"
read -p "Выберите режим (1 или 2) [2]: " SSL_MODE
SSL_MODE="${SSL_MODE:-2}"
# Сетевые адреса филиала и офиса
BRANCH_INT_IP="172.16.${X}.10"
OFFICE_INT_IP="172.16.${X}.249"
echo -e "\n${YELLOW}---------------- ПРОВЕРКА ВВЕДЕННЫХ ДАННЫХ ----------------${NC}"
echo -e "Имя стенда: ${GREEN}${STAND_NAME}${NC} (X=${X}, NN=${NN})"
echo -e "Делегированная зона:${GREEN}${DOMAIN}${NC}"
echo -e "Публичный IP: ${GREEN}${PUB_IP}${NC}"
echo -e "Внутренний IP: ${GREEN}${BRANCH_INT_IP}${NC}"
echo -e "VPN-шлюз офиса: ${GREEN}${OFFICE_VPN_GW}${NC} (IP: ${OFFICE_IP:-по DNS})"
echo -e "Ключ PSK: ${GREEN}${PSK}${NC}"
echo -e "Пароль к БД: ${GREEN}${DB_PASS}${NC}"
echo -e "Режим SSL: ${GREEN}$( [ "$SSL_MODE" == "1" ] && echo "Let's Encrypt" || echo "OpenSSL (Тест)" )${NC}"
echo -e "${YELLOW}-----------------------------------------------------------${NC}"
read -p "Все параметры верны? Начать развертывание? (y/n) [y]: " CONFIRM
CONFIRM="${CONFIRM:-y}"
if [[ "$CONFIRM" != "y" && "$CONFIRM" != "Y" ]]; then
echo -e "${RED}Развертывание отменено пользователем.${NC}"
else
# Параметры для модулей 1–6 (их можно вставлять в любом новом терминале)
for v in GREEN BLUE YELLOW RED NC X NN STAND_NAME DOMAIN OFFICE_VPN_GW OFFICE_IP INPUT_OFFICE_IP PSK DB_PASS PUB_IP SSL_MODE BRANCH_INT_IP OFFICE_INT_IP; do printf '%s=%q\n' $v "${!v}"; done > /root/olimp.env
chmod 600 /root/olimp.env
echo -e "\n${BLUE}>>> [ШАГ 0/6] Базовая подготовка (Сеть, SELinux, Firewalld, Sysctl)...${NC}"
# Фикс запуска Nginx при перезагрузке системы (биндинг до появления IP на интерфейсе)
echo "net.ipv4.ip_nonlocal_bind=1" > /etc/sysctl.d/99-nonlocal-bind.conf
sysctl -p /etc/sysctl.d/99-nonlocal-bind.conf >/dev/null
# Настройка интерфейса dummy0 с внутренними IP филиала
modprobe dummy
echo "dummy" > /etc/modules-load.d/dummy.conf
nmcli connection delete dummy0 2>/dev/null || true
nmcli connection add type dummy ifname dummy0 con-name dummy0 ipv4.addresses "${BRANCH_INT_IP}/24" ipv4.method manual
nmcli connection modify dummy0 +ipv4.addresses "172.16.100.1${NN}/24"
nmcli connection modify dummy0 connection.autoconnect yes
nmcli connection up dummy0
# Имя хоста
hostnamectl set-hostname "${DOMAIN}"
# SELinux
setsebool -P httpd_can_network_connect 1 2>/dev/null || true
# Firewalld: открытие портов и доверенная зона для туннеля 172.16.0.0/16
systemctl enable --now firewalld
firewall-cmd --permanent --zone=public --add-service={ssh,dns,http,https,ipsec}
firewall-cmd --permanent --zone=public --add-port={500/udp,4500/udp}
firewall-cmd --permanent --zone=public --add-protocol=esp
firewall-cmd --permanent --zone=trusted --add-source=172.16.0.0/16
firewall-cmd --reload
fi
}
Модуль 1. DNS-сервер (BIND)
Шаг 1/6 скрипта 21.1 без изменений.
# === МОДУЛЬ 1. DNS-сервер (BIND) (как в 21.1) ===
source /root/olimp.env
echo -e "\n${BLUE}>>> [ШАГ 1/6] Модуль 1. DNS-сервер (BIND)...${NC}"
dnf install -y bind bind-utils
cat <<EOF > /etc/named.conf
options {
listen-on port 53 { any; };
listen-on-v6 port 53 { none; };
directory "/var/named";
dump-file "/var/named/data/cache_dump.db";
statistics-file "/var/named/data/named_stats.txt";
memstatistics-file "/var/named/data/named_mem_stats.txt";
allow-query { any; };
recursion no;
dnssec-validation no;
};
zone "${DOMAIN}" IN {
type master;
file "/var/named/${DOMAIN}.zone";
allow-query { any; };
};
EOF
cat <<EOF > /var/named/${DOMAIN}.zone
\$TTL 300
@ IN SOA ns.${DOMAIN}. admin.${DOMAIN}. (
2026110801 ; Serial
3600 ; Refresh
1800 ; Retry
604800 ; Expire
300 ) ; Minimum TTL
@ IN NS ns.${DOMAIN}.
ns IN A ${PUB_IP}
@ IN A ${PUB_IP}
app IN A ${PUB_IP}
site IN A ${PUB_IP}
www IN A ${BRANCH_INT_IP}
EOF
chown -R root:named /var/named/${DOMAIN}.zone
chmod 640 /var/named/${DOMAIN}.zone
named-checkconf /etc/named.conf
named-checkzone "${DOMAIN}" "/var/named/${DOMAIN}.zone"
systemctl enable --now named
systemctl restart named
Модуль 2. IPsec туннель (strongSwan)
Шаг 2/6 скрипта 21.1 без изменений.
# === МОДУЛЬ 2. IPsec туннель (strongSwan) (как в 21.1) ===
source /root/olimp.env
echo -e "\n${BLUE}>>> [ШАГ 2/6] Модуль 2. IPsec туннель (strongSwan)...${NC}"
dnf install -y strongswan
# Если указан IP офиса и он отличается от DNS (или не резолвится в DNS), добавляем в /etc/hosts
if [ -n "${OFFICE_IP}" ]; then
if ! getent hosts "${OFFICE_VPN_GW}" >/dev/null 2>&1 || [ -n "${INPUT_OFFICE_IP}" ]; then
echo -e "${YELLOW}[!] Привязка адреса офиса: ${OFFICE_VPN_GW} -> ${OFFICE_IP} (/etc/hosts)...${NC}"
sed -i "/${OFFICE_VPN_GW}/d" /etc/hosts
echo "${OFFICE_IP} ${OFFICE_VPN_GW}" >> /etc/hosts
fi
fi
cat <<EOF > /etc/strongswan/swanctl/swanctl.conf
connections {
office-tunnel {
version = 2
proposals = aes256-sha256-modp2048
local_addrs = %defaultroute
remote_addrs = ${OFFICE_VPN_GW}
local {
auth = psk
id = @${DOMAIN}
}
remote {
auth = psk
id = @${OFFICE_VPN_GW}
}
children {
branch-to-office {
local_ts = ${BRANCH_INT_IP}/32, 172.16.100.1${NN}/32
remote_ts = 172.16.${X}.1/32, ${OFFICE_INT_IP}/32, 172.16.100.249/32
esp_proposals = aes256gcm16-modp2048
dpd_action = restart
start_action = start
close_action = restart
}
}
dpd_delay = 30s
}
}
secrets {
ike-office {
id-1 = @${DOMAIN}
id-2 = @${OFFICE_VPN_GW}
secret = "${PSK}"
}
}
EOF
systemctl enable --now strongswan
swanctl --load-all
swanctl --initiate --child branch-to-office || true
Модуль 3. Docker, MySQL и приложение app
Шаг 3/6 скрипта 21.1 без изменений.
# === МОДУЛЬ 3. Docker, MySQL и приложение app (как в 21.1) ===
source /root/olimp.env
echo -e "\n${BLUE}>>> [ШАГ 3/6] Модуль 3. Docker, MySQL и приложение app...${NC}"
dnf install -y docker-ce docker-compose 2>/dev/null || dnf install -y docker docker-compose
systemctl enable --now docker
mkdir -p /opt/olimp/mysql_data
if [ ! -f /opt/olimp/app/Dockerfile ]; then
mkdir -p /opt/olimp
git clone https://github.com/VadimGarifullin/olimp-app /opt/olimp/app 2>/dev/null || true
fi
cat <<EOF > /opt/olimp/docker-compose.yml
services:
mysql:
image: mysql:8
container_name: mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: RootSecurePassword123!
MYSQL_DATABASE: techstart
MYSQL_USER: techstart
MYSQL_PASSWORD: ${DB_PASS}
volumes:
- /opt/olimp/mysql_data:/var/lib/mysql
- /opt/olimp/init.sql:/docker-entrypoint-initdb.d/init.sql:ro
networks:
- olimp_net
app:
build:
context: /opt/olimp/app
dockerfile: Dockerfile
container_name: app
restart: always
depends_on:
- mysql
ports:
- "127.0.0.1:8000:8000"
environment:
STAND: "${STAND_NAME}"
DB_HOST: "mysql"
DB_PORT: "3306"
DB_NAME: "techstart"
DB_USER: "techstart"
DB_PASSWORD: "${DB_PASS}"
networks:
- olimp_net
networks:
olimp_net:
driver: bridge
EOF
cd /opt/olimp && docker compose up -d --build
Модуль 4. Nginx и HTTPS-сертификация
Шаг 4/6 скрипта 21.1 без изменений; режим сертификата берётся из ответа в шаге 0.
# === МОДУЛЬ 4. Nginx и HTTPS-сертификация (как в 21.1) ===
source /root/olimp.env
echo -e "\n${BLUE}>>> [ШАГ 4/6] Модуль 4. Nginx и HTTPS-сертификация...${NC}"
dnf install -y nginx certbot python3-certbot-nginx openssl
mkdir -p /etc/ssl/olimp /var/www/certbot
USE_OPENSSL=0
if [ "$SSL_MODE" == "1" ]; then
echo -e "${YELLOW}[*] Попытка выпуска Let's Encrypt для ${DOMAIN}...${NC}"
cat <<EOF > /etc/nginx/conf.d/acme.conf
server {
listen 80 default_server;
server_name _;
location /.well-known/acme-challenge/ {
root /var/www/certbot;
}
}
EOF
systemctl enable --now nginx
systemctl reload nginx 2>/dev/null || systemctl restart nginx
if certbot certonly --webroot -w /var/www/certbot -d "${DOMAIN}" --staging --agree-tos --register-unsafely-without-email --non-interactive && \
certbot certonly --webroot -w /var/www/certbot -d "${DOMAIN}" --force-renewal --agree-tos --register-unsafely-without-email --non-interactive; then
echo -e "${GREEN}[+] Сертификат Let's Encrypt успешно получен!${NC}"
SSL_CERT="/etc/letsencrypt/live/${DOMAIN}/fullchain.pem"
SSL_KEY="/etc/letsencrypt/live/${DOMAIN}/privkey.pem"
else
echo -e "${RED}[!] Let's Encrypt не смог подтвердить домен (NXDOMAIN или нет делегирования).${NC}"
echo -e "${YELLOW}[!] Автоматически переключаемся на OpenSSL для бесперебойной работы стенда...${NC}"
USE_OPENSSL=1
fi
rm -f /etc/nginx/conf.d/acme.conf
else
USE_OPENSSL=1
fi
if [ "$USE_OPENSSL" -eq 1 ]; then
echo -e "${GREEN}[+] Генерируем сертификат OpenSSL для ${DOMAIN}...${NC}"
openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
-keyout /etc/ssl/olimp/privkey.pem \
-out /etc/ssl/olimp/fullchain.pem \
-subj "/CN=${DOMAIN}" 2>/dev/null
SSL_CERT="/etc/ssl/olimp/fullchain.pem"
SSL_KEY="/etc/ssl/olimp/privkey.pem"
fi
cat <<EOF > /etc/nginx/conf.d/olimp.conf
# 1. standNN: редирект HTTP -> HTTPS
server {
listen 80;
server_name ${DOMAIN};
location /.well-known/acme-challenge/ {
root /var/www/certbot;
}
location / {
return 301 https://\$host\$request_uri;
}
}
# 1. standNN: HTTPS (доступ к /internal запрещен)
server {
listen 443 ssl;
server_name ${DOMAIN};
ssl_certificate ${SSL_CERT};
ssl_certificate_key ${SSL_KEY};
location /internal {
return 403;
}
location / {
proxy_pass http://127.0.0.1:8000;
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 https;
}
}
# 2. site: только HTTP без редиректа на HTTPS (/internal запрещен 403)
server {
listen 80;
server_name site.${DOMAIN};
location /internal {
return 403;
}
location / {
proxy_pass http://127.0.0.1:8000;
proxy_set_header Host \$host;
proxy_set_header X-Real-IP \$remote_addr;
proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for;
}
}
# 3. www: слушает строго на внутреннем адресе и отдает /internal
server {
listen ${BRANCH_INT_IP}:80;
server_name www.${DOMAIN};
location / {
proxy_pass http://127.0.0.1:8000/internal;
proxy_set_header Host \$host;
proxy_set_header X-Real-IP \$remote_addr;
proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for;
}
location /internal {
proxy_pass http://127.0.0.1:8000/internal;
proxy_set_header Host \$host;
proxy_set_header X-Real-IP \$remote_addr;
proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for;
}
}
EOF
nginx -t
systemctl enable --now nginx
systemctl restart nginx
Модуль 5. Мониторинг (Node Exporter & cAdvisor)
Шаг 5/6 скрипта 21.1 без изменений.
# === МОДУЛЬ 5. Мониторинг (Node Exporter & cAdvisor) (как в 21.1) ===
source /root/olimp.env
echo -e "\n${BLUE}>>> [ШАГ 5/6] Модуль 5. Мониторинг (Node Exporter & cAdvisor)...${NC}"
dnf install -y prometheus-node_exporter
cat <<EOF > /etc/systemd/system/node_exporter.service
[Unit]
Description=Node Exporter
After=network.target
[Service]
User=root
ExecStart=/usr/sbin/node_exporter --web.listen-address="0.0.0.0:9100"
Restart=always
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable --now node_exporter
docker rm -f cadvisor 2>/dev/null || true
docker run \
--volume=/:/rootfs:ro \
--volume=/var/run:/var/run:ro \
--volume=/sys:/sys:ro \
--volume=/var/lib/docker/:/var/lib/docker:ro \
--volume=/dev/disk/:/dev/disk:ro \
--publish=${BRANCH_INT_IP}:8080:8080 \
--detach=true \
--name=cadvisor \
--privileged \
--device=/dev/kmsg \
--restart=always \
gcr.io/cadvisor/cadvisor:latest 2>/dev/null || \
docker run \
--volume=/:/rootfs:ro \
--volume=/var/run:/var/run:ro \
--volume=/sys:/sys:ro \
--volume=/var/lib/docker/:/var/lib/docker:ro \
--volume=/dev/disk/:/dev/disk:ro \
--publish=${BRANCH_INT_IP}:8080:8080 \
--detach=true \
--name=cadvisor \
--privileged \
--device=/dev/kmsg \
--restart=always \
cadvisor/cadvisor:latest
Модуль 6. Файловый ресурс NFSv4
Шаг 6/6 скрипта 21.1 без изменений, в конце — итоговая проверка служб.
# === МОДУЛЬ 6. Файловый ресурс NFSv4 (как в 21.1) ===
source /root/olimp.env
echo -e "\n${BLUE}>>> [ШАГ 6/6] Модуль 6. Файловый ресурс NFSv4...${NC}"
dnf install -y nfs-utils
id office 2>/dev/null || (groupadd -g 2000 office && useradd -u 2000 -g 2000 -s /sbin/nologin -M office)
mkdir -p /srv/share/reports
echo "${STAND_NAME}" > /srv/share/stand.txt
chown root:root /srv/share/stand.txt
chmod 644 /srv/share/stand.txt
chown root:root /srv/share
chmod 755 /srv/share
chown office:office /srv/share/reports
chmod 775 /srv/share/reports
cat <<EOF > /etc/exports
/srv/share ${OFFICE_INT_IP}(rw,sync,no_subtree_check,all_squash,anonuid=2000,anongid=2000) 172.16.100.249(rw,sync,no_subtree_check,all_squash,anonuid=2000,anongid=2000) 172.16.0.0/16(rw,sync,no_subtree_check,all_squash,anonuid=2000,anongid=2000)
EOF
exportfs -rav
systemctl enable --now nfs-server
systemctl restart nfs-server
echo -e "\n${GREEN}================================================================${NC}"
echo -e "${GREEN} РАЗВЕРТЫВАНИЕ СТЕНДА УСПЕШНО ЗАВЕРШЕНО! ${NC}"
echo -e "${GREEN}================================================================${NC}\n"
echo -e "Проверка статуса сервисов:"
echo -n "1. Docker (mysql, app, cadvisor): "
docker ps --format '{{.Names}}' | tr '\n' ' ' && echo ""
echo -n "2. IPsec SA: "
swanctl --list-sas | grep -q "ESTABLISHED" && echo -e "${GREEN}ESTABLISHED${NC}" || echo -e "${YELLOW}Ожидание соединения...${NC}"
echo -n "3. DNS local: "
dig @127.0.0.1 ${DOMAIN} SOA +short
echo -n "4. Healthcheck приложения: "
curl -s http://127.0.0.1:8000/health || echo "Ожидание запуска БД..."
echo ""
21.3 Валидация и самопроверка служб филиала
После завершения установки и конфигурирования компонентов инфраструктуры филиала необходимо провести комплексную автоматизированную верификацию всех запущенных служб. Для этого разработан скрипт самоконтроля check_filial.sh, проверяющий доступность сервисов, правильность DNS-ответов, состояние IPsec SA, списки контроля доступа Nginx, закрытость внутренних портов снаружи и функционал файлового ресурса NFS.
Быстрый запуск проверки
Скрипт проверки запускается следующей командой (в качестве аргументов передаются публичный IP, внутренний IP и домен филиала):
curl -s https://sysaltdoc.ru/check_filial.sh -o /tmp/check.sh && bash /tmp/check.sh 10.3.0.160 172.16.3.10 stand03.olimp.gogle.com
Матрица контрольных точек
| Компонент | Проверяемый параметр | Ожидаемый результат |
|---|---|---|
| DNS BIND9 | SOA, NS, корневая A-запись, поддомен site | Корректные ответы с публичным IP филиала |
| DNS BIND9 | A-запись www.${DOMAIN} | Внутренний IP-адрес филиала (172.16.X.10) |
| IPsec strongSwan | Команда swanctl --list-sas |
Состояние ассоциации безопасности ESTABLISHED |
| Связность сети | ICMP ping внутреннего интерфейса филиала | 0% packet loss (100% успех) |
| Nginx (HTTP) | Запрос http://${DOMAIN} | HTTP 301 Moved Permanently (редирект на HTTPS) |
| Nginx (HTTPS) | Запрос https://${DOMAIN}/health | HTTP 200 OK с отчетом о статусе БД и сервисов |
| Nginx (ACL) | Запрос https://${DOMAIN}/internal снаружи | HTTP 403 Forbidden (заблокировано ACL) |
| Nginx (site) | Запрос http://site.${DOMAIN} | HTTP 200 OK (без редиректа) |
| Приложение (www) | Запрос http://www.${DOMAIN} из туннеля | HTML со списком сотрудников филиала |
| Безопасность портов | Сканирование портов 3306 (MySQL), 9100, 8080 снаружи | Порты строго ЗАКРЫТЫ (соединение сброшено / filtered) |
| Телеметрия | Запрос метрик :9100 и :8080 изнутри туннеля | Отдача заголовков Prometheus metrics |
| Хранилище NFSv4 | Монтирование /srv/share, чтение stand.txt | Успешное монтирование, чтение содержимого |
| Хранилище NFSv4 | Попытка изменения stand.txt | Ошибка записи (Read-only защита) |
| Хранилище NFSv4 | Запись в reports/office_report.txt | Успешное создание файла, UID владельца 2000 |
Полный исходный код скрипта check_filial.sh
#!/bin/bash
# ==========================================================
# ОЛИМПИАДНЫЙ СКРИПТ ПРОВЕРКИ СТЕНДА ФИЛИАЛА (70 БАЛЛОВ)
# ==========================================================
FILIAL_PUB="${1:-10.3.0.160}"
FILIAL_INT="${2:-172.16.3.10}"
DOMAIN="${3:-stand03.olimp.gogle.com}"
echo "=========================================================="
echo " ОЛИМПИАДНАЯ ПРОВЕРКА СТЕНДА FILIAL "
echo "=========================================================="
echo "Параметры проверки:"
echo "Публичный IP: $FILIAL_PUB"
echo "Внутренний IP: $FILIAL_INT"
echo "Домен: $DOMAIN"
echo "=========================================================="
echo -e "\n[ МОДУЛЬ 1. DNS (15 баллов) ]"
echo -n "1.1 Проверка SOA: "
dig @${FILIAL_PUB} ${DOMAIN} SOA +short
echo -n "1.1 Проверка NS: "
dig @${FILIAL_PUB} ${DOMAIN} NS +short
echo -n "1.2 Корень зоны (A): "
dig @${FILIAL_PUB} ${DOMAIN} A +short
echo -n "1.2 site поддомен (A): "
dig @${FILIAL_PUB} site.${DOMAIN} A +short
echo -n "1.3 www поддомен (должен быть ${FILIAL_INT}): "
dig @${FILIAL_PUB} www.${DOMAIN} A +short
echo -e "\n[ МОДУЛЬ 2. IPsec Туннель (20 баллов) ]"
echo "2.1 Статус SA в туннеле:"
swanctl --list-sas
echo -n "2.2 Проверка доступности ${FILIAL_INT} через ICMP (ping): "
ping -c 2 -W 2 ${FILIAL_INT} > /dev/null && echo "УСПЕХ (100%)" || echo "ОШИБКА"
echo -e "\n[ МОДУЛЬ 3 & 4. NGINX, APP & HTTPS (45 баллов) ]"
echo -n "4.2 stand03 HTTP -> редирект 301: "
curl -s -o /dev/null -w "%{http_code}\n" http://${FILIAL_PUB} -H "Host: ${DOMAIN}"
echo -n "4.1 stand03 HTTPS -> /health (БД и сотрудники): "
curl -k -s https://${FILIAL_PUB}/health -H "Host: ${DOMAIN}"
echo ""
echo -n "4.5 stand03 HTTPS -> /internal (должен вернуть 403 Forbidden): "
curl -k -s -o /dev/null -w "%{http_code}\n" https://${FILIAL_PUB}/internal -H "Host: ${DOMAIN}"
echo -n "4.3 site HTTP -> без редиректа (код 200): "
curl -s -o /dev/null -w "%{http_code}\n" http://${FILIAL_PUB} -H "Host: site.${DOMAIN}"
echo "4.4 www через туннель -> справочник сотрудников (/internal):"
curl -s -H "Host: www.${DOMAIN}" http://${FILIAL_INT} | grep -o "<li>.*</li>" | head -n 3
echo -e "\n[ МОДУЛЬ 5. МОНИТОРИНГ (10 баллов) ]"
echo -n "5.1 node_exporter (9100) изнутри туннеля: "
curl -s http://${FILIAL_INT}:9100/metrics | head -n 1
echo -n "5.2 cAdvisor (8080) изнутри туннеля: "
curl -s http://${FILIAL_INT}:8080/metrics | head -n 1
echo -n "5.3 Порт 9100 снаружи (должен быть ЗАКРЫТ): "
nc -z -w 2 ${FILIAL_PUB} 9100 && echo "ПРОВАЛ (ОТКРЫТ)" || echo "OK (ЗАКРЫТ)"
echo -n "5.3 Порт 8080 снаружи (должен быть ЗАКРЫТ): "
nc -z -w 2 ${FILIAL_PUB} 8080 && echo "ПРОВАЛ (ОТКРЫТ)" || echo "OK (ЗАКРЫТ)"
echo -n "3.3 Порт MySQL 3306 снаружи (должен быть ЗАКРЫТ): "
nc -z -w 2 ${FILIAL_PUB} 3306 && echo "ПРОВАЛ (ОТКРЫТ)" || echo "OK (ЗАКРЫТ)"
echo -e "\n[ МОДУЛЬ 6. NFS-РЕСУРС (10 баллов) ]"
mkdir -p /mnt/share
umount -f /mnt/share 2>/dev/null
mount -t nfs4 ${FILIAL_INT}:/srv/share /mnt/share 2>/dev/null
if [ $? -eq 0 ]; then
echo "6.1 Монтирование NFSv4: УСПЕХ"
echo "6.1 Чтение stand.txt: $(cat /mnt/share/stand.txt)"
echo -n "6.3 Попытка изменить stand.txt (должна быть ошибка прав): "
echo "hacked" > /mnt/share/stand.txt 2>/dev/null && echo "ПРОВАЛ (ИЗМЕНЕН)" || echo "OK (Read-only)"
echo -n "6.2 Запись файла в reports: "
touch /mnt/share/reports/office_report.txt 2>/dev/null && echo "УСПЕХ" || echo "ОШИБКА"
echo -n "6.2 Владелец созданного файла (должен быть UID 2000): "
ls -lnd /mnt/share/reports/office_report.txt | awk '{print "UID: "$3", GID: "$4}'
umount /mnt/share
else
echo "6.1 Ошибка монтирования NFS!"
fi
echo -e "\n=========================================================="
echo " ПРОВЕРКА ЗАВЕРШЕНА "
echo "=========================================================="
Диагностика типичных неисправностей
Если один из тестов завершился с ошибкой, используйте следующие команды диагностики:
- Сбой запуска BIND: выполните
named-checkconf /etc/named.confи проверьте системный журналjournalctl -u named -e. Убедитесь в наличии прав у пользователяnamedна файлы зон в/var/named/. - IPsec туннель не переходит в ESTABLISHED: проверьте доступность удаленного шлюза по UDP 500/4500, соответствие общего ключа PSK в
/etc/strongswan/swanctl/swanctl.confи детальный логjournalctl -u strongswan -f. - Ошибка 502 Bad Gateway в Nginx: проверьте работу контейнеров Docker командой
docker psи журнал веб-приложенияdocker logs filial-app. - Ошибка монтирования NFS: проверьте статус службы
systemctl status nfs-server, список экспортовexportfs -vи доступность порта 2049 вfirewall-cmd --list-all.