Топология стенда
Нажми на любой адрес, интерфейс или VLAN — он изменится во всей документации
Таблицы адресации и DNS
| Устройство | Интерфейс | VLAN | IP-адрес | Шлюз |
|---|---|---|---|---|
| ISP | enp7s1 | — | DHCP | DHCP |
| ISP | enp7s2 (→HQ) | — | 172.16.1.1/28 | — |
| ISP | enp7s3 (→BR) | — | 172.16.2.1/28 | — |
| HQ-RTR | enp7s1 (→ISP) | — | 172.16.1.2/28 | 172.16.1.1 |
| HQ-RTR | enp7s2.100 | 100 | 192.168.100.1/27 | — |
| HQ-RTR | enp7s2.200 | 200 | 192.168.200.1/27 | — |
| HQ-RTR | enp7s2.999 | 999 | 192.168.99.1/29 | — |
| HQ-RTR | tun0 (GRE) | — | 10.0.0.1/30 | — |
| BR-RTR | enp7s1 (→ISP) | — | 172.16.2.2/28 | 172.16.2.1 |
| BR-RTR | enp7s2 | — | 192.168.201.1/28 | — |
| BR-RTR | tun0 (GRE) | — | 10.0.0.2/30 | — |
| HQ-SRV | enp7s1 | 100 | 192.168.100.2/27 | 192.168.100.1 |
| HQ-CLI | enp7s1 | 200 | DHCP | DHCP |
| BR-SRV | enp7s1 | — | 192.168.201.2/28 | 192.168.201.1 |
| Устройство | Запись | Тип | IP |
|---|---|---|---|
| HQ-RTR | hq-rtr.au-team.irpo | A, PTR | 192.168.100.1 |
| BR-RTR | br-rtr.au-team.irpo | A | 172.16.2.2 |
| HQ-SRV | hq-srv.au-team.irpo | A, PTR | 192.168.100.2 |
| HQ-CLI | hq-cli.au-team.irpo | A, PTR | DHCP |
| BR-SRV | br-srv.au-team.irpo | A | 192.168.201.2 |
| ISP→HQ | docker.au-team.irpo | A | 172.16.1.1 |
| ISP→BR | web.au-team.irpo | A | 172.16.2.1 |
1. ISP — шлюз в интернет
Раздаёт интернет через NAT для сетей HQ и BR. Получает внешний адрес по DHCP на enp7s1.
Сначала ставим пакеты, которые понадобятся именно на этом устройстве: iptables для NAT и tzdata для часового пояса. apt-get update обновляет список доступных пакетов, флаг -y отвечает «да» на все вопросы.
apt-get update && apt-get install iptables tzdata -yЗадаём серверу осмысленное имя — оно видно в приглашении терминала и используется в DNS. exec bash перезапускает оболочку, чтобы новое имя применилось сразу.
hostnamectl set-hostname isp.au-team.irpo; exec bashВнешний интерфейс смотрит в интернет и получает адрес автоматически по DHCP от провайдера, поэтому тип загрузки — dhcp, а конкретный IP прописывать не нужно.
cat > /etc/net/ifaces/enp7s1/options << 'EOF'
BOOTPROTO=dhcp
TYPE=eth
NM_CONTROLLED=no
DISABLED=no
EOFКанал в сторону головного офиса настраиваем статически: ISP здесь выступает шлюзом, поэтому адрес фиксированный. Создаём каталог интерфейса и записываем IP.
mkdir -p /etc/net/ifaces/enp7s2
cat > /etc/net/ifaces/enp7s2/options << 'EOF'
BOOTPROTO=static
TYPE=eth
NM_CONTROLLED=no
DISABLED=no
EOF
echo '172.16.1.1/28' > /etc/net/ifaces/enp7s2/ipv4addressТо же для канала в сторону филиала — отдельный статический адрес из своей подсети. Каждый стык между устройствами это своя маленькая сеть.
mkdir -p /etc/net/ifaces/enp7s3
cat > /etc/net/ifaces/enp7s3/options << 'EOF'
BOOTPROTO=static
TYPE=eth
NM_CONTROLLED=no
DISABLED=no
EOF
echo '172.16.2.1/28' > /etc/net/ifaces/enp7s3/ipv4addressПеречитываем конфигурацию сети, чтобы созданные интерфейсы поднялись с нужными адресами.
systemctl restart networkВключаем форвардинг (ip_forward) — без него Linux не пересылает чужие пакеты между интерфейсами. NAT (MASQUERADE) подменяет внутренние адреса на внешний, чтобы офис и филиал ходили в интернет через один публичный IP. Правила сохраняем, чтобы пережили перезагрузку.
echo 'net.ipv4.ip_forward = 1' > /etc/sysctl.d/99-forward.conf
sysctl -p /etc/sysctl.d/99-forward.conf
iptables -t nat -A POSTROUTING -s 172.16.1.0/28 -o enp7s1 -j MASQUERADE
iptables -t nat -A POSTROUTING -s 172.16.2.0/28 -o enp7s1 -j MASQUERADE
iptables-save > /etc/sysconfig/iptables
systemctl enable iptablesСтавим часовой пояс, чтобы время в логах и сертификатах было корректным.
timedatectl set-timezone Europe/Moscow2. HQ-RTR — маршрутизатор головного офиса
Терминирует VLAN 100/200/999 на trunk-интерфейсе enp7s2, поднимает GRE-туннель до BR-RTR, OSPF, NAT и DHCP для клиентов.
Ставим пакеты под роль маршрутизатора офиса: frr для OSPF, dhcp-server для раздачи адресов клиентам, iptables для NAT, sudo для прав и tzdata для часового пояса.
apt-get update && apt-get install frr dhcp-server tzdata iptables sudo -yЗадаём имя маршрутизатору головного офиса — оно пригодится в DNS и при подключении по SSH.
hostnamectl set-hostname hq-rtr.au-team.irpo; exec bashАплинк к провайдеру с фиксированным адресом. Здесь же прописываем маршрут по умолчанию (default via): через него весь незнакомый трафик уходит к ISP.
mkdir -p /etc/net/ifaces/enp7s1
cat > /etc/net/ifaces/enp7s1/options << 'EOF'
BOOTPROTO=static
TYPE=eth
NM_CONTROLLED=no
DISABLED=no
EOF
echo '172.16.1.2/28' > /etc/net/ifaces/enp7s1/ipv4address
echo 'default via 172.16.1.1' > /etc/net/ifaces/enp7s1/ipv4routeФизический интерфейс к коммутатору делаем транком: сам он адрес не получает, его задача — пропускать несколько VLAN. Адреса появятся на под-интерфейсах VLAN ниже.
mkdir -p /etc/net/ifaces/enp7s2
cat > /etc/net/ifaces/enp7s2/options << 'EOF'
BOOTPROTO=static
TYPE=eth
NM_CONTROLLED=no
DISABLED=no
EOFСоздаём под-интерфейс для серверной сети: TYPE=vlan, HOST — родительский интерфейс, VID — номер VLAN. Адрес .1 станет шлюзом для серверов.
mkdir -p /etc/net/ifaces/enp7s2.100
cat > /etc/net/ifaces/enp7s2.100/options << 'EOF'
BOOTPROTO=static
TYPE=vlan
HOST=enp7s2
VID=100
NM_CONTROLLED=no
DISABLED=no
EOF
echo '192.168.100.1/27' > /etc/net/ifaces/enp7s2.100/ipv4addressАналогично — сеть для клиентских рабочих станций. Маршрутизатор будет для неё шлюзом.
mkdir -p /etc/net/ifaces/enp7s2.200
cat > /etc/net/ifaces/enp7s2.200/options << 'EOF'
BOOTPROTO=static
TYPE=vlan
HOST=enp7s2
VID=200
NM_CONTROLLED=no
DISABLED=no
EOF
echo '192.168.200.1/27' > /etc/net/ifaces/enp7s2.200/ipv4addressОтдельный VLAN для управления устройствами — его держат изолированным от пользовательского трафика.
mkdir -p /etc/net/ifaces/enp7s2.999
cat > /etc/net/ifaces/enp7s2.999/options << 'EOF'
BOOTPROTO=static
TYPE=vlan
HOST=enp7s2
VID=999
NM_CONTROLLED=no
DISABLED=no
EOF
echo '192.168.99.1/29' > /etc/net/ifaces/enp7s2.999/ipv4addressПоднимаем все VLAN-интерфейсы и включаем форвардинг, чтобы маршрутизатор пересылал трафик между подсетями.
systemctl restart network
echo 'net.ipv4.ip_forward = 1' > /etc/sysctl.d/99-forward.conf
sysctl -p /etc/sysctl.d/99-forward.confВключаем NAT на аплинке: внутренние сети офиса выходят в интернет через адрес маршрутизатора.
iptables -t nat -A POSTROUTING -o enp7s1 -j MASQUERADE
iptables-save > /etc/sysconfig/iptables
systemctl enable iptablesСоздаём учётку администратора с паролем и правом sudo без пароля — под ней позже работает Ansible и идёт управление устройством.
useradd -m net_admin
echo 'net_admin:P@ssw0rd' | chpasswd
echo 'net_admin ALL=(ALL) NOPASSWD: ALL' > /etc/sudoers.d/net_adminСтроим GRE-туннель между офисом и филиалом поверх интернета. TUNLOCAL и TUNREMOTE — реальные адреса концов, а внутри туннеля используется отдельная маленькая сеть. По нему пойдёт внутренний трафик и OSPF.
mkdir -p /etc/net/ifaces/tun0
cat > /etc/net/ifaces/tun0/options << 'EOF'
TYPE=iptun
TUNTYPE=gre
TUNLOCAL=172.16.1.2
TUNREMOTE=172.16.2.2
TUNOPTIONS='ttl 64'
HOST=enp7s1
NM_CONTROLLED=no
DISABLED=no
EOF
echo '10.0.0.1/30' > /etc/net/ifaces/tun0/ipv4address
systemctl restart networkПоднимаем динамическую маршрутизацию OSPF через демон FRR: офис и филиал сами узнают маршруты друг друга через туннель. Включаем MD5-аутентификацию соседей, чтобы маршруты нельзя было подменить. passive-interface отключает OSPF там, где соседей нет.
apt-get install -y frr
sed -i 's/ospfd=no/ospfd=yes/' /etc/frr/daemons
systemctl enable --now frr
vtysh << 'VEOF'
configure terminal
router ospf
network 10.0.0.0/30 area 0
network 192.168.100.0/27 area 0
network 192.168.200.0/27 area 0
network 192.168.99.0/29 area 0
passive-interface enp7s1
passive-interface enp7s2.100
passive-interface enp7s2.200
passive-interface enp7s2.999
exit
interface tun0
ip ospf authentication message-digest
ip ospf message-digest-key 1 md5 P@ssw0rd
exit
router ospf
area 0 authentication message-digest
exit
end
write memory
VEOFПоднимаем DHCP-сервер для клиентской сети: он раздаёт адреса из заданного диапазона, шлюз и DNS. Указываем, на каком интерфейсе слушать запросы.
apt-get install -y dhcp-server
cat > /etc/dhcp/dhcpd.conf << 'EOF'
subnet 192.168.200.0 netmask 255.255.255.224 {
range 192.168.200.2 192.168.200.30;
option routers 192.168.200.1;
option domain-name-servers 192.168.100.2;
option domain-name "au-team.irpo";
}
EOF
sed -i 's/DHCPDARGS=/DHCPDARGS=enp7s2.200/' /etc/sysconfig/dhcpd
systemctl enable --now dhcpdСинхронизируем часовой пояс с остальными устройствами.
timedatectl set-timezone Europe/Moscow3. BR-RTR — маршрутизатор филиала
Маршрутизатор филиала: терминирует канал к ISP, держит GRE-туннель до офиса и OSPF. Ставим пакеты: frr для OSPF, iptables для NAT, sudo для прав и tzdata для часового пояса (dhcp-server здесь не нужен — клиенты в офисе).
apt-get update && apt-get install frr tzdata iptables sudo -yИмя для маршрутизатора филиала.
hostnamectl set-hostname br-rtr.au-team.irpo; exec bashАплинк филиала к провайдеру со статическим адресом и маршрутом по умолчанию в сторону ISP.
mkdir -p /etc/net/ifaces/enp7s1
cat > /etc/net/ifaces/enp7s1/options << 'EOF'
BOOTPROTO=static
TYPE=eth
NM_CONTROLLED=no
DISABLED=no
EOF
echo '172.16.2.2/28' > /etc/net/ifaces/enp7s1/ipv4address
echo 'default via 172.16.2.1' > /etc/net/ifaces/enp7s1/ipv4routeВнутренний интерфейс филиала, к которому подключён сервер BR-SRV. Маршрутизатор — шлюз для этой сети.
mkdir -p /etc/net/ifaces/enp7s2
cat > /etc/net/ifaces/enp7s2/options << 'EOF'
BOOTPROTO=static
TYPE=eth
NM_CONTROLLED=no
DISABLED=no
EOF
echo '192.168.201.1/28' > /etc/net/ifaces/enp7s2/ipv4addressПоднимаем сеть, включаем форвардинг и NAT — всё то же, что на HQ-RTR, но для филиала.
systemctl restart network
echo 'net.ipv4.ip_forward = 1' > /etc/sysctl.d/99-forward.conf
sysctl -p /etc/sysctl.d/99-forward.conf
iptables -t nat -A POSTROUTING -o enp7s1 -j MASQUERADE
iptables-save > /etc/sysconfig/iptables
systemctl enable iptablesТа же админ-учётка с sudo, что и в офисе, — для единообразного управления.
useradd -m net_admin
echo 'net_admin:P@ssw0rd' | chpasswd
echo 'net_admin ALL=(ALL) NOPASSWD: ALL' > /etc/sudoers.d/net_adminВторая половина туннеля: локальный и удалённый адреса зеркальны настройкам на HQ-RTR. Концы должны совпасть, иначе туннель не поднимется.
mkdir -p /etc/net/ifaces/tun0
cat > /etc/net/ifaces/tun0/options << 'EOF'
TYPE=iptun
TUNTYPE=gre
TUNLOCAL=172.16.2.2
TUNREMOTE=172.16.1.2
TUNOPTIONS='ttl 64'
HOST=enp7s1
NM_CONTROLLED=no
DISABLED=no
EOF
echo '10.0.0.2/30' > /etc/net/ifaces/tun0/ipv4address
systemctl restart networkOSPF на стороне филиала: анонсируем свою сеть и сеть туннеля, чтобы офис узнал маршрут до филиала. Аутентификация — та же.
apt-get install -y frr
sed -i 's/ospfd=no/ospfd=yes/' /etc/frr/daemons
systemctl enable --now frr
vtysh << 'VEOF'
configure terminal
router ospf
network 10.0.0.0/30 area 0
network 192.168.201.0/28 area 0
passive-interface enp7s1
passive-interface enp7s2
exit
interface tun0
ip ospf authentication message-digest
ip ospf message-digest-key 1 md5 P@ssw0rd
exit
router ospf
area 0 authentication message-digest
exit
end
write memory
VEOFЧасовой пояс филиала.
timedatectl set-timezone Europe/Moscow4. HQ-SRV — сервер (DNS bind, SSH)
Серверу нужны минимальные пакеты: sudo для прав и tzdata для часового пояса (bind поставим отдельно ниже).
apt-get update && apt-get install tzdata sudo -yHQ-SRV стоит в серверном VLAN 100, поэтому адрес вешаем не на сам enp7s1, а на его VLAN-под-интерфейс enp7s1.100 (тегированный трафик через коммутатор до HQ-RTR). Сам enp7s1 поднимаем без IP, а IP, шлюз и DNS прописываем на под-интерфейсе. DNS временно указываем сам на себя (127.0.0.1) — дальше тут поднимется bind.
hostnamectl set-hostname hq-srv.au-team.irpo; exec bash
mkdir -p /etc/net/ifaces/enp7s1.100
cat > /etc/net/ifaces/enp7s1/options << 'EOF'
BOOTPROTO=static
TYPE=eth
NM_CONTROLLED=no
DISABLED=no
EOF
cat > /etc/net/ifaces/enp7s1.100/options << 'EOF'
BOOTPROTO=static
TYPE=vlan
HOST=enp7s1
VID=100
NM_CONTROLLED=no
DISABLED=no
EOF
echo '192.168.100.2/27' > /etc/net/ifaces/enp7s1.100/ipv4address
echo 'default via 192.168.100.1' > /etc/net/ifaces/enp7s1.100/ipv4route
# DNS — сам на себя (будет bind):
echo 'nameserver 127.0.0.1' > /etc/resolv.conf
systemctl restart networkСоздаём пользователей: remote_user и sshuser с фиксированным UID. sshuser получит доступ по SSH и права sudo.
useradd -m remote_user
useradd -m -u 2026 sshuser
echo 'sshuser:P@ssw0rd' | chpasswd
echo 'sshuser ALL=(ALL) NOPASSWD: ALL' > /etc/sudoers.d/sshuserУсиливаем SSH: меняем порт со стандартного 22, ограничиваем число попыток входа, разрешаем подключаться только sshuser и показываем баннер-предупреждение. Это типовые требования по безопасности при настройке серверов.
sed -i 's/#Port 22/Port 2026/' /etc/ssh/sshd_config
sed -i 's/#MaxAuthTries 6/MaxAuthTries 2/' /etc/ssh/sshd_config
sed -i 's|#Banner none|Banner /etc/ssh/banner|' /etc/ssh/sshd_config
echo 'AllowUsers sshuser' >> /etc/ssh/sshd_config
echo 'Authorized access only' > /etc/ssh/banner
systemctl restart sshdСтавим bind и создаём прямую зону домена — таблицу соответствий имя в IP для всех устройств. Записи A позволяют обращаться к хостам по именам вместо адресов.
apt-get install -y bind
mkdir -p /var/lib/bind/zone
cat > /var/lib/bind/zone/au-team.irpo << 'EOF'
$TTL 3600
@ IN SOA hq-srv.au-team.irpo. admin.au-team.irpo. (
2024010101 3600 900 604800 86400 )
IN NS hq-srv.au-team.irpo.
hq-rtr IN A 192.168.100.1
hq-srv IN A 192.168.100.2
hq-cli IN A 192.168.200.2
br-rtr IN A 172.16.2.2
br-srv IN A 192.168.201.2
docker IN A 172.16.1.1
web IN A 172.16.2.1
EOFОбратные зоны делают обратное преобразование IP в имя (записи PTR). Имя зоны — это подсеть, записанная задом наперёд. Нужны для корректной работы почты, логов и проверок nslookup.
# Обратная зона 100.168.192:
cat > /var/lib/bind/zone/100.168.192.in-addr.arpa << 'EOF'
$TTL 3600
@ IN SOA hq-srv.au-team.irpo. admin.au-team.irpo. (
2024010101 3600 900 604800 86400 )
IN NS hq-srv.au-team.irpo.
1 IN PTR hq-rtr.au-team.irpo.
2 IN PTR hq-srv.au-team.irpo.
EOF
# Обратная зона 200.168.192:
cat > /var/lib/bind/zone/200.168.192.in-addr.arpa << 'EOF'
$TTL 3600
@ IN SOA hq-srv.au-team.irpo. admin.au-team.irpo. (
2024010101 3600 900 604800 86400 )
IN NS hq-srv.au-team.irpo.
2 IN PTR hq-cli.au-team.irpo.
EOFГлавный конфиг bind: где лежат файлы зон, кому отвечать, и forwarders — внешние DNS, куда пересылать запросы об именах за пределами нашего домена.
cat > /etc/bind/named.conf << 'EOF'
options {
directory "/var/lib/bind/zone";
listen-on { any; };
allow-query { any; };
forwarders { 77.88.8.7; 77.88.8.3; };
recursion yes;
};
zone "au-team.irpo" {
type master;
file "au-team.irpo";
};
zone "100.168.192.in-addr.arpa" {
type master;
file "100.168.192.in-addr.arpa";
};
zone "200.168.192.in-addr.arpa" {
type master;
file "200.168.192.in-addr.arpa";
};
EOF
chown -R named:named /var/lib/bind/zone
systemctl enable --now named
systemctl restart namedЧасовой пояс сервера.
timedatectl set-timezone Europe/Moscow5. BR-SRV — сервер филиала
Минимальный набор пакетов для сервера филиала: sudo и tzdata.
apt-get update && apt-get install tzdata sudo -yСервер филиала подключён к BR-RTR напрямую (без VLAN), поэтому адрес ставим прямо на enp7s1. Имя, статический адрес в сети филиала и шлюз. DNS указываем на HQ-SRV — там наш доменный bind.
hostnamectl set-hostname br-srv.au-team.irpo; exec bash
mkdir -p /etc/net/ifaces/enp7s1
cat > /etc/net/ifaces/enp7s1/options << 'EOF'
BOOTPROTO=static
TYPE=eth
NM_CONTROLLED=no
DISABLED=no
EOF
echo '192.168.201.2/28' > /etc/net/ifaces/enp7s1/ipv4address
echo 'default via 192.168.201.1' > /etc/net/ifaces/enp7s1/ipv4route
echo 'nameserver 192.168.100.2' > /etc/resolv.conf
systemctl restart networkТе же пользователи remote_user и sshuser, что и на HQ-SRV.
useradd -m remote_user
useradd -m -u 2026 sshuser
echo 'sshuser:P@ssw0rd' | chpasswd
echo 'sshuser ALL=(ALL) NOPASSWD: ALL' > /etc/sudoers.d/sshuserТа же настройка SSH: нестандартный порт, ограничение попыток, только sshuser и баннер.
sed -i 's/#Port 22/Port 2026/' /etc/ssh/sshd_config
sed -i 's/#MaxAuthTries 6/MaxAuthTries 2/' /etc/ssh/sshd_config
sed -i 's|#Banner none|Banner /etc/ssh/banner|' /etc/ssh/sshd_config
echo 'AllowUsers sshuser' >> /etc/ssh/sshd_config
echo 'Authorized access only' > /etc/ssh/banner
systemctl restart sshdЧасовой пояс.
timedatectl set-timezone Europe/Moscow6. HQ-CLI — клиент (DHCP)
Клиент стоит в клиентском VLAN 200, поэтому адрес он получает не на самом enp7s1, а на его VLAN-под-интерфейсе enp7s1.200. Сам enp7s1 поднимаем статически без IP (просто чтобы линк был активен), а на под-интерфейсе ставим BOOTPROTO=dhcp — адрес придёт от DHCP-сервера HQ-RTR из подсети 200.
hostnamectl set-hostname hq-cli.au-team.irpo; exec bash
mkdir -p /etc/net/ifaces/enp7s1.200
cat > /etc/net/ifaces/enp7s1/options << 'EOF'
BOOTPROTO=static
TYPE=eth
NM_CONTROLLED=no
DISABLED=no
EOF
cat > /etc/net/ifaces/enp7s1.200/options << 'EOF'
BOOTPROTO=dhcp
TYPE=vlan
HOST=enp7s1
VID=200
NM_CONTROLLED=no
DISABLED=no
EOF
systemctl restart network
timedatectl set-timezone Europe/Moscow7. Samba DC + ввод в домен
Поднимаем контроллер домена Active Directory на Samba. provision создаёт сам домен: задаём realm (область Kerberos), короткое имя домена и пароль администратора. Дальше к этому домену присоединяют клиентов.
apt-get install -y task-samba-dc
rm -f /etc/samba/smb.conf
samba-tool domain provision \
--use-rfc2307 \
--realm=AU-TEAM.IRPO \
--domain=AU-TEAM \
--server-role=dc \
--dns-backend=SAMBA_INTERNAL \
--adminpass='P@ssw0rd'
cp /var/lib/samba/private/krb5.conf /etc/krb5.conf
systemctl disable --now smb nmb winbind 2>/dev/null
systemctl enable --now sambaСоздаём в домене пять пользователей и группу hq, в которую их добавляем. Доменные учётки работают на всех машинах, введённых в домен.
for i in 1 2 3 4 5; do samba-tool user create hquser$i P@ssw0rd; done
samba-tool group add hq
samba-tool group addmembers hq hquser1,hquser2,hquser3,hquser4,hquser5Вводим клиента в домен: ставим SSSD, направляем DNS на контроллер домена (без этого клиент не найдёт домен) и выполняем присоединение. После этого можно входить под доменными учётками.
apt-get install -y task-auth-ad-sssd
# DNS клиента указываем на BR-SRV (контроллер домена):
echo 'nameserver 192.168.201.2' > /etc/resolv.conf
system-auth write ad au-team.irpo AU-TEAM br-srv.au-team.irpo Administrator 'P@ssw0rd'
# Альтернатива:
realm join au-team.irpo -U AdministratorВыдаём доменной группе hq ограниченные права sudo — только три безопасные команды. Это пример тонкой настройки прав без выдачи полного доступа.
echo '%hq ALL=(ALL) NOPASSWD: /usr/bin/cat, /usr/bin/grep, /usr/bin/id' > /etc/sudoers.d/hq8. RAID 0 + NFS на HQ-SRV
Собираем программный RAID 0 из двух дисков: данные распределяются по обоим, что даёт суммарный объём и скорость (но без отказоустойчивости). Затем форматируем массив и монтируем через fstab, чтобы он подключался при загрузке.
apt-get install -y mdadm
lsblk
# Определи два диска по 1 ГБ, обычно /dev/sdb и /dev/sdc
mdadm --create /dev/md0 --level=0 --raid-devices=2 /dev/sdb /dev/sdc
mdadm --detail --scan >> /etc/mdadm.conf
mkfs.ext4 /dev/md0
mkdir -p /raid
echo '/dev/md0 /raid ext4 defaults 0 0' >> /etc/fstab
mount -aОткрываем сетевую папку по NFS: в /etc/exports указываем каталог и какой подсети его отдавать, с правом на запись. NFS — простой способ расшарить файлы между Linux-машинами.
apt-get install -y nfs-server
mkdir -p /raid/nfs
echo '/raid/nfs 192.168.200.0/27(rw,sync,no_root_squash)' > /etc/exports
exportfs -ra
systemctl enable --now nfs-serverПодключаем эту папку на клиенте и прописываем в fstab, чтобы монтировалась автоматически. Параметр _netdev велит дождаться сети перед монтированием.
apt-get install -y nfs-clients
mkdir -p /mnt/nfs
echo '192.168.100.2:/raid/nfs /mnt/nfs nfs defaults,_netdev 0 0' >> /etc/fstab
mount -a9. Chrony (NTP)
ISP становится сервером точного времени (NTP) через chrony: сам берёт время из интернета и раздаёт его внутренней сети (allow). local stratum позволяет отдавать время, даже если внешний источник недоступен.
apt-get install -y chrony
cat > /etc/chrony.conf << 'EOF'
server pool.ntp.org iburst
local stratum 5
allow 0.0.0.0/0
driftfile /var/lib/chrony/drift
EOF
systemctl enable --now chronyd && systemctl restart chronydОстальные устройства синхронизируют время с ISP. Единое время критично для домена и Kerberos, логов и сертификатов.
apt-get install -y chrony
cat > /etc/chrony.conf << 'EOF'
server 172.16.1.1 iburst
driftfile /var/lib/chrony/drift
EOF
systemctl enable --now chronyd && systemctl restart chronyd10. Ansible на BR-SRV
Ставим Ansible — инструмент массового управления серверами по SSH без агентов. В конфиге указываем файл инвентаря и отключаем проверку ключей хоста, чтобы не зависать на вопросах при первом подключении.
apt-get install -y ansible
mkdir -p /etc/ansible
cat > /etc/ansible/ansible.cfg << 'EOF'
[defaults]
inventory = /etc/ansible/hosts
host_key_checking = False
EOFИнвентарь — список управляемых машин с их адресами, портом SSH и пользователем. Группы (servers, routers) позволяют выполнять задачи сразу на наборе устройств.
cat > /etc/ansible/hosts << 'EOF'
[servers]
hq-srv ansible_host=192.168.100.2 ansible_port=2026 ansible_user=sshuser
hq-cli ansible_host=192.168.200.2 ansible_user=sshuser
[routers]
hq-rtr ansible_host=192.168.100.1 ansible_user=net_admin
br-rtr ansible_host=192.168.201.1 ansible_user=net_admin
EOFГенерируем SSH-ключ и копируем его на все узлы (ssh-copy-id), чтобы Ansible ходил без пароля. Команда ansible all -m ping проверяет связь со всеми хостами.
ssh-keygen -t rsa -N '' -f ~/.ssh/id_rsa
ssh-copy-id -p 2026 sshuser@192.168.100.2
ssh-copy-id sshuser@192.168.200.2
ssh-copy-id net_admin@192.168.100.1
ssh-copy-id net_admin@192.168.201.1
ansible all -m ping11. Docker testapp на BR-SRV
Ставим Docker и загружаем готовые образы приложения и базы из подключённого ISO. docker load распаковывает образ из файла в локальное хранилище Docker.
apt-get install -y docker-engine docker-compose
systemctl enable --now docker
# Подключить Additional.iso:
mount /dev/cdrom /mnt
docker load -i /mnt/docker/site_latest
docker load -i /mnt/docker/mariadb_latestОписываем приложение в compose-файле: контейнер базы MariaDB и контейнер сайта, связанные между собой. restart: always поднимает их после перезагрузки, а docker-compose up -d запускает всё в фоне.
mkdir -p /opt/testapp && cd /opt/testapp
cat > docker-compose.yml << 'EOF'
version: '3'
services:
db:
container_name: db
image: mariadb_latest
environment:
MYSQL_ROOT_PASSWORD: P@ssw0rd
MYSQL_DATABASE: testdb
MYSQL_USER: test
MYSQL_PASSWORD: P@ssw0rd
restart: always
testapp:
container_name: testapp
image: site_latest
ports:
- '8080:8080'
environment:
DB_HOST: db
DB_NAME: testdb
DB_USER: test
DB_PASSWORD: P@ssw0rd
depends_on:
- db
restart: always
EOF
docker-compose up -d12. Apache + MariaDB на HQ-SRV
Ставим веб-сервер Apache, PHP и MariaDB. Создаём базу, пользователя с паролем и наполняем её дампом — это бэкенд для сайта.
apt-get install -y httpd2 php8.2 php8.2-mysqlnd-mysqli mariadb-server
systemctl enable --now mariadb httpd2
mount /dev/cdrom /mnt
mysql -e "CREATE DATABASE webdb;"
mysql -e "CREATE USER 'web'@'localhost' IDENTIFIED BY 'P@ssw0rd';"
mysql -e "GRANT ALL ON webdb.* TO 'web'@'localhost'; FLUSH PRIVILEGES;"
mysql webdb < /mnt/web/dump.sqlКопируем файлы сайта в каталог Apache и правим параметры подключения к базе в index.php. После правок перезапускаем веб-сервер.
cp /mnt/web/index.php /var/www/html/
cp -r /mnt/web/images /var/www/html/
# Отредактируй index.php — подключение к БД:
# host=localhost, dbname=webdb, user=web, password=P@ssw0rd
nano /var/www/html/index.php
systemctl restart httpd213. Проброс портов + Nginx reverse proxy + Basic Auth
Проброс портов (DNAT): запросы на внешний адрес маршрутизатора филиала на порты 8080 и SSH перенаправляются внутрь — на сервер BR-SRV. Так наружу публикуется сервис, спрятанный за NAT.
iptables -t nat -A PREROUTING -p tcp -d 172.16.2.2 --dport 8080 -j DNAT --to 192.168.201.2:8080
iptables -t nat -A PREROUTING -p tcp -d 172.16.2.2 --dport 2026 -j DNAT --to 192.168.201.2:2026
iptables-save > /etc/sysconfig/iptablesТо же для головного офиса: внешние обращения к маршрутизатору пробрасываются на внутренний сервер HQ-SRV (веб на 80 и SSH).
iptables -t nat -A PREROUTING -p tcp -d 172.16.1.2 --dport 8080 -j DNAT --to 192.168.100.2:80
iptables -t nat -A PREROUTING -p tcp -d 172.16.1.2 --dport 2026 -j DNAT --to 192.168.100.2:2026
iptables-save > /etc/sysconfig/iptablesNginx на ISP работает обратным прокси: по имени сайта он направляет запрос на нужный внутренний сервер. Один внешний вход — несколько внутренних сервисов, разделённых по доменным именам.
apt-get install -y nginx
cat > /etc/nginx/sites-available.d/proxy.conf << 'EOF'
server {
listen 80;
server_name web.au-team.irpo;
location / {
proxy_pass http://172.16.1.2:8080;
}
}
server {
listen 80;
server_name docker.au-team.irpo;
location / {
proxy_pass http://172.16.2.2:8080;
}
}
EOF
ln -sf /etc/nginx/sites-available.d/proxy.conf /etc/nginx/sites-enabled.d/
nginx -t && systemctl enable --now nginx && systemctl restart nginxЗакрываем сайт простой парольной защитой (Basic Auth): htpasswd создаёт файл с логином и паролем, а в блок server добавляются две строки, требующие авторизацию.
apt-get install -y apache2-htpasswd || apt-get install -y httpd-tools
htpasswd -bc /etc/nginx/.htpasswd WEB P@ssw0rd
# В блок server web.au-team.irpo добавить:
# auth_basic "Restricted";
# auth_basic_user_file /etc/nginx/.htpasswd;
systemctl restart nginxСтавим Яндекс Браузер на клиентскую машину — типовой пункт задания на установку прикладного ПО.
apt-get install -y yandex-browser-stableЧек-лист проверки
- ip a — интерфейсы подняты, IP верные?
- ping 8.8.8.8 с HQ-SRV, BR-SRV, HQ-CLI
- ping 192.168.201.2 с HQ-SRV (туннель + OSPF)
- ping 192.168.100.2 с BR-SRV (обратно)
- HQ-CLI получил DHCP? ip a / dhclient
- nslookup hq-srv.au-team.irpo 192.168.100.2
- ssh -p 2026 sshuser@192.168.100.2
- docker ps на BR-SRV — testapp и db?
- curl http://web.au-team.irpo с ISP
- ansible all -m ping с BR-SRV