Организация сетевого администрирования операционных систем

Развёртывание доменной службы, хранилища, сетевых сервисов, средств автоматизации и веб-приложений.

Предварительные условия

Перед началом должны быть готовы IP-адресация, NAT, IP-туннель, динамическая маршрутизация, локальные пользователи, DHCP и DNS. Для дальнейших действий используются адреса и имена из раздела «Настройка сетевой инфраструктуры».

Секреты и права доступа. Во всех командах значения в угловых скобках заменяются уникальными параметрами конкретной среды. Не храните пароли в Compose-файлах, inventory, истории команд или публичных репозиториях.

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/bash
Ожидаемый результат. sudo /usr/bin/id выполняется, а оболочка через sudo /bin/bash остаётся запрещённой. Не изменяйте разрешения исполняемого файла sudo вручную.

RAID5 и NFS

Осторожно. Создание RAID-массива уничтожает данные на указанных дисках. Перед запуском подтвердите, что все три выбранных устройства — дополнительные диски, а не системный диск.

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 -h

NFS-сервер

Где выполнять: 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-server

NFS-клиент

Где выполнять: 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-источника
HQ172.16.4.1
BR172.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
Для постоянного использования. Подтверждайте ключ сервера при первом подключении, храните секреты в Ansible Vault и по возможности используйте SSH-ключи вместо паролей.

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, сегмент HQ192.168.100.2:2024172.16.4.14:2024
SSH, сегмент BR192.168.200.2:2024172.16.5.14:2024
MediaWiki, при внешней публикации192.168.200.2:8080172.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 и созданную выше учётную запись. Для администратора платформы задайте отдельный уникальный пароль.

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Адрес назначения
Moodlemoodle.au-team.irpohttp://127.0.0.1:8081/moodle/
MediaWikiwiki.au-team.irpohttp://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.irpo
Граница имён. Записи moodle.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 доступен через веб-интерфейс.
↑ Наверх