Контекст
Предварительные условия
Перед началом должны быть готовы IP-адресация, NAT, IP-туннель, динамическая маршрутизация, локальные пользователи, DHCP и DNS. Для дальнейших действий используются адреса и имена из раздела «Настройка сетевой инфраструктуры».
Идентификация
Samba AD и ограничения sudo
Подготовка сервера
Где выполнять: BR-SRV.
apt-get update
apt-get install -y samba samba-common-tools
samba-tool --help | headИмя сервера задайте по принятой в сети схеме именования: для настройки Samba оно не является отдельным шагом.
Резервирование прежней конфигурации и создание домена
Где выполнять: BR-SRV.
systemctl stop smb nmb winbind samba 2>/dev/null
mkdir -p /root/samba-backup
cp -a /etc/samba /root/samba-backup/etc-samba-before-ad 2>/dev/null
mv /etc/samba/smb.conf /etc/samba/smb.conf.bak 2>/dev/null
samba-tool domain provision --realm=AU-TEAM.IRPO --domain=AU --server-role=dc --dns-backend=SAMBA_INTERNAL --adminpass='<AD_ADMIN_PASSWORD>' --use-rfc2307
cp /var/lib/samba/private/krb5.conf /etc/krb5.conf
systemctl enable --now samba
systemctl status samba
samba-tool domain info 127.0.0.1Группа и пользователи
Где выполнять: BR-SRV.
Создайте группу один раз, затем повторите две команды для каждого требуемого пользователя.
samba-tool group add hq
samba-tool user create <USERNAME> '<USER_PASSWORD>'
samba-tool group addmembers hq <USERNAME>
samba-tool user list
samba-tool group listmembers hqИмпорт пользователей из CSV
Где выполнять: BR-SRV.
Сначала проверьте заголовки и разделитель в /opt/users.csv. Пример ниже рассчитан на столбцы username,password.
head -5 /opt/users.csv
tail -n +2 /opt/users.csv | while IFS=',' read -r username password; do
samba-tool user create "${username}" "${password}"
done
samba-tool user listПрисоединение клиента к домену
Где выполнять: HQ-CLI.
До присоединения DNS клиента должен указывать на контроллер домена BR-SRV (192.168.200.2). Проверьте разрешение SRV-записи, затем используйте имя домена из этапа provision.
host -t SRV _ldap._tcp.au-team.irpo
apt-get update
apt-get install -y realmd sssd sssd-ad sssd-tools adcli
realm discover AU-TEAM.IRPO
realm join -U Administrator AU-TEAM.IRPO
realm list
id <USERNAME>@au-team.irpo
getent passwd <USERNAME>@au-team.irpoРазрешённый вход и ограниченный sudo
Где выполнять: HQ-CLI. Проверку выполняйте от имени доменного пользователя из разрешённой группы.
realm deny --all
realm permit -g hq@au-team.irpo
cat > /etc/sudoers.d/hq_limited <<'EOF'
%hq@au-team.irpo ALL=(ALL) NOPASSWD: /bin/cat, /bin/grep, /usr/bin/id
EOF
chmod 440 /etc/sudoers.d/hq_limited
visudo -cf /etc/sudoers.d/hq_limited
su - <USERNAME>@au-team.irpo
sudo /usr/bin/id
sudo /bin/bashsudo /usr/bin/id выполняется, а оболочка через sudo /bin/bash остаётся запрещённой. Не изменяйте разрешения исполняемого файла sudo вручную.Хранилище
RAID5 и NFS
RAID5 на сервере
Где выполнять: HQ-SRV.
lsblk
apt-get update
apt-get install -y mdadm
mdadm --create /dev/md0 --level=5 --raid-devices=3 /dev/sdb /dev/sdc /dev/sdd
cat /proc/mdstat
mdadm --detail /dev/md0
mkfs.ext4 /dev/md0
mdadm --detail --scan > /etc/mdadm.conf
mkdir -p /raid5
blkid /dev/md0
# Добавьте в /etc/fstab
/dev/md0 /raid5 ext4 defaults 0 0
mount -av
df -hNFS-сервер
Где выполнять: HQ-SRV.
Для общего доступа используйте отдельную группу и сохраните root_squash. Это безопаснее, чем выдавать всем полный доступ или отключать сопоставление root-пользователя.
apt-get install -y nfs-server nfs-utils
mkdir -p /raid5/nfs
groupadd -f nfswriters
chgrp nfswriters /raid5/nfs
chmod 2770 /raid5/nfs
# /etc/exports
/raid5/nfs <NFS_CLIENT_SUBNET>(rw,sync,root_squash,no_subtree_check)
exportfs -ra
exportfs -v
systemctl enable --now nfs-serverNFS-клиент
Где выполнять: HQ-CLI. Последнюю проверку файла — на HQ-SRV.
apt-get install -y nfs-utils
mkdir -p /mnt/nfs
showmount -e <NFS_SERVER_IP>
# Добавьте в /etc/fstab
<NFS_SERVER_IP>:/raid5/nfs /mnt/nfs nfs defaults,_netdev 0 0
mount -av
df -h
echo 'NFS check' > /mnt/nfs/check.txt
# На NFS-сервере
ls -l /raid5/nfs/check.txtВремя
Синхронизация времени chrony и NTP
Используйте ISP как локальный источник времени. Linux-узлы получают время через chrony, маршрутизаторы — как NTP-клиенты. Один и тот же шаблон применяется ко всем потребителям; отличается только ближайший адрес NTP.
Где выполнять: сервер времени — ISP; клиенты chrony — HQ-SRV, HQ-CLI и BR-SRV.
# На источнике времени: добавьте в /etc/chrony.conf
server 127.0.0.1 iburst
local stratum 5
allow <CLIENT_SUBNET>
systemctl restart chronyd
chronyc tracking
# На каждом Linux-клиенте: добавьте в /etc/chrony.conf
server <NTP_SERVER_IP> iburst
systemctl restart chronyd
chronyc sources -v
chronyc tracking| Сегмент сети | Адрес NTP-источника |
|---|---|
| HQ | 172.16.4.1 |
| BR | 172.16.5.1 |
Где выполнять: на маршрутизаторах HQ-RTR и BR-RTR. На каждом используйте ближайший адрес NTP.
enable
configure terminal
ntp server <NTP_SERVER_IP>
exit
write memory
show running-config | include ntpАвтоматизация
Ansible
Где выполнять: BR-SRV.
Проверка модулем ping предназначена для Linux-узлов с Python. Добавляйте каждый Linux-узел одной строкой по шаблону; маршрутизаторы вынесите в отдельную группу и проверяйте профильными сетевыми модулями.
apt-get update
apt-get install -y ansible
mkdir -p /etc/ansible
# /etc/ansible/hosts
[linux]
<HOST_ALIAS> ansible_host=<HOST_IP> ansible_port=<SSH_PORT> ansible_ssh_user=<REMOTE_USER>
# /etc/ansible/ansible.cfg
[defaults]
inventory = /etc/ansible/hosts
host_key_checking = True
interpreter_python = /usr/bin/python3
ansible all -m pingВеб-сервис
Docker и MediaWiki
Где выполнять: Docker и Compose — BR-SRV. Первичную настройку в браузере — HQ-CLI.
Разверните MediaWiki и MariaDB в отдельных контейнерах. Секреты храните в закрытом файле окружения, а порт публикуйте только в сети, откуда к нему будет обращаться reverse proxy.
apt-get install -y docker-engine docker-compose
systemctl enable --now docker
docker compose version
# /root/wiki.env (права 0600)
MARIADB_ROOT_PASSWORD=<MARIADB_ROOT_PASSWORD>
MARIADB_DATABASE=mediawiki
MARIADB_USER=wiki
MARIADB_PASSWORD=<WIKI_DB_PASSWORD>
MEDIAWIKI_DB_PASSWORD=<WIKI_DB_PASSWORD># /root/wiki.yml
services:
mariadb:
image: mariadb:11
restart: unless-stopped
env_file:
- /root/wiki.env
volumes:
- mariadb_data:/var/lib/mysql
wiki:
image: mediawiki:latest
restart: unless-stopped
depends_on:
- mariadb
env_file:
- /root/wiki.env
ports:
- "192.168.200.2:8080:80"
environment:
MEDIAWIKI_DB_TYPE: mysql
MEDIAWIKI_DB_HOST: mariadb
MEDIAWIKI_DB_USER: wiki
MEDIAWIKI_DB_NAME: mediawiki
volumes:
- /root/LocalSettings.php:/var/www/html/LocalSettings.php:ro
volumes:
mariadb_data:chmod 600 /root/wiki.env
docker compose -f /root/wiki.yml up -d
docker ps
curl -I http://127.0.0.1:8080На HQ-CLI откройте http://192.168.200.2:8080. При первичной веб-настройке используйте имя сервера базы данных mariadb, базу mediawiki и учётную запись wiki. Сформированный файл LocalSettings.php перенесите с HQ-CLI на BR-SRV в /root/LocalSettings.php.
Публикация сервисов
Статическая трансляция портов
Где выполнять: правила для сегмента HQ — на HQ-RTR; правила для сегмента BR — на BR-RTR.
Для внешнего SSH-доступа опубликуйте порт 2024. Публикацию MediaWiki на 8080 используйте только если она требуется за пределами внутренней сети.
| Назначение | Внутренний сервис | Внешний адрес и порт |
|---|---|---|
| SSH, сегмент HQ | 192.168.100.2:2024 | 172.16.4.14:2024 |
| SSH, сегмент BR | 192.168.200.2:2024 | 172.16.5.14:2024 |
| MediaWiki, при внешней публикации | 192.168.200.2:8080 | 172.16.5.14:8080 |
Введите шаблон на маршрутизаторе соответствующего сегмента для каждого правила из таблицы.
enable
configure terminal
ip nat source static tcp <PRIVATE_IP> <PRIVATE_PORT> <PUBLIC_IP> <PUBLIC_PORT>
exit
write memory
show running-config | include static
show ip nat translationsОбучающая платформа
Moodle
Где выполнять: установка и настройка — HQ-SRV; завершение установки в браузере — HQ-CLI.
Apache, PHP и MariaDB
apt-get update
apt-get install -y apache2 php8.2 apache2-mods apache2-mod_php8.2 php8.2-libs mariadb-server php8.2-opcache php8.2-curl php8.2-gd php8.2-intl php8.2-mysqlnd-mysqli php8.2-xmlrpc php8.2-zip php8.2-soap php8.2-mbstring php8.2-xmlreader php8.2-fileinfo php8.2-sodium
systemctl enable --now httpd2 mariadbБаза данных и файлы приложения
mariadb -u root
CREATE DATABASE moodledb DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'moodle'@'localhost' IDENTIFIED BY '<MOODLE_DB_PASSWORD>';
GRANT ALL PRIVILEGES ON moodledb.* TO 'moodle'@'localhost';
FLUSH PRIVILEGES;
EXIT;
cd /root
wget https://download.moodle.org/download.php/direct/stable405/moodle-latest-405.tgz
tar -xf moodle-latest-405.tgz
mv moodle /var/www/html/
mkdir -p /var/www/moodledata
chown -R apache2:apache2 /var/www/html/moodle /var/www/moodledata# /etc/php/8.2/apache2-mod_php/php.ini
max_input_vars = 5000
systemctl restart httpd2
# Откройте установщик в браузере клиента
http://<MOODLE_SERVER_IP>/moodle/install.phpВ мастере установки укажите MariaDB на localhost, базу moodledb и созданную выше учётную запись. Для администратора платформы задайте отдельный уникальный пароль.
Маршрутизация HTTP
nginx reverse proxy
Где выполнять: HQ-SRV. Проверку сайтов в браузере — HQ-CLI.
Перенесите Apache с порта 80 на 8081, затем направьте запросы к Moodle и MediaWiki через nginx. Конфигурация для сервисов одинакова: меняются только имя и адрес назначения.
grep -R "Listen 80" /etc/httpd2
# В /etc/httpd2/conf/ports-enabled/http.conf
# Listen 80 → Listen 8081
systemctl restart httpd2
ss -ltnp | grep 8081
apt-get install -y nginx| Сервис | Имя для reverse proxy | Адрес назначения |
|---|---|---|
| Moodle | moodle.au-team.irpo | http://127.0.0.1:8081/moodle/ |
| MediaWiki | wiki.au-team.irpo | http://192.168.200.2:8080/ |
Создайте по одному конфигурационному файлу для каждой строки таблицы, подставив её значения в шаблон.
# /etc/nginx/conf.d/<SERVICE>.conf
server {
listen 80;
server_name <SERVICE_FQDN>;
location / {
proxy_pass <UPSTREAM_URL>;
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 enable --now nginx
systemctl restart nginxЗаписи DNS
Создайте одинаковую CNAME-запись для имён moodle и wiki, указывающую на узел с reverse proxy.
# В прямой зоне au-team.irpo
<SERVICE> IN CNAME <REVERSE_PROXY_HOST>
# Увеличьте serial в SOA-записи, затем:
systemctl restart bind
host <SERVICE>.au-team.irpo
curl -I http://<SERVICE>.au-team.irpomoodle.au-team.irpo и wiki.au-team.irpo относятся к внутренней зоне au-team.irpo. Они не изменяют публичный адрес wiki.policast.ru.Клиент
Клиентский браузер
Где выполнять: HQ-CLI.
apt-get update
apt-get install -y yandex-browser-stable
rpm -qa | grep -i yandexГотовность
Контрольная проверка
- Пользователи доменной группы
hqвходят на присоединённый к домену клиент. - Для доменного пользователя разрешены только
cat,grepиidчерез sudo. - Массив
/dev/md0активен и смонтирован в/raid5. - Файл, записанный NFS-клиентом в
/mnt/nfs, доступен на NFS-сервере. chronycпоказывает источник времени и корректный stratum.ansible all -m pingвозвращаетpongдля Linux-узлов.- Контейнеры MediaWiki и MariaDB запущены; сервис открывается через настроенный reverse proxy.
- Moodle доступен через веб-интерфейс.