Задание 1: скрипты настройки ISP, HQ-RTR, BR-RTR, BR-FW, HQ-SRV, BR-SRV, HQ-CLI + калькулятор подсетей
This commit is contained in:
parent
79f8d8a0c1
commit
76fb635e38
67
MANUAL.md
Normal file
67
MANUAL.md
Normal file
|
|
@ -0,0 +1,67 @@
|
|||
# MANUAL.md — шаги, которые нельзя (или не нужно) автоматизировать
|
||||
|
||||
Пополняется по мере работы над заданиями 2 и 3.
|
||||
|
||||
## Задание 1
|
||||
|
||||
### BR-FW — если оказался НЕ Linux
|
||||
1. Смотрим, какая система стоит на ВМ BR-FW (например EcoRouter или другой МСЭ).
|
||||
2. Настраиваем по логике из zadanie1/br-fw.sh:
|
||||
- имя br-fw.au-team.irpo;
|
||||
- интерфейс к BR-RTR: адрес из сети /30 (адресация — из таблицы 2);
|
||||
- маршрут по умолчанию через адрес BR-RTR (в сети /30);
|
||||
- интерфейс к BR-SRV: адрес BR-FW в сети ≤16 адресов;
|
||||
- OSPF: соседство с BR-RTR, рекламируем сети линка и сети BR-SRV;
|
||||
- протокол OSPF разрешаем ТОЛЬКО на интерфейсе к BR-RTR;
|
||||
- часовой пояс по месту экзамена.
|
||||
3. Отчёт: заполняем раздел «коммутация/маршрутизация офиса BR».
|
||||
|
||||
### Таблица 2 и таблица 3
|
||||
- Заполняются вручную из вывода tools/subnet-calc.sh и из ip -4 -br address
|
||||
на машинах (см. README.md, порядок запуска).
|
||||
|
||||
## Задание 2
|
||||
|
||||
### HQ-CLI: ввод в домен samba-DC
|
||||
Команде join нужен пароль администратора домена, нельзя автоматизировать
|
||||
без секрета в файле. Делается вручную:
|
||||
1. Проверить DNS: адрес BR-SRV должен резолвиться (DNS BR-SRV в /etc/resolv.conf).
|
||||
Проверка: `realm discover au-team.irpo` (если используется realmd) либо
|
||||
`smbclient -L //br-srv.au-team.irpo -U administrator`.
|
||||
2. Ввести в домен одним из способов (уточнить на стенде, какой стек стоит
|
||||
на HQ-CLI: realmd+sssd или winbind):
|
||||
- realmd: `realm join au-team.irpo -U administrator` (пароль спросит);
|
||||
- sssd/winbind вручную: настроить krb5.conf, затем
|
||||
`net ads join -U administrator`.
|
||||
3. Включить вход доменных пользователей: pam/winbind/sss настроить
|
||||
(`/etc/nsswitch` и sssd.conf), перезапустить службы, проверить:
|
||||
`getent passwd hquser1`.
|
||||
4. Проверяем: `getent passwd hquser1`, затем `su - hquser1` — вход работает.
|
||||
|
||||
### HQ-CLI: Яндекс Браузер
|
||||
- Если пакет есть в репозитории РЕД ОС 8: `dnf install -y yandex-browser`
|
||||
(уточнить точное имя пакета).
|
||||
- Если нет — скачать rpm из Образца/Additional.iso/локальной сети и
|
||||
`dnf localinstall`. Отметить в отчёте действие установки.
|
||||
|
||||
## Задание 3
|
||||
|
||||
### Кибер Бэкап (HQ-SRV и агент на HQ-CLI)
|
||||
Графический продукт, автоматизации через конфиги нет:
|
||||
1. Устанавливаем сервер управления на HQ-SRV (пакет с ISO/сети — уточнить
|
||||
источник, где именно дистрибутив).
|
||||
2. В веб-интерфейсе создаём подразделение `irpo`, пользователя
|
||||
`irpoadmin` с паролем `P@ssw0rd` (значения берём из задания 3 п. 9).
|
||||
3. На HQ-CLI ставим агент с функциями узла хранилища, подключаем к серверу.
|
||||
4. На HQ-CLI создаём директорию /backup, выбираем её устройством хранения.
|
||||
5. Создаём план «копирование /etc и всех поддиректорий» для HQ-SRV.
|
||||
6. Запускаем план, показываем результат, снимаем скриншоты для отчёта.
|
||||
|
||||
### Импорт пользователей через import.sh (задание 3, п. 1)
|
||||
1. Монтируем Additional.iso в каталог (переменная ISO_DIR=/mnt/iso в
|
||||
скриптах задания 3).
|
||||
2. Запускаем файл с образа: `bash $ISO_DIR/import.sh` — скрипт спросит путь
|
||||
к источнику, вводим `$ISO_DIR/users.csv`. Импорт идёт со всеми
|
||||
атрибутами из CSV, повторить при необходимости (см. задание 3 п. 1).
|
||||
3. Проверка: пользователи должны логиниться на HQ-CLI вручную
|
||||
(`su - имя_пользователя` или через GUI-вход). Результат в отчёт.
|
||||
64
QUESTIONS.md
Normal file
64
QUESTIONS.md
Normal file
|
|
@ -0,0 +1,64 @@
|
|||
# QUESTIONS.md — что нужно уточнить на стенде / у экзаменатора
|
||||
|
||||
Список пополняется по мере работы с заданиями 2 и 3.
|
||||
|
||||
## HQ-SW (задание 1)
|
||||
- По tasks.md HQ-SW — виртуальный коммутатор; кто и чем его настраивает (это
|
||||
отдельная ВМ? EcoRouter? встроенный коммутатор гипервизора?) — уточнить.
|
||||
- Что от него требуется по заданию 1 (что тренировать руками):
|
||||
- порт в сторону HQ-SRV — access VLAN 100;
|
||||
- порт в сторону HQ-CLI — access VLAN 200;
|
||||
- порт в сторону HQ-RTR — trunk с VLAN 100, 200 и 999 (HQ-RTR маршрутизирует
|
||||
все VLAN через ОДИН адаптер, п. 4 задания 1);
|
||||
- управление в VLAN 999: IP управления HQ-SW должен быть из сети VLAN 999
|
||||
(не более 8 адресов по заданию).
|
||||
- Часовой пояс на HQ-SW НЕ настраивается (п. 11 задания 1).
|
||||
|
||||
## РЕД ОС 8 — менеджер сети и имена пакетов/служб (ПРОВЕРИТЬ на стенде)
|
||||
- Сетевой менеджер: NetworkManager с keyfiles
|
||||
(/etc/NetworkManager/system-connections/*.nmconnection)? Или
|
||||
netplan/ifup? Все скрипты задания 1 написаны под NetworkManager.
|
||||
- Пакет/служба для сохранения iptables: iptables (пакет iptables-services,
|
||||
служба iptables)? Если используется firewalld или nftables — обсудить
|
||||
с экзаменатором, поменять подход NAT.
|
||||
- OSPF-демон: frr (пакет frr, конфиг /etc/frr/frr.conf, служба frr) или
|
||||
quagga? В скриптах — frr, файл /etc/frr/daemons правится sed'ом
|
||||
(zebra=yes, ospfd=yes) — проверить, что файл такой существует.
|
||||
- Пакет DHCP-сервера: dhcp-server (служба dhcpd, конфиг /etc/dhcp/dhcpd.conf)?
|
||||
Или kea/dnsmasq? В zadanie1/hq-rtr.sh — dhcp.
|
||||
- DNS-сервер на HQ-SRV выбран dnsmasq (простой, A-записи через hosts-файл).
|
||||
PTR-записи: dnsmasq должен отдавать обратные записи по записям hosts —
|
||||
ПРОВЕРИТЬ на стенде (dig -x адрес). Если экзаменатор требует полноценный
|
||||
bind — переделать hq-srv.sh.
|
||||
- SELinux на РЕД ОС 8: если Enforcing, для порта SSH 2027 нужен
|
||||
semanage (пакет policycoreutils-python-utils) — проверено в скриптах,
|
||||
но имена пакетов ПРОВЕРИТЬ.
|
||||
|
||||
## BR-FW
|
||||
- Тип системы неизвестен (УТОЧНИТЬ). zadanie1/br-fw.sh написан под Linux.
|
||||
Если это не Linux (EcoRouter/другой МСЭ) — настройки OSPF-соседа и
|
||||
интерфейсов делаются по-своему, взять логику из скрипта как чек-лист.
|
||||
|
||||
## HQ-CLI
|
||||
- Графика: по предварительным данным HQ-CLI — только терминал. Пункты
|
||||
задания 2 (Яндекс Браузер) и задания 3 (Кибер Бэкап GUI, принтер в GUI)
|
||||
делаем через консоль где возможно, остальное — MANUAL.md/вручную.
|
||||
- Установлен ли на РЕД ОС 8 репозиторий с Яндекс Браузером (dnf)? Если нет —
|
||||
rpm-пакет с флешки/ISO — уточнить, откуда брать пакет.
|
||||
|
||||
## Задание 2 (уточнения по ходу)
|
||||
- Ввод HQ-CLI в домен samba на BR-SRV: команде join нужен пароль
|
||||
администратора домена — автоматизировать нельзя, см. MANUAL.md.
|
||||
- «Убедитесь, что пользователи группы hq имеют право аутентифицироваться
|
||||
на HQ-CLI»: проверять через su/dominate login — уточнить способ проверки
|
||||
на стенде (у us нет GUI-клиента).
|
||||
- Яндекс Браузер установка: возможно, только ручная — смотреть источник пакета.
|
||||
|
||||
## Задание 3 (уточнения по ходу)
|
||||
- «Рекомендуется использовать отечественные алгоритмы шифрования» (ЦС на
|
||||
HQ-SRV): обычный openssl ГОСТ-подписи не умеет; рассмотреть
|
||||
crypto-pro/ViPNet — уточнить требования экзаменатора. Пока в планах
|
||||
openssl RSA/ECDA на 30 дней.
|
||||
- Кибер Бэкап: GUI-продукт, ставится в MANUAL.md вручную.
|
||||
- Принт-сервер: виртуальный PDF-принтер на HQ-SRV достижим через
|
||||
CUPS-pdf; подключение на клиенте через lpadmin/lpoptions — проверить.
|
||||
110
tools/subnet-calc.sh
Normal file
110
tools/subnet-calc.sh
Normal file
|
|
@ -0,0 +1,110 @@
|
|||
#!/bin/bash
|
||||
# ============================================================
|
||||
# Калькулятор подсетей для экзамена 09.02.06 (python3 + ipaddress)
|
||||
#
|
||||
# ЗАПУСК:
|
||||
# bash tools/subnet-calc.sh <базовая_сеть> [имя=ЧИСЛО ...]
|
||||
#
|
||||
# ЧИСЛО — это АДРЕСА, а не хосты: считаются адрес сети и broadcast.
|
||||
# Если нужен именно объём ХОСТОВ — добавьте суффикс h, например:
|
||||
# srv=30 -> 30 адресов (включая сеть и broadcast)
|
||||
# srv=28h -> 28 хостов + 2 спецадреса = 30 адресов
|
||||
#
|
||||
# ПРИМЕР (адреса подбираются последовательно из базовой сети):
|
||||
# bash tools/subnet-calc.sh 10.0.0.0/24 hq_srv=32 hq_cli=16 mgmt=8 br_srv=16 br_link=2
|
||||
#
|
||||
# Для туннеля и линка BR-FW<->BR-RTR достаточно 2 адресов хостов:
|
||||
# link=2 -> маска /30 (4 адреса: сеть, 2 хоста, broadcast)
|
||||
#
|
||||
# Пример вывода готовой таблицы — просто скопировать в отчёт (таблица 2).
|
||||
# ============================================================
|
||||
|
||||
if ! command -v python3 >/dev/null 2>&1; then
|
||||
echo "Нужен python3. Установите: dnf install -y python3"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
python3 - "$@" <<'PY'
|
||||
import sys
|
||||
import ipaddress
|
||||
|
||||
|
||||
def usage_and_exit():
|
||||
print("Использование: subnet-calc.sh <базовая_сеть> [имя=число_адресов ...]")
|
||||
print("Суффикс h означает число ХОСТОВ (например srv=28h -> 28 хостов).")
|
||||
sys.exit(1)
|
||||
|
||||
|
||||
def parse_size(value):
|
||||
value = value.strip().lower()
|
||||
hosts = value.endswith("h")
|
||||
if hosts:
|
||||
value = value[:-1]
|
||||
try:
|
||||
count = int(value)
|
||||
except ValueError:
|
||||
usage_and_exit()
|
||||
if count < 1:
|
||||
usage_and_exit()
|
||||
need = count + 2 if hosts else count
|
||||
return count, need
|
||||
|
||||
|
||||
def main():
|
||||
if len(sys.argv) < 2:
|
||||
usage_and_exit()
|
||||
try:
|
||||
base = ipaddress.ip_network(sys.argv[1], strict=False)
|
||||
except ValueError:
|
||||
print("Некорректная базовая сеть:", sys.argv[1])
|
||||
usage_and_exit()
|
||||
|
||||
print("Базовая сеть:", base, "| всего адресов:", base.num_addresses)
|
||||
print()
|
||||
|
||||
cursor = int(base.network_address)
|
||||
last = int(base.broadcast_address)
|
||||
rows = []
|
||||
overflow = False
|
||||
|
||||
for item in sys.argv[2:]:
|
||||
name, sep, raw = item.partition("=")
|
||||
if not sep:
|
||||
print("Ошибка: параметр без '=' ->", item)
|
||||
usage_and_exit()
|
||||
count, need = parse_size(raw)
|
||||
prefix = base.max_prefixlen - (need - 1).bit_length()
|
||||
# Выравниваем начало подсети по границе новой маски
|
||||
step = 1 << (base.max_prefixlen - prefix)
|
||||
cursor = (cursor + step - 1) // step * step
|
||||
net = ipaddress.ip_network((cursor, prefix), strict=False)
|
||||
if int(net.broadcast_address) > last:
|
||||
overflow = True
|
||||
rows.append([
|
||||
name,
|
||||
str(net.network_address) + "/" + str(prefix),
|
||||
str(net.netmask),
|
||||
str(net.network_address + 1) if need > 2 else str(net.network_address),
|
||||
str(net.broadcast_address - 1) if need > 2 else str(net.broadcast_address),
|
||||
str(net.broadcast_address),
|
||||
str(net.num_addresses),
|
||||
])
|
||||
cursor = int(net.broadcast_address) + 1
|
||||
|
||||
if overflow:
|
||||
print("ВНИМАНИЕ: подсетей не хватило внутри базовой сети!")
|
||||
print()
|
||||
|
||||
headers = ["Назначение", "Сеть", "Маска", "Первый хост", "Последний хост",
|
||||
"Broadcast", "Адресов"]
|
||||
widths = [max(len(headers[i]), max(len(r[i]) for r in rows)) for i in range(len(headers))]
|
||||
|
||||
line = "-+-".join("-" * w for w in widths)
|
||||
print(" | ".join(h.ljust(w) for h, w in zip(headers, widths)))
|
||||
print(line)
|
||||
for row in rows:
|
||||
print(" | ".join(c.ljust(w) for c, w in zip(row, widths)))
|
||||
|
||||
|
||||
main()
|
||||
PY
|
||||
162
zadanie1/br-fw.sh
Normal file
162
zadanie1/br-fw.sh
Normal file
|
|
@ -0,0 +1,162 @@
|
|||
#!/bin/bash
|
||||
# ============================================================
|
||||
# ЗАДАНИЕ 1. Настройка BR-FW
|
||||
# ------------------------------------------------------------
|
||||
# ВНИМАНИЕ: СИСТЕМА BR-FW НЕИЗВЕСТНА (УТОЧНИТЬ, что за система).
|
||||
# Скрипт написан В ПРЕДПОЛОЖЕНИИ Linux / РЕД ОС 8. Если на стенде
|
||||
# BR-FW — не Linux, используйте MANUAL.md и настраивайте по-своему.
|
||||
# ------------------------------------------------------------
|
||||
# Имя, интерфейсы (к BR-RTR: сеть /30, к BR-SRV: сеть <=16 адресов),
|
||||
# маршрут по умолчанию через BR-RTR, OSPF (только интерфейс к BR-RTR),
|
||||
# IP forwarding, часовой пояс.
|
||||
# NAT для офиса BR НЕ настраивается — NAT делает BR-RTR.
|
||||
# ============================================================
|
||||
|
||||
# --- Проверка прав root ---
|
||||
if [[ $EUID -ne 0 ]]; then
|
||||
echo "Запустите скрипт с правами root (sudo bash br-fw.sh)"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# ================= ПЕРЕМЕННЫЕ (заполните перед запуском) =================
|
||||
HOSTNAME_FQDN="br-fw.au-team.irpo" # таблица 3, запись br-fw.au-team.irpo
|
||||
|
||||
# --- Интерфейс в сторону BR-RTR (сеть с минимально возможной маской /30) ---
|
||||
BR_RTR_IF="" # интерфейс к BR-RTR
|
||||
BR_RTR_ADDR="" # адрес BR-FW в этой сети, формат адрес/префикс (/30)
|
||||
BR_RTR_GW="" # адрес BR-RTR в этой же сети — маршрут по умолчанию
|
||||
|
||||
# --- Интерфейс в сторону BR-SRV (сеть не более 16 адресов) ---
|
||||
BR_SRV_IF="" # интерфейс к BR-SRV
|
||||
BR_SRV_ADDR="" # адрес BR-FW в этой сети, формат адрес/префикс
|
||||
|
||||
# --- OSPF (протокол разрешён ТОЛЬКО на интерфейсе к BR-RTR; пароля нет —
|
||||
# аутентификация по заданию требуется только на туннеле HQ<->BR) ---
|
||||
OSPF_AREA="0.0.0.0"
|
||||
# ПРОВЕРИТЬ на РЕД ОС 8: пакет, конфиг и службу OSPF (frr / quagga)
|
||||
FRR_PACKAGE="frr"
|
||||
FRR_CONF="/etc/frr/frr.conf"
|
||||
FRR_DAEMONS="/etc/frr/daemons"
|
||||
DNS_FW="" # внешний DNS для BR-FW (необязательно, например 77.88.8.7)
|
||||
|
||||
# --- Прочее ---
|
||||
EXAM_TZ="Europe/Moscow" # проверить на экзамене
|
||||
FORWARD_CONF="/etc/sysctl.d/99-ip-forward.conf" # перезаписывается целиком
|
||||
NM_CONF_DIR="/etc/NetworkManager/system-connections"
|
||||
|
||||
# ============ Проверка заполнения переменных ============
|
||||
MISSING=()
|
||||
for NAME in HOSTNAME_FQDN BR_RTR_IF BR_RTR_ADDR BR_RTR_GW BR_SRV_IF \
|
||||
BR_SRV_ADDR EXAM_TZ; do
|
||||
[[ -z "${!NAME}" ]] && MISSING+=("$NAME")
|
||||
done
|
||||
if [[ ${#MISSING[@]} -gt 0 ]]; then
|
||||
echo "Заполните переменные в начале скрипта: ${MISSING[*]}"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "=== Настройка BR-FW (предположение: Linux / РЕД ОС 8) ==="
|
||||
|
||||
# --- 1. Имя хоста ---
|
||||
hostnamectl set-hostname "$HOSTNAME_FQDN"
|
||||
echo "Имя хоста: $(hostname)"
|
||||
|
||||
# --- 2. Интерфейс в сторону BR-RTR (+ маршрут по умолчанию) ---
|
||||
echo "--- Профиль $BR_RTR_IF (статика, шлюз $BR_RTR_GW) ---"
|
||||
cat > "$NM_CONF_DIR/$BR_RTR_IF.nmconnection" <<EOF
|
||||
[connection]
|
||||
id=$BR_RTR_IF
|
||||
type=ethernet
|
||||
autoconnect=yes
|
||||
interface-name=$BR_RTR_IF
|
||||
|
||||
[ethernet]
|
||||
|
||||
[ipv4]
|
||||
address1=$BR_RTR_ADDR
|
||||
gateway=$BR_RTR_GW
|
||||
method=manual
|
||||
|
||||
[ipv6]
|
||||
method=disabled
|
||||
|
||||
[proxy]
|
||||
EOF
|
||||
chmod 600 "$NM_CONF_DIR/$BR_RTR_IF.nmconnection"
|
||||
|
||||
# --- 3. Интерфейс в сторону BR-SRV ---
|
||||
echo "--- Профиль $BR_SRV_IF (статика) ---"
|
||||
cat > "$NM_CONF_DIR/$BR_SRV_IF.nmconnection" <<EOF
|
||||
[connection]
|
||||
id=$BR_SRV_IF
|
||||
type=ethernet
|
||||
autoconnect=yes
|
||||
interface-name=$BR_SRV_IF
|
||||
|
||||
[ethernet]
|
||||
|
||||
[ipv4]
|
||||
address1=$BR_SRV_ADDR
|
||||
method=manual
|
||||
|
||||
[ipv6]
|
||||
method=disabled
|
||||
|
||||
[proxy]
|
||||
EOF
|
||||
chmod 600 "$NM_CONF_DIR/$BR_SRV_IF.nmconnection"
|
||||
|
||||
nmcli connection reload
|
||||
nmcli connection up "$BR_RTR_IF" || echo "ВНИМАНИЕ: не поднялся $BR_RTR_IF"
|
||||
nmcli connection up "$BR_SRV_IF" || echo "ВНИМАНИЕ: не поднялся $BR_SRV_IF"
|
||||
|
||||
# --- 4. IP forwarding (BR-FW пересылает трафик BR-SRV в сторону BR-RTR) ---
|
||||
echo "net.ipv4.ip_forward = 1" > "$FORWARD_CONF"
|
||||
sysctl -p "$FORWARD_CONF"
|
||||
|
||||
# --- 5. OSPF: рекламируем обе сети BR, но HELLO только на линке к BR-RTR ---
|
||||
echo "--- OSPF (${FRR_PACKAGE}) ---"
|
||||
dnf install -y "$FRR_PACKAGE" || echo "ПРОВЕРИТЬ: пакет $FRR_PACKAGE не установился"
|
||||
LINK_NET=$(python3 -c "import ipaddress,sys; print(ipaddress.ip_network(sys.argv[1], strict=False))" "$BR_RTR_ADDR")
|
||||
SRV_NET=$(python3 -c "import ipaddress,sys; print(ipaddress.ip_network(sys.argv[1], strict=False))" "$BR_SRV_ADDR")
|
||||
cat > "$FRR_CONF" <<EOF
|
||||
frr version 8
|
||||
frr defaults traditional
|
||||
hostname $(hostname -s)
|
||||
service integrated-vtysh-config
|
||||
!
|
||||
router ospf
|
||||
passive-interface default
|
||||
no passive-interface $BR_RTR_IF
|
||||
network $LINK_NET area $OSPF_AREA
|
||||
network $SRV_NET area $OSPF_AREA
|
||||
!
|
||||
EOF
|
||||
if [[ -f "$FRR_DAEMONS" ]]; then
|
||||
sed -ri 's/^zebra=.*/zebra=yes/; s/^ospfd=.*/ospfd=yes/' "$FRR_DAEMONS"
|
||||
fi
|
||||
systemctl enable --now "$FRR_PACKAGE" || echo "ПРОВЕРИТЬ: служба $FRR_PACKAGE не запустилась"
|
||||
|
||||
# --- 6. DNS (если нужно BR-FW) ---
|
||||
if [[ -n "$DNS_FW" ]]; then
|
||||
if grep -q "^nameserver" /etc/resolv.conf 2>/dev/null; then
|
||||
echo "DNS уже прописан: $(grep '^nameserver' /etc/resolv.conf)"
|
||||
else
|
||||
echo "nameserver $DNS_FW" > /etc/resolv.conf
|
||||
fi
|
||||
fi
|
||||
|
||||
# --- 7. Часовой пояс ---
|
||||
timedatectl set-timezone "$EXAM_TZ"
|
||||
|
||||
echo ""
|
||||
echo "=== Самопроверка для BR-FW ==="
|
||||
ip -4 -br address show
|
||||
echo ""
|
||||
echo "Маршруты:"
|
||||
ip route show
|
||||
echo ""
|
||||
echo "Дополнительные проверки вручную:"
|
||||
echo " vtysh -c 'show ip ospf neighbor' (сосед BR-RTR в FULL?)"
|
||||
echo " ping -c2 $BR_RTR_GW (BR-RTR доступен?)"
|
||||
echo " ping -c2 77.88.8.7 (Интернет через BR-RTR, у BR-RTR NAT)"
|
||||
217
zadanie1/br-rtr.sh
Normal file
217
zadanie1/br-rtr.sh
Normal file
|
|
@ -0,0 +1,217 @@
|
|||
#!/bin/bash
|
||||
# ============================================================
|
||||
# ЗАДАНИЕ 1. Настройка BR-RTR (Linux / РЕД ОС 8)
|
||||
# Имя, net_admin, интерфейсы (к ISP и к BR-FW: сеть /30),
|
||||
# GRE-туннель до HQ-RTR, OSPF (MD5), NAT, часовой пояс.
|
||||
# ============================================================
|
||||
|
||||
# --- Проверка прав root ---
|
||||
if [[ $EUID -ne 0 ]]; then
|
||||
echo "Запустите скрипт с правами root (sudo bash br-rtr.sh)"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# ================= ПЕРЕМЕННЫЕ (заполните перед запуском) =================
|
||||
HOSTNAME_FQDN="br-rtr.au-team.irpo" # таблица 3, запись br-rtr.au-team.irpo
|
||||
|
||||
# --- Пользователь net_admin (значения из задания) ---
|
||||
NET_ADMIN_USER="net_admin"
|
||||
NET_ADMIN_PASS="P@ssw0rd"
|
||||
|
||||
# --- Интерфейс в сторону ISP ---
|
||||
ISP_IF="" # интерфейс к ISP (пример: enp0s3)
|
||||
ISP_NET="" # адрес BR-RTR в этой сети, формат адрес/префикс
|
||||
# (по заданию сеть 172.16.2.0/28)
|
||||
ISP_GW="" # шлюз по умолчанию — адрес ISP в этой же сети
|
||||
DNS_ROUTER="" # внешний DNS для роутера (необязательно, например 77.88.8.7)
|
||||
|
||||
# --- Интерфейс в сторону BR-FW (сеть с минимально возможной маской) ---
|
||||
BR_LINK_IF="" # интерфейс к BR-FW (пример: enp0s8)
|
||||
BR_LINK_ADDR="" # адрес BR-RTR в этой сети, адрес/префикс (маска /30 — см. калькулятор)
|
||||
|
||||
# --- Локальная сеть в сторону BR-SRV (через BR-FW; не более 16 адресов) ---
|
||||
# Нужна только для правил NAT — адрес BR-RTR здесь назначает BR-FW.
|
||||
NAT_NETS="" # через пробел, например: "<сеть к BR-FW/префикс> <сеть BR-SRV/префикс>"
|
||||
|
||||
# --- GRE-туннель до HQ-RTR (сеть 10.10.10.0/24, минимальная маска -> /30) ---
|
||||
GRE_IF="gre1"
|
||||
GRE_LOCAL="" # локальный конец туннеля, адрес/префикс (из калькулятора, /30)
|
||||
GRE_REMOTE="" # удалённый конец — адрес HQ-RTR в сети ISP (без префикса)
|
||||
|
||||
# --- OSPF (значения из задания) ---
|
||||
OSPF_PASSWORD="P@ssw0rd"
|
||||
OSPF_AREA="0.0.0.0"
|
||||
# ПРОВЕРИТЬ на РЕД ОС 8: пакет, конфиг и службу OSPF (frr / quagga)
|
||||
FRR_PACKAGE="frr"
|
||||
FRR_CONF="/etc/frr/frr.conf"
|
||||
FRR_DAEMONS="/etc/frr/daemons"
|
||||
|
||||
# --- Прочее ---
|
||||
EXAM_TZ="Europe/Moscow" # проверить на экзамене
|
||||
FORWARD_CONF="/etc/sysctl.d/99-ip-forward.conf" # перезаписывается целиком
|
||||
NM_CONF_DIR="/etc/NetworkManager/system-connections"
|
||||
IPTABLES_SERVICE="iptables" # ПРОВЕРИТЬ
|
||||
|
||||
# ============ Проверка заполнения переменных ============
|
||||
MISSING=()
|
||||
for NAME in HOSTNAME_FQDN ISP_IF ISP_NET ISP_GW BR_LINK_IF BR_LINK_ADDR \
|
||||
NAT_NETS GRE_LOCAL GRE_REMOTE EXAM_TZ; do
|
||||
[[ -z "${!NAME}" ]] && MISSING+=("$NAME")
|
||||
done
|
||||
if [[ ${#MISSING[@]} -gt 0 ]]; then
|
||||
echo "Заполните переменные в начале скрипта: ${MISSING[*]}"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "=== Настройка BR-RTR ==="
|
||||
|
||||
# --- 1. Имя хоста ---
|
||||
hostnamectl set-hostname "$HOSTNAME_FQDN"
|
||||
echo "Имя хоста: $(hostname)"
|
||||
|
||||
# --- 2. Пользователь net_admin с sudo без пароля ---
|
||||
echo "--- Пользователь $NET_ADMIN_USER ---"
|
||||
if id "$NET_ADMIN_USER" &>/dev/null; then
|
||||
echo "Пользователь уже существует"
|
||||
else
|
||||
useradd -m "$NET_ADMIN_USER"
|
||||
fi
|
||||
echo "$NET_ADMIN_USER:$NET_ADMIN_PASS" | chpasswd
|
||||
echo "$NET_ADMIN_USER ALL=(ALL) NOPASSWD: ALL" > /etc/sudoers.d/net_admin
|
||||
chmod 440 /etc/sudoers.d/net_admin
|
||||
|
||||
# --- 3. Интерфейс в сторону ISP ---
|
||||
echo "--- Профиль $ISP_IF (статика, шлюз $ISP_GW) ---"
|
||||
cat > "$NM_CONF_DIR/$ISP_IF.nmconnection" <<EOF
|
||||
[connection]
|
||||
id=$ISP_IF
|
||||
type=ethernet
|
||||
autoconnect=yes
|
||||
interface-name=$ISP_IF
|
||||
|
||||
[ethernet]
|
||||
|
||||
[ipv4]
|
||||
address1=$ISP_NET
|
||||
gateway=$ISP_GW
|
||||
method=manual
|
||||
|
||||
[ipv6]
|
||||
method=disabled
|
||||
|
||||
[proxy]
|
||||
EOF
|
||||
chmod 600 "$NM_CONF_DIR/$ISP_IF.nmconnection"
|
||||
|
||||
# --- 4. Интерфейс в сторону BR-FW ---
|
||||
echo "--- Профиль $BR_LINK_IF (статика, /30) ---"
|
||||
cat > "$NM_CONF_DIR/$BR_LINK_IF.nmconnection" <<EOF
|
||||
[connection]
|
||||
id=$BR_LINK_IF
|
||||
type=ethernet
|
||||
autoconnect=yes
|
||||
interface-name=$BR_LINK_IF
|
||||
|
||||
[ethernet]
|
||||
|
||||
[ipv4]
|
||||
address1=$BR_LINK_ADDR
|
||||
method=manual
|
||||
|
||||
[ipv6]
|
||||
method=disabled
|
||||
|
||||
[proxy]
|
||||
EOF
|
||||
chmod 600 "$NM_CONF_DIR/$BR_LINK_IF.nmconnection"
|
||||
|
||||
# --- 5. GRE-туннель до HQ-RTR ---
|
||||
echo "--- Туннель $GRE_IF ---"
|
||||
cat > "$NM_CONF_DIR/$GRE_IF.nmconnection" <<EOF
|
||||
[connection]
|
||||
id=$GRE_IF
|
||||
type=ip-tunnel
|
||||
autoconnect=yes
|
||||
interface-name=$GRE_IF
|
||||
|
||||
[ip-tunnel]
|
||||
mode=gre
|
||||
remote=$GRE_REMOTE
|
||||
|
||||
[ipv4]
|
||||
address1=$GRE_LOCAL
|
||||
method=manual
|
||||
|
||||
[ipv6]
|
||||
method=disabled
|
||||
|
||||
[proxy]
|
||||
EOF
|
||||
chmod 600 "$NM_CONF_DIR/$GRE_IF.nmconnection"
|
||||
|
||||
nmcli connection reload
|
||||
for C in "$ISP_IF" "$BR_LINK_IF" "$GRE_IF"; do
|
||||
nmcli connection up "$C" || echo "ВНИМАНИЕ: не поднялся профиль $C"
|
||||
done
|
||||
|
||||
# --- 6. IP forwarding ---
|
||||
echo "net.ipv4.ip_forward = 1" > "$FORWARD_CONF"
|
||||
sysctl -p "$FORWARD_CONF"
|
||||
|
||||
# --- 7. NAT в сторону ISP ---
|
||||
echo "--- NAT (MASQUERADE) ---"
|
||||
for SRC_NET in $NAT_NETS; do
|
||||
if iptables -t nat -C POSTROUTING -s "$SRC_NET" -o "$ISP_IF" -j MASQUERADE 2>/dev/null; then
|
||||
echo "Правило для $SRC_NET уже есть"
|
||||
else
|
||||
iptables -t nat -A POSTROUTING -s "$SRC_NET" -o "$ISP_IF" -j MASQUERADE
|
||||
echo "Добавлено MASQUERADE для $SRC_NET"
|
||||
fi
|
||||
done
|
||||
iptables-save > /etc/sysconfig/iptables
|
||||
systemctl enable --now "$IPTABLES_SERVICE" 2>/dev/null \
|
||||
|| echo "ПРОВЕРИТЬ: служба $IPTABLES_SERVICE не запустилась"
|
||||
|
||||
# --- 8. OSPF: туннель (MD5) + интерфейс к BR-FW (сосед BR-FW) ---
|
||||
echo "--- OSPF (${FRR_PACKAGE}) ---"
|
||||
dnf install -y "$FRR_PACKAGE" || echo "ПРОВЕРИТЬ: пакет $FRR_PACKAGE не установился"
|
||||
TUN_NET=$(python3 -c "import ipaddress,sys; print(ipaddress.ip_network(sys.argv[1], strict=False))" "$GRE_LOCAL")
|
||||
LINK_NET=$(python3 -c "import ipaddress,sys; print(ipaddress.ip_network(sys.argv[1], strict=False))" "$BR_LINK_ADDR")
|
||||
cat > "$FRR_CONF" <<EOF
|
||||
frr version 8
|
||||
frr defaults traditional
|
||||
hostname $(hostname -s)
|
||||
service integrated-vtysh-config
|
||||
!
|
||||
router ospf
|
||||
passive-interface default
|
||||
no passive-interface $GRE_IF
|
||||
no passive-interface $BR_LINK_IF_SHORT
|
||||
network $TUN_NET area $OSPF_AREA
|
||||
network $LINK_NET area $OSPF_AREA
|
||||
!
|
||||
interface $GRE_IF
|
||||
ip ospf authentication message-digest
|
||||
ip ospf message-digest-key 1 md5 $OSPF_PASSWORD
|
||||
!
|
||||
EOF
|
||||
if [[ -f "$FRR_DAEMONS" ]]; then
|
||||
sed -ri 's/^zebra=.*/zebra=yes/; s/^ospfd=.*/ospfd=yes/' "$FRR_DAEMONS"
|
||||
fi
|
||||
systemctl enable --now "$FRR_PACKAGE" || echo "ПРОВЕРИТЬ: служба $FRR_PACKAGE не запустилась"
|
||||
|
||||
# --- 9. Часовой пояс ---
|
||||
timedatectl set-timezone "$EXAM_TZ"
|
||||
|
||||
echo ""
|
||||
echo "=== Самопроверка для BR-RTR ==="
|
||||
ip -4 -br address show
|
||||
echo ""
|
||||
echo "Правила NAT:"
|
||||
iptables -t nat -L POSTROUTING -n -v
|
||||
echo ""
|
||||
echo "Дополнительные проверки вручную:"
|
||||
echo " nmcli connection show (все профили активны?)"
|
||||
echo " ip -4 addr show $GRE_IF (туннель поднят?)"
|
||||
echo " vtysh -c 'show ip ospf neighbor' (соседи HQ-RTR и BR-FW в FULL?)"
|
||||
echo " ping -c2 $ISP_GW (шлюз ISP доступен?)"
|
||||
131
zadanie1/br-srv.sh
Normal file
131
zadanie1/br-srv.sh
Normal file
|
|
@ -0,0 +1,131 @@
|
|||
#!/bin/bash
|
||||
# ============================================================
|
||||
# ЗАДАНИЕ 1. Настройка BR-SRV (Linux / РЕД ОС 8)
|
||||
# Имя, адрес в сети BR (через BR-FW), пользователь sshuser
|
||||
# (UID 2027, sudo без пароля), SSH: порт 2027, только sshuser,
|
||||
# 2 попытки, баннер, часовой пояс.
|
||||
# ============================================================
|
||||
|
||||
# --- Проверка прав root ---
|
||||
if [[ $EUID -ne 0 ]]; then
|
||||
echo "Запустите скрипт с правами root (sudo bash br-srv.sh)"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# ================= ПЕРЕМЕННЫЕ (заполните перед запуском) =================
|
||||
HOSTNAME_FQDN="br-srv.au-team.irpo" # таблица 3, запись br-srv.au-team.irpo
|
||||
|
||||
# --- Сеть ---
|
||||
SRV_IF="" # интерфейс в сторону BR-FW
|
||||
SRV_ADDR="" # адрес BR-SRV в сети BR (сеть не более 16 адресов), адрес/префикс
|
||||
SRV_GW="" # шлюз — адрес BR-FW в этой же сети
|
||||
DNS_SRV="" # DNS для сервера — адрес HQ-SRV (основной DNS по заданию)
|
||||
# либо внешний, например 77.88.8.7 — уточните у экзаменатора
|
||||
|
||||
# --- Пользователь sshuser (значения из задания) ---
|
||||
SSH_USER="sshuser"
|
||||
SSH_USER_PASS="P@ssw0rd"
|
||||
SSH_USER_UID="2027"
|
||||
|
||||
# --- SSH (значения из задания) ---
|
||||
SSH_PORT="2027"
|
||||
SSH_BANNER_TEXT="Authorized access only"
|
||||
SSH_BANNER_FILE="/etc/ssh/exam-banner"
|
||||
SSHD_CONF="/etc/ssh/sshd_config"
|
||||
|
||||
# --- Прочее ---
|
||||
EXAM_TZ="Europe/Moscow" # проверить на экзамене
|
||||
NM_CONF_DIR="/etc/NetworkManager/system-connections"
|
||||
|
||||
# ============ Проверка заполнения переменных ============
|
||||
MISSING=()
|
||||
for NAME in HOSTNAME_FQDN SRV_IF SRV_ADDR SRV_GW SSH_USER SSH_USER_PASS \
|
||||
SSH_USER_UID SSH_PORT EXAM_TZ; do
|
||||
[[ -z "${!NAME}" ]] && MISSING+=("$NAME")
|
||||
done
|
||||
if [[ ${#MISSING[@]} -gt 0 ]]; then
|
||||
echo "Заполните переменные в начале скрипта: ${MISSING[*]}"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "=== Настройка BR-SRV ==="
|
||||
|
||||
# --- 1. Имя хоста ---
|
||||
hostnamectl set-hostname "$HOSTNAME_FQDN"
|
||||
echo "Имя хоста: $(hostname)"
|
||||
|
||||
# --- 2. Сеть ---
|
||||
echo "--- Профиль $SRV_IF ---"
|
||||
cat > "$NM_CONF_DIR/$SRV_IF.nmconnection" <<EOF
|
||||
[connection]
|
||||
id=$SRV_IF
|
||||
type=ethernet
|
||||
autoconnect=yes
|
||||
interface-name=$SRV_IF
|
||||
|
||||
[ethernet]
|
||||
|
||||
[ipv4]
|
||||
address1=$SRV_ADDR
|
||||
gateway=$SRV_GW
|
||||
method=manual
|
||||
|
||||
[ipv6]
|
||||
method=disabled
|
||||
|
||||
[proxy]
|
||||
EOF
|
||||
chmod 600 "$NM_CONF_DIR/$SRV_IF.nmconnection"
|
||||
nmcli connection reload
|
||||
nmcli connection up "$SRV_IF" || echo "ВНИМАНИЕ: не поднялся $SRV_IF"
|
||||
if [[ -n "$DNS_SRV" ]]; then
|
||||
if grep -q "^nameserver" /etc/resolv.conf 2>/dev/null; then
|
||||
echo "DNS уже прописан: $(grep '^nameserver' /etc/resolv.conf)"
|
||||
else
|
||||
echo "nameserver $DNS_SRV" > /etc/resolv.conf
|
||||
fi
|
||||
fi
|
||||
|
||||
# --- 3. Пользователь sshuser: UID 2027, пароль, sudo без пароля ---
|
||||
if id "$SSH_USER" &>/dev/null; then
|
||||
echo "Пользователь уже существует"
|
||||
else
|
||||
useradd -u "$SSH_USER_UID" -m "$SSH_USER"
|
||||
fi
|
||||
echo "$SSH_USER:$SSH_USER_PASS" | chpasswd
|
||||
echo "$SSH_USER ALL=(ALL) NOPASSWD: ALL" > /etc/sudoers.d/sshuser
|
||||
chmod 440 /etc/sudoers.d/sshuser
|
||||
echo "Проверка UID: id $SSH_USER"
|
||||
|
||||
# --- 4. SSH: порт 2027, только sshuser, MaxAuthTries 2, баннер ---
|
||||
echo "--- Настройка SSH (порт $SSH_PORT) ---"
|
||||
echo "$SSH_BANNER_TEXT" > "$SSH_BANNER_FILE"
|
||||
for KEY in Port AllowUsers MaxAuthTries Banner; do
|
||||
sed -riE "s/^[[:space:]]*[#]*[[:space:]]*${KEY}[[:space:]].*$//" "$SSHD_CONF"
|
||||
done
|
||||
cat >> "$SSHD_CONF" <<EOF
|
||||
Port $SSH_PORT
|
||||
AllowUsers $SSH_USER
|
||||
MaxAuthTries 2
|
||||
Banner $SSH_BANNER_FILE
|
||||
EOF
|
||||
if command -v getenforce >/dev/null 2>&1 && [[ $(getenforce) == "Enforcing" ]]; then
|
||||
if ! semanage port -l | grep -qw "$SSH_PORT" 2>/dev/null; then
|
||||
semanage port -a -t ssh_port_t -p tcp "$SSH_PORT" 2>/dev/null \
|
||||
|| echo "ПРОВЕРИТЬ: не удалось добавить SELinux-порт $SSH_PORT"
|
||||
fi
|
||||
fi
|
||||
sshd -t && echo "Конфиг sshd корректен" || echo "ПРОВЕРИТЬ: sshd -t вернул ошибку"
|
||||
systemctl restart sshd || systemctl restart ssh
|
||||
echo "Проверка: ss -tlnp | grep ':$SSH_PORT'"
|
||||
|
||||
# --- 5. Часовой пояс ---
|
||||
timedatectl set-timezone "$EXAM_TZ"
|
||||
|
||||
echo ""
|
||||
echo "=== Самопроверка для BR-SRV ==="
|
||||
ip -4 -br address show
|
||||
echo ""
|
||||
echo "Дополнительные проверки вручную:"
|
||||
echo " ss -tlnp | grep ':$SSH_PORT' (SSH на порту 2027?)"
|
||||
echo " ping -c2 $SRV_GW (BR-FW доступен?)"
|
||||
73
zadanie1/hq-cli.sh
Normal file
73
zadanie1/hq-cli.sh
Normal file
|
|
@ -0,0 +1,73 @@
|
|||
#!/bin/bash
|
||||
# ============================================================
|
||||
# ЗАДАНИЕ 1. Настройка HQ-CLI (Linux / РЕД ОС 8, только консоль)
|
||||
# Имя, адрес по DHCP от HQ-RTR (VLAN 200), часовой пояс.
|
||||
# DHCP-сервер находится на HQ-RTR: выдаёт адрес, шлюз (HQ-RTR),
|
||||
# DNS (HQ-SRV) и суффикс au-team.irpo.
|
||||
# ============================================================
|
||||
|
||||
# --- Проверка прав root ---
|
||||
if [[ $EUID -ne 0 ]]; then
|
||||
echo "Запустите скрипт с правами root (sudo bash hq-cli.sh)"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# ================= ПЕРЕМЕННЫЕ (заполните перед запуском) =================
|
||||
HOSTNAME_FQDN="hq-cli.au-team.irpo" # таблица 3, запись hq-cli.au-team.irpo
|
||||
|
||||
CLI_IF="" # интерфейс в сторону HQ-SW (VLAN 200), получит адрес по DHCP
|
||||
|
||||
EXAM_TZ="Europe/Moscow" # проверить на экзамене
|
||||
NM_CONF_DIR="/etc/NetworkManager/system-connections"
|
||||
|
||||
# ============ Проверка заполнения переменных ============
|
||||
MISSING=()
|
||||
for NAME in HOSTNAME_FQDN CLI_IF EXAM_TZ; do
|
||||
[[ -z "${!NAME}" ]] && MISSING+=("$NAME")
|
||||
done
|
||||
if [[ ${#MISSING[@]} -gt 0 ]]; then
|
||||
echo "Заполните переменные в начале скрипта: ${MISSING[*]}"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "=== Настройка HQ-CLI ==="
|
||||
|
||||
# --- 1. Имя хоста ---
|
||||
hostnamectl set-hostname "$HOSTNAME_FQDN"
|
||||
echo "Имя хоста: $(hostname)"
|
||||
|
||||
# --- 2. Интерфейс: адрес по DHCP ---
|
||||
echo "--- Профиль $CLI_IF (DHCP) ---"
|
||||
cat > "$NM_CONF_DIR/$CLI_IF.nmconnection" <<EOF
|
||||
[connection]
|
||||
id=$CLI_IF
|
||||
type=ethernet
|
||||
autoconnect=yes
|
||||
interface-name=$CLI_IF
|
||||
|
||||
[ethernet]
|
||||
|
||||
[ipv4]
|
||||
method=auto
|
||||
|
||||
[ipv6]
|
||||
method=disabled
|
||||
|
||||
[proxy]
|
||||
EOF
|
||||
chmod 600 "$NM_CONF_DIR/$CLI_IF.nmconnection"
|
||||
nmcli connection reload
|
||||
nmcli connection up "$CLI_IF" || echo "ВНИМАНИЕ: не поднялся $CLI_IF (DHCP на HQ-RTR запущен?)"
|
||||
|
||||
# --- 3. Часовой пояс ---
|
||||
timedatectl set-timezone "$EXAM_TZ"
|
||||
|
||||
echo ""
|
||||
echo "=== Самопроверка для HQ-CLI ==="
|
||||
ip -4 -br address show
|
||||
echo ""
|
||||
echo "Дополнительные проверки вручную (после получения адреса по DHCP):"
|
||||
echo " hostnamectl (имя и часовой пояс?)"
|
||||
echo " cat /etc/resolv.conf (DNS = адрес HQ-SRV, суффикс au-team.irpo?)"
|
||||
echo " ip route (шлюз по умолчанию = адрес HQ-RTR?)"
|
||||
echo " ping -c2 <адрес HQ-SRV>"
|
||||
254
zadanie1/hq-rtr.sh
Normal file
254
zadanie1/hq-rtr.sh
Normal file
|
|
@ -0,0 +1,254 @@
|
|||
#!/bin/bash
|
||||
# ============================================================
|
||||
# ЗАДАНИЕ 1. Настройка HQ-RTR (Linux / РЕД ОС 8)
|
||||
# Имя, net_admin, интерфейс к ISP, VLAN 100/200/999 на ОДНОМ адаптере,
|
||||
# GRE-туннель до BR-RTR, OSPF (MD5) в туннеле, NAT, DHCP для VLAN 200,
|
||||
# часовой пояс.
|
||||
# ============================================================
|
||||
|
||||
# --- Проверка прав root ---
|
||||
if [[ $EUID -ne 0 ]]; then
|
||||
echo "Запустите скрипт с правами root (sudo bash hq-rtr.sh)"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# ================= ПЕРЕМЕННЫЕ (заполните перед запуском) =================
|
||||
HOSTNAME_FQDN="hq-rtr.au-team.irpo" # таблица 3, запись hq-rtr.au-team.irpo
|
||||
|
||||
# --- Пользователь net_admin (значения из задания) ---
|
||||
NET_ADMIN_USER="net_admin"
|
||||
NET_ADMIN_PASS="P@ssw0rd"
|
||||
|
||||
# --- Интерфейс в сторону ISP ---
|
||||
ISP_IF="" # интерфейс к ISP (пример: enp0s3)
|
||||
ISP_NET="" # адрес HQ-RTR в этой сети, формат адрес/префикс
|
||||
# (по заданию сеть 172.16.1.0/28)
|
||||
ISP_GW="" # шлюз по умолчанию — адрес ISP в этой же сети
|
||||
DNS_ROUTER="" # внешний DNS для роутера (необязательно, например 77.88.8.7)
|
||||
|
||||
# --- Локальные VLAN на ОДНОМ физическом адаптере ---
|
||||
LAN_IF="" # физический адаптер в сторону HQ-SW (пример: enp0s8)
|
||||
VLAN100_ADDR="" # адрес HQ-RTR в VLAN 100 (сеть не более 32 адресов), адрес/префикс
|
||||
VLAN200_ADDR="" # адрес HQ-RTR в VLAN 200 (сеть не более 16 адресов), адрес/префикс
|
||||
VLAN999_ADDR="" # адрес HQ-RTR в VLAN 999 (сеть не более 8 адресов), адрес/префикс
|
||||
|
||||
# --- GRE-туннель до BR-RTR (сеть 10.10.10.0/24, минимальная маска -> /30) ---
|
||||
GRE_IF="gre1"
|
||||
GRE_LOCAL="" # локальный конец туннеля, адрес/префикс (из calculator, /30)
|
||||
GRE_REMOTE="" # удалённый конец туннеля — адрес BR-RTR в сети ISP (без префикса)
|
||||
|
||||
# --- OSPF (значения из задания) ---
|
||||
OSPF_PASSWORD="P@ssw0rd"
|
||||
OSPF_AREA="0.0.0.0"
|
||||
# ПРОВЕРИТЬ на РЕД ОС 8: пакет, конфиг и службу OSPF (frr / quagga)
|
||||
FRR_PACKAGE="frr"
|
||||
FRR_CONF="/etc/frr/frr.conf"
|
||||
FRR_DAEMONS="/etc/frr/daemons"
|
||||
|
||||
# --- NAT в сторону ISP (адресации не содержит) ---
|
||||
# Список сетей офиса для NAT — адреса сетей с префиксом (для правил iptables).
|
||||
NAT_NETS="" # через пробел, например: "<сеть VLAN100/префикс> <сеть VLAN200/префикс> <сеть VLAN999/префикс>"
|
||||
|
||||
# --- DHCP для VLAN 200 (клиент — HQ-CLI) ---
|
||||
DHCP_PACKAGE="dhcp-server" # ПРОВЕРИТЬ: пакет DHCP-сервера в РЕД ОС 8
|
||||
DHCPD_SERVICE="dhcpd" # ПРОВЕРИТЬ: имя службы
|
||||
DHCPD_CONF="/etc/dhcp/dhcpd.conf"
|
||||
DHCP_SUBNET="" # адрес сети VLAN 200 (без префикса)
|
||||
DHCP_NETMASK="" # маска этой сети (255.255.255.x)
|
||||
DHCP_RANGE_FIRST="" # первый адрес выдачи (АДРЕС HQ-RTR ВЫПАДАЕТ: он вне range)
|
||||
DHCP_RANGE_LAST="" # последний адрес выдачи
|
||||
DHCP_DOMAIN="au-team.irpo"
|
||||
HQ_SRV_IP="" # адрес HQ-SRV (VLAN 100) — DNS-сервер для HQ-CLI
|
||||
|
||||
# --- Прочее ---
|
||||
EXAM_TZ="Europe/Moscow" # проверить на экзамене
|
||||
FORWARD_CONF="/etc/sysctl.d/99-ip-forward.conf" # перезаписывается целиком
|
||||
NM_CONF_DIR="/etc/NetworkManager/system-connections"
|
||||
IPTABLES_SERVICE="iptables" # ПРОВЕРИТЬ
|
||||
|
||||
# ============ Проверка заполнения переменных ============
|
||||
MISSING=()
|
||||
for NAME in HOSTNAME_FQDN ISP_IF ISP_NET ISP_GW LAN_IF VLAN100_ADDR VLAN200_ADDR \
|
||||
VLAN999_ADDR GRE_LOCAL GRE_REMOTE NAT_NETS DHCP_SUBNET DHCP_NETMASK \
|
||||
DHCP_RANGE_FIRST DHCP_RANGE_LAST HQ_SRV_IP EXAM_TZ; do
|
||||
[[ -z "${!NAME}" ]] && MISSING+=("$NAME")
|
||||
done
|
||||
if [[ ${#MISSING[@]} -gt 0 ]]; then
|
||||
echo "Заполните переменные в начале скрипта: ${MISSING[*]}"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "=== Настройка HQ-RTR ==="
|
||||
|
||||
# --- 1. Имя хоста ---
|
||||
hostnamectl set-hostname "$HOSTNAME_FQDN"
|
||||
echo "Имя хоста: $(hostname)"
|
||||
|
||||
# --- 2. Пользователь net_admin с sudo без пароля ---
|
||||
echo "--- Пользователь $NET_ADMIN_USER ---"
|
||||
if id "$NET_ADMIN_USER" &>/dev/null; then
|
||||
echo "Пользователь уже существует"
|
||||
else
|
||||
useradd -m "$NET_ADMIN_USER"
|
||||
fi
|
||||
echo "$NET_ADMIN_USER:$NET_ADMIN_PASS" | chpasswd
|
||||
# Файл в sudoers.d перезаписывается целиком — дублей нет
|
||||
echo "$NET_ADMIN_USER ALL=(ALL) NOPASSWD: ALL" > /etc/sudoers.d/net_admin
|
||||
chmod 440 /etc/sudoers.d/net_admin
|
||||
echo "Проверка: su - $NET_ADMIN_USER -c 'sudo -n true && echo sudo OK'"
|
||||
|
||||
# --- 3. Интерфейс в сторону ISP ---
|
||||
echo "--- Профиль $ISP_IF (статика, шлюз $ISP_GW) ---"
|
||||
cat > "$NM_CONF_DIR/$ISP_IF.nmconnection" <<EOF
|
||||
[connection]
|
||||
id=$ISP_IF
|
||||
type=ethernet
|
||||
autoconnect=yes
|
||||
interface-name=$ISP_IF
|
||||
|
||||
[ethernet]
|
||||
|
||||
[ipv4]
|
||||
address1=$ISP_NET
|
||||
gateway=$ISP_GW
|
||||
method=manual
|
||||
|
||||
[ipv6]
|
||||
method=disabled
|
||||
|
||||
[proxy]
|
||||
EOF
|
||||
chmod 600 "$NM_CONF_DIR/$ISP_IF.nmconnection"
|
||||
|
||||
# --- 4. VLAN-интерфейсы (100/200/999) на одном физическом адаптере ---
|
||||
make_vlan_profile () {
|
||||
printf '%s\n' \
|
||||
"[connection]
|
||||
id=$1
|
||||
type=vlan
|
||||
autoconnect=yes
|
||||
interface-name=$1
|
||||
|
||||
[vlan]
|
||||
parent=$LAN_IF
|
||||
id=$2
|
||||
|
||||
[ipv4]
|
||||
address1=$3
|
||||
method=manual
|
||||
|
||||
[ipv6]
|
||||
method=disabled
|
||||
|
||||
[proxy]" > "$NM_CONF_DIR/$1.nmconnection"
|
||||
chmod 600 "$NM_CONF_DIR/$1.nmconnection"
|
||||
}
|
||||
echo "--- VLAN 100 ---"; make_vlan_profile vlan100 100 "$VLAN100_ADDR"
|
||||
echo "--- VLAN 200 ---"; make_vlan_profile vlan200 200 "$VLAN200_ADDR"
|
||||
echo "--- VLAN 999 ---"; make_vlan_profile vlan999 999 "$VLAN999_ADDR"
|
||||
|
||||
# --- 5. GRE-туннель ---
|
||||
echo "--- Туннель $GRE_IF ---"
|
||||
cat > "$NM_CONF_DIR/$GRE_IF.nmconnection" <<EOF
|
||||
[connection]
|
||||
id=$GRE_IF
|
||||
type=ip-tunnel
|
||||
autoconnect=yes
|
||||
interface-name=$GRE_IF
|
||||
|
||||
[ip-tunnel]
|
||||
mode=gre
|
||||
remote=$GRE_REMOTE
|
||||
|
||||
[ipv4]
|
||||
address1=$GRE_LOCAL
|
||||
method=manual
|
||||
|
||||
[ipv6]
|
||||
method=disabled
|
||||
|
||||
[proxy]
|
||||
EOF
|
||||
chmod 600 "$NM_CONF_DIR/$GRE_IF.nmconnection"
|
||||
|
||||
nmcli connection reload
|
||||
for C in "$ISP_IF" vlan100 vlan200 vlan999 "$GRE_IF"; do
|
||||
nmcli connection up "$C" || echo "ВНИМАНИЕ: не поднялся профиль $C"
|
||||
done
|
||||
|
||||
# --- 6. IP forwarding ---
|
||||
echo "net.ipv4.ip_forward = 1" > "$FORWARD_CONF"
|
||||
sysctl -p "$FORWARD_CONF"
|
||||
|
||||
# --- 7. NAT в сторону ISP ---
|
||||
echo "--- NAT (MASQUERADE) ---"
|
||||
for SRC_NET in $NAT_NETS; do
|
||||
if iptables -t nat -C POSTROUTING -s "$SRC_NET" -o "$ISP_IF" -j MASQUERADE 2>/dev/null; then
|
||||
echo "Правило для $SRC_NET уже есть"
|
||||
else
|
||||
iptables -t nat -A POSTROUTING -s "$SRC_NET" -o "$ISP_IF" -j MASQUERADE
|
||||
echo "Добавлено MASQUERADE для $SRC_NET"
|
||||
fi
|
||||
done
|
||||
iptables-save > /etc/sysconfig/iptables
|
||||
systemctl enable --now "$IPTABLES_SERVICE" 2>/dev/null \
|
||||
|| echo "ПРОВЕРИТЬ: служба $IPTABLES_SERVICE не запустилась"
|
||||
|
||||
# --- 8. OSPF в туннеле с аутентификацией MD5 ---
|
||||
echo "--- OSPF (${FRR_PACKAGE}) ---"
|
||||
dnf install -y "$FRR_PACKAGE" || echo "ПРОВЕРИТЬ: пакет $FRR_PACKAGE не установился"
|
||||
# Сеть туннеля вычисляем из адреса туннеля (нужен python3)
|
||||
TUN_NET=$(python3 -c "import ipaddress,sys; print(ipaddress.ip_network(sys.argv[1], strict=False))" "$GRE_LOCAL")
|
||||
cat > "$FRR_CONF" <<EOF
|
||||
frr version 8
|
||||
frr defaults traditional
|
||||
hostname $(hostname -s)
|
||||
service integrated-vtysh-config
|
||||
!
|
||||
router ospf
|
||||
passive-interface default
|
||||
no passive-interface $GRE_IF
|
||||
network $TUN_NET area $OSPF_AREA
|
||||
!
|
||||
interface $GRE_IF
|
||||
ip ospf authentication message-digest
|
||||
ip ospf message-digest-key 1 md5 $OSPF_PASSWORD
|
||||
!
|
||||
EOF
|
||||
# Включаем нужные демоны frr (zebra + ospfd) — файл правим точечно, без дублей
|
||||
if [[ -f "$FRR_DAEMONS" ]]; then
|
||||
sed -ri 's/^zebra=.*/zebra=yes/; s/^ospfd=.*/ospfd=yes/' "$FRR_DAEMONS"
|
||||
fi
|
||||
systemctl enable --now "$FRR_PACKAGE" || echo "ПРОВЕРИТЬ: служба $FRR_PACKAGE не запустилась"
|
||||
|
||||
# --- 9. DHCP для VLAN 200 ---
|
||||
echo "--- DHCP ($DHCP_PACKAGE) ---"
|
||||
dnf install -y "$DHCP_PACKAGE" || echo "ПРОВЕРИТЬ: пакет $DHCP_PACKAGE не установился"
|
||||
cat > "$DHCPD_CONF" <<EOF
|
||||
# Клиент HQ-CLI получает адрес из указанного range.
|
||||
# Адрес HQ-RTR в выдачу не попадает (он вне range) — это и есть исключение.
|
||||
subnet $DHCP_SUBNET netmask $DHCP_NETMASK {
|
||||
range $DHCP_RANGE_FIRST $DHCP_RANGE_LAST;
|
||||
option routers $VLAN200_ADDR; # шлюз — HQ-RTR (его адрес в VLAN 200)
|
||||
option domain-name-servers $HQ_SRV_IP;
|
||||
option domain-name "$DHCP_DOMAIN";
|
||||
}
|
||||
EOF
|
||||
systemctl enable --now "$DHCPD_SERVICE" || echo "ПРОВЕРИТЬ: служба $DHCPD_SERVICE не запустилась"
|
||||
|
||||
# --- 10. Часовой пояс ---
|
||||
timedatectl set-timezone "$EXAM_TZ"
|
||||
|
||||
echo ""
|
||||
echo "=== Самопроверка для HQ-RTR ==="
|
||||
ip -4 -br address show
|
||||
echo ""
|
||||
echo "Правила NAT:"
|
||||
iptables -t nat -L POSTROUTING -n -v
|
||||
echo ""
|
||||
echo "Дополнительные проверки вручную:"
|
||||
echo " nmcli connection show (все профили активны?)"
|
||||
echo " ip -4 addr show $GRE_IF (туннель поднят?)"
|
||||
echo " vtysh -c 'show ip ospf neighbor' (сосед BR-RTR в состоянии FULL?)"
|
||||
echo " ss -clip -n | grep 67 (DHCP слушает?)"
|
||||
echo " ping -c2 $ISP_GW (шлюз ISP доступен?)"
|
||||
186
zadanie1/hq-srv.sh
Normal file
186
zadanie1/hq-srv.sh
Normal file
|
|
@ -0,0 +1,186 @@
|
|||
#!/bin/bash
|
||||
# ============================================================
|
||||
# ЗАДАНИЕ 1. Настройка HQ-SRV (Linux / РЕД ОС 8)
|
||||
# Имя, адрес в VLAN 100, пользователь sshuser (UID 2027, sudo без пароля),
|
||||
# SSH: порт 2027, только sshuser, 2 попытки, баннер,
|
||||
# DNS-сервер (dnsmasq): зона au-team.irpo по таблице 3, forwarder,
|
||||
# часовой пояс.
|
||||
# ============================================================
|
||||
|
||||
# --- Проверка прав root ---
|
||||
if [[ $EUID -ne 0 ]]; then
|
||||
echo "Запустите скрипт с правами root (sudo bash hq-srv.sh)"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# ================= ПЕРЕМЕННЫЕ (заполните перед запуском) =================
|
||||
HOSTNAME_FQDN="hq-srv.au-team.irpo" # таблица 3, запись hq-srv.au-team.irpo
|
||||
|
||||
# --- Сеть ---
|
||||
SRV_IF="" # интерфейс в сторону HQ-SW (VLAN 100)
|
||||
SRV_ADDR="" # адрес HQ-SRV в VLAN 100, формат адрес/префикс
|
||||
SRV_GW="" # шлюз — адрес HQ-RTR в VLAN 100
|
||||
DNS_SRV="" # внешний DNS для самого сервера (необязательно, напр. 77.88.8.7)
|
||||
|
||||
# --- Пользователь sshuser (значения из задания) ---
|
||||
SSH_USER="sshuser"
|
||||
SSH_USER_PASS="P@ssw0rd"
|
||||
SSH_USER_UID="2027"
|
||||
|
||||
# --- SSH (значения из задания) ---
|
||||
SSH_PORT="2027" # порт подключения
|
||||
SSH_BANNER_TEXT="Authorized access only"
|
||||
SSH_BANNER_FILE="/etc/ssh/exam-banner"
|
||||
SSHD_CONF="/etc/ssh/sshd_config"
|
||||
|
||||
# --- DNS-сервер (dnsmasq; ПРОВЕРИТЬ: пакет/служба на РЕД ОС 8) ---
|
||||
DNS_PACKAGE="dnsmasq"
|
||||
DNS_SERVICE="dnsmasq"
|
||||
DNS_HOSTS_FILE="/etc/exam.hosts" # наши записи A/PTR, перезаписывается целиком
|
||||
DNS_EXTRA_CONF="/etc/dnsmasq.d/exam.conf"
|
||||
DNS_DOMAIN="au-team.irpo"
|
||||
DNS_UPSTREAM="" # forwarder по заданию: любой общий DNS (77.88.8.7 / 77.88.8.3 / др.)
|
||||
DNS_LISTEN="" # адрес, на котором слушать DNS (адрес HQ-SRV в VLAN 100)
|
||||
|
||||
# --- Адреса для записей таблицы 3 (все без префикса) ---
|
||||
HQ_RTR_IP="" # hq-rtr.au-team.irpo
|
||||
BR_RTR_IP="" # br-rtr.au-team.irpo
|
||||
BR_FW_IP="" # br-fw.au-team.irpo
|
||||
HQ_CLI_IP="" # hq-cli.au-team.irpo
|
||||
BR_SRV_IP="" # br-srv.au-team.irpo
|
||||
ISP_TO_HQ_IP="" # docker.au-team.irpo — ISP со стороны HQ-RTR
|
||||
ISP_TO_BR_IP="" # web.au-team.irpo — ISP со стороны BR-RTR
|
||||
|
||||
# --- Прочее ---
|
||||
EXAM_TZ="Europe/Moscow" # проверить на экзамене
|
||||
NM_CONF_DIR="/etc/NetworkManager/system-connections"
|
||||
|
||||
# ============ Проверка заполнения переменных ============
|
||||
MISSING=()
|
||||
for NAME in HOSTNAME_FQDN SRV_IF SRV_ADDR SRV_GW SSH_USER SSH_USER_PASS SSH_USER_UID \
|
||||
SSH_PORT DNS_UPSTREAM DNS_LISTEN HQ_RTR_IP BR_RTR_IP BR_FW_IP HQ_CLI_IP \
|
||||
BR_SRV_IP ISP_TO_HQ_IP ISP_TO_BR_IP EXAM_TZ; do
|
||||
[[ -z "${!NAME}" ]] && MISSING+=("$NAME")
|
||||
done
|
||||
if [[ ${#MISSING[@]} -gt 0 ]]; then
|
||||
echo "Заполните переменные в начале скрипта: ${MISSING[*]}"
|
||||
exit 1
|
||||
fi
|
||||
# Адрес HQ-SRV без префикса — для записи A/PTR на себя
|
||||
SRV_ADDR_HOST="${SRV_ADDR%/*}"
|
||||
|
||||
echo "=== Настройка HQ-SRV ==="
|
||||
|
||||
# --- 1. Имя хоста ---
|
||||
hostnamectl set-hostname "$HOSTNAME_FQDN"
|
||||
echo "Имя хоста: $(hostname)"
|
||||
|
||||
# --- 2. Сеть ---
|
||||
echo "--- Профиль $SRV_IF ---"
|
||||
cat > "$NM_CONF_DIR/$SRV_IF.nmconnection" <<EOF
|
||||
[connection]
|
||||
id=$SRV_IF
|
||||
type=ethernet
|
||||
autoconnect=yes
|
||||
interface-name=$SRV_IF
|
||||
|
||||
[ethernet]
|
||||
|
||||
[ipv4]
|
||||
address1=$SRV_ADDR
|
||||
gateway=$SRV_GW
|
||||
method=manual
|
||||
|
||||
[ipv6]
|
||||
method=disabled
|
||||
|
||||
[proxy]
|
||||
EOF
|
||||
chmod 600 "$NM_CONF_DIR/$SRV_IF.nmconnection"
|
||||
nmcli connection reload
|
||||
nmcli connection up "$SRV_IF" || echo "ВНИМАНИЕ: не поднялся $SRV_IF"
|
||||
if [[ -n "$DNS_SRV" ]]; then
|
||||
if grep -q "^nameserver" /etc/resolv.conf 2>/dev/null; then
|
||||
echo "DNS уже прописан: $(grep '^nameserver' /etc/resolv.conf)"
|
||||
else
|
||||
echo "nameserver $DNS_SRV" > /etc/resolv.conf
|
||||
fi
|
||||
fi
|
||||
|
||||
# --- 3. Пользователь sshuser: UID 2027, пароль, sudo без пароля ---
|
||||
if id "$SSH_USER" &>/dev/null; then
|
||||
echo "Пользователь уже существует"
|
||||
else
|
||||
useradd -u "$SSH_USER_UID" -m "$SSH_USER"
|
||||
fi
|
||||
echo "$SSH_USER:$SSH_USER_PASS" | chpasswd
|
||||
echo "$SSH_USER ALL=(ALL) NOPASSWD: ALL" > /etc/sudoers.d/sshuser
|
||||
chmod 440 /etc/sudoers.d/sshuser
|
||||
echo "Проверка UID: id $SSH_USER"
|
||||
|
||||
# --- 4. SSH: порт 2027, только sshuser, MaxAuthTries 2, баннер ---
|
||||
echo "--- Настройка SSH (порт $SSH_PORT) ---"
|
||||
echo "$SSH_BANNER_TEXT" > "$SSH_BANNER_FILE"
|
||||
# Удаляем старые значения (в т.ч. закомментированные), затем дописываем новые.
|
||||
# Повторный запуск не создаёт дублей: сначала чистим, потом пишем.
|
||||
for KEY in Port AllowUsers MaxAuthTries Banner; do
|
||||
sed -riE "s/^[[:space:]]*[#]*[[:space:]]*${KEY}[[:space:]].*$//" "$SSHD_CONF"
|
||||
done
|
||||
cat >> "$SSHD_CONF" <<EOF
|
||||
Port $SSH_PORT
|
||||
AllowUsers $SSH_USER
|
||||
MaxAuthTries 2
|
||||
Banner $SSH_BANNER_FILE
|
||||
EOF
|
||||
# Если включён SELinux, порт 2027 нужно разрешить политике sshd
|
||||
# (ПРОВЕРИТЬ на РЕД ОС 8; для semanage может понадобиться пакет
|
||||
# policycoreutils-python-utils)
|
||||
if command -v getenforce >/dev/null 2>&1 && [[ $(getenforce) == "Enforcing" ]]; then
|
||||
if ! semanage port -l | grep -qw "$SSH_PORT" 2>/dev/null; then
|
||||
semanage port -a -t ssh_port_t -p tcp "$SSH_PORT" 2>/dev/null \
|
||||
|| echo "ПРОВЕРИТЬ: не удалось добавить SELinux-порт $SSH_PORT"
|
||||
fi
|
||||
fi
|
||||
sshd -t && echo "Конфиг sshd корректен" || echo "ПРОВЕРИТЬ: sshd -t вернул ошибку"
|
||||
systemctl restart sshd || systemctl restart ssh
|
||||
|
||||
echo "Проверка: ss -tlnp | grep ':$SSH_PORT'"
|
||||
|
||||
# --- 5. DNS-сервер (dnsmasq): зона au-team.irpo по таблице 3 ---
|
||||
echo "--- DNS ($DNS_PACKAGE) ---"
|
||||
dnf install -y "$DNS_PACKAGE" || echo "ПРОВЕРИТЬ: пакет $DNS_PACKAGE не установился"
|
||||
# Записи A и PTR (PTR появляется автоматически по записям hosts —
|
||||
# убедитесь на стенде, что обратные зоны отвечают)
|
||||
cat > "$DNS_HOSTS_FILE" <<EOF
|
||||
$HQ_RTR_IP hq-rtr.au-team.irpo hq-rtr
|
||||
$BR_RTR_IP br-rtr.au-team.irpo br-rtr
|
||||
$BR_FW_IP br-fw.au-team.irpo br-fw
|
||||
$SRV_ADDR_HOST hq-srv.au-team.irpo hq-srv
|
||||
$HQ_CLI_IP hq-cli.au-team.irpo hq-cli
|
||||
$BR_SRV_IP br-srv.au-team.irpo br-srv
|
||||
$ISP_TO_HQ_IP docker.au-team.irpo docker
|
||||
$ISP_TO_BR_IP web.au-team.irpo web
|
||||
EOF
|
||||
cat > "$DNS_EXTRA_CONF" <<EOF
|
||||
domain=$DNS_DOMAIN
|
||||
local=/$DNS_DOMAIN/
|
||||
listen-address=127.0.0.1,$DNS_LISTEN
|
||||
server=$DNS_UPSTREAM
|
||||
addn-hosts=$DNS_HOSTS_FILE
|
||||
EOF
|
||||
systemctl enable --now "$DNS_SERVICE" \
|
||||
|| { echo "ПРОВЕРИТЬ: служба $DNS_SERVICE не запустилась"; systemctl status "$DNS_SERVICE" --no-pager; }
|
||||
|
||||
# --- 6. Часовой пояс ---
|
||||
timedatectl set-timezone "$EXAM_TZ"
|
||||
|
||||
echo ""
|
||||
echo "=== Самопроверка для HQ-SRV ==="
|
||||
ip -4 -br address show
|
||||
echo ""
|
||||
echo "Дополнительные проверки вручную:"
|
||||
echo " ss -tlnp | grep ':$SSH_PORT' (SSH на порту 2027?)"
|
||||
echo " ss -uln | grep ':53' (DNS слушает?)"
|
||||
echo " dig +short hq-rtr.$DNS_DOMAIN @127.0.0.1"
|
||||
echo " dig +short -x $SRV_ADDR_HOST @127.0.0.1 (проверка PTR HQ-SRV)"
|
||||
echo " ping -c2 $SRV_GW (шлюз HQ-RTR доступен?)"
|
||||
182
zadanie1/isp.sh
Normal file
182
zadanie1/isp.sh
Normal file
|
|
@ -0,0 +1,182 @@
|
|||
#!/bin/bash
|
||||
# ============================================================
|
||||
# ЗАДАНИЕ 1. Настройка ISP (Linux / РЕД ОС 8)
|
||||
# Имя, интерфейсы (WAN по DHCP, линки к HQ-RTR и BR-RTR),
|
||||
# NAT для сетей HQ-RTR и BR-RTR, часовой пояс.
|
||||
# ============================================================
|
||||
|
||||
# --- Проверка прав root ---
|
||||
if [[ $EUID -ne 0 ]]; then
|
||||
echo "Запустите скрипт с правами root (sudo bash isp.sh)"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# ================= ПЕРЕМЕННЫЕ (заполните перед запуском) =================
|
||||
# Полное доменное имя ISP. В таблице 3 задания записи ISP нет — уточните имя.
|
||||
HOSTNAME_FQDN=""
|
||||
|
||||
# Администрирование ниже настраивается без запросов — только переменные.
|
||||
|
||||
WAN_IF="" # интерфейс к провайдеру (пример: enp0s3), получит адрес по DHCP
|
||||
HQ_IF="" # интерфейс в сторону HQ-RTR
|
||||
HQ_NET="" # адрес ISP на этом интерфейсе, формат адрес/префикс
|
||||
# (по заданию сеть 172.16.1.0/28 — вписать свой адрес/префикс)
|
||||
BR_IF="" # интерфейс в сторону BR-RTR
|
||||
BR_NET="" # адрес ISP здесь, формат адрес/префикс
|
||||
# (по заданию сеть 172.16.2.0/28)
|
||||
|
||||
DNS_ISP="" # внешний DNS-сервер, если DHCP провайдера его не выдаёт
|
||||
# (необязательно, например 77.88.8.7)
|
||||
|
||||
# Часовой пояс — поставьте пояс места проведения экзамена
|
||||
EXAM_TZ="Europe/Moscow" # проверить на экзамене
|
||||
|
||||
# Служба сохранения iptables на РЕД ОС 8 — проверить на стенде (ПРОВЕРИТЬ:
|
||||
# пакет iptables-services и имя службы)
|
||||
IPTABLES_SERVICE="iptables"
|
||||
|
||||
NM_CONF_DIR="/etc/NetworkManager/system-connections"
|
||||
FORWARD_CONF="/etc/sysctl.d/99-ip-forward.conf" # перезаписывается целиком
|
||||
|
||||
# ============ Проверка заполнения переменных ============
|
||||
MISSING=()
|
||||
for NAME in HOSTNAME_FQDN WAN_IF HQ_IF HQ_NET BR_IF BR_NET EXAM_TZ; do
|
||||
[[ -z "${!NAME}" ]] && MISSING+=("$NAME")
|
||||
done
|
||||
if [[ ${#MISSING[@]} -gt 0 ]]; then
|
||||
echo "Заполните переменные в начале скрипта: ${MISSING[*]}"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "=== Настройка ISP ==="
|
||||
|
||||
# --- 1. Имя хоста ---
|
||||
echo "Имя хоста: $HOSTNAME_FQDN"
|
||||
hostnamectl set-hostname "$HOSTNAME_FQDN"
|
||||
echo "Проверка: hostnamectl"
|
||||
|
||||
# --- 2. WAN-интерфейс: адрес по DHCP ---
|
||||
echo "--- Профиль $WAN_IF (DHCP) ---"
|
||||
cat > "$NM_CONF_DIR/$WAN_IF.nmconnection" <<EOF
|
||||
[connection]
|
||||
id=$WAN_IF
|
||||
type=ethernet
|
||||
autoconnect=yes
|
||||
interface-name=$WAN_IF
|
||||
|
||||
[ethernet]
|
||||
|
||||
[ipv4]
|
||||
method=auto
|
||||
|
||||
[ipv6]
|
||||
method=disabled
|
||||
|
||||
[proxy]
|
||||
EOF
|
||||
chmod 600 "$NM_CONF_DIR/$WAN_IF.nmconnection"
|
||||
echo "Записан $NM_CONF_DIR/$WAN_IF.nmconnection"
|
||||
|
||||
# --- 3. Интерфейс в сторону HQ-RTR ---
|
||||
echo "--- Профиль $HQ_IF (статика) ---"
|
||||
cat > "$NM_CONF_DIR/$HQ_IF.nmconnection" <<EOF
|
||||
[connection]
|
||||
id=$HQ_IF
|
||||
type=ethernet
|
||||
autoconnect=yes
|
||||
interface-name=$HQ_IF
|
||||
|
||||
[ethernet]
|
||||
|
||||
[ipv4]
|
||||
address1=$HQ_NET
|
||||
method=manual
|
||||
|
||||
[ipv6]
|
||||
method=disabled
|
||||
|
||||
[proxy]
|
||||
EOF
|
||||
chmod 600 "$NM_CONF_DIR/$HQ_IF.nmconnection"
|
||||
|
||||
# --- 4. Интерфейс в сторону BR-RTR ---
|
||||
echo "--- Профиль $BR_IF (статика) ---"
|
||||
cat > "$NM_CONF_DIR/$BR_IF.nmconnection" <<EOF
|
||||
[connection]
|
||||
id=$BR_IF
|
||||
type=ethernet
|
||||
autoconnect=yes
|
||||
interface-name=$BR_IF
|
||||
|
||||
[ethernet]
|
||||
|
||||
[ipv4]
|
||||
address1=$BR_NET
|
||||
method=manual
|
||||
|
||||
[ipv6]
|
||||
method=disabled
|
||||
|
||||
[proxy]
|
||||
EOF
|
||||
chmod 600 "$NM_CONF_DIR/$BR_IF.nmconnection"
|
||||
|
||||
# --- 5. Применяем профили ---
|
||||
nmcli connection reload
|
||||
nmcli connection up "$WAN_IF" || echo "ВНИМАНИЕ: не поднялся $WAN_IF (DHCP? кабель?)"
|
||||
nmcli connection up "$HQ_IF"
|
||||
nmcli connection up "$BR_IF"
|
||||
|
||||
# --- 6. IP forwarding (файл перезаписывается целиком — дублей не будет) ---
|
||||
echo "--- Включаем маршрутизацию пакетов ---"
|
||||
echo "net.ipv4.ip_forward = 1" > "$FORWARD_CONF"
|
||||
sysctl -p "$FORWARD_CONF"
|
||||
|
||||
# --- 7. NAT для сетей HQ-RTR и BR-RTR ---
|
||||
# Динамическая трансляция (MASQUERADE) на выходе в Интернет только для
|
||||
# адресов сетей HQ-RTR и BR-RTR. Правила добавляются, только если их нет.
|
||||
echo "--- NAT (MASQUERADE) ---"
|
||||
for SRC_NET in "$HQ_NET" "$BR_NET"; do
|
||||
if iptables -t nat -C POSTROUTING -s "$SRC_NET" -o "$WAN_IF" -j MASQUERADE 2>/dev/null; then
|
||||
echo "Правило для $SRC_NET уже есть"
|
||||
else
|
||||
iptables -t nat -A POSTROUTING -s "$SRC_NET" -o "$WAN_IF" -j MASQUERADE
|
||||
echo "Добавлено MASQUERADE для $SRC_NET"
|
||||
fi
|
||||
done
|
||||
|
||||
# --- 8. Сохраняем правила iptables и включаем службу ---
|
||||
echo "--- Сохранение правил iptables ---"
|
||||
if command -v iptables-save >/dev/null 2>&1; then
|
||||
iptables-save > /etc/sysconfig/iptables
|
||||
systemctl enable --now "$IPTABLES_SERVICE" 2>/dev/null \
|
||||
|| echo "ПРОВЕРИТЬ: служба $IPTABLES_SERVICE не запустилась"
|
||||
else
|
||||
echo "ПРОВЕРИТЬ: iptables-save недоступен — как сохранить правила на РЕД ОС 8?"
|
||||
fi
|
||||
|
||||
# --- 9. DNS (если DHCP провайдера не выдал) ---
|
||||
if [[ -n "$DNS_ISP" ]]; then
|
||||
echo "ПРОВЕРИТЬ: DNS-сервер для ISP задаётся здесь ($DNS_ISP)."
|
||||
echo "Если resolv.conf пустой — впишите DNS через nmcli или вручную."
|
||||
fi
|
||||
|
||||
# --- 10. Часовой пояс ---
|
||||
timedatectl set-timezone "$EXAM_TZ"
|
||||
echo "Часовой пояс: $(timedatectl show -p Timezone --value)"
|
||||
|
||||
echo ""
|
||||
echo "=== Самопроверка для ISP ==="
|
||||
echo "Адреса интерфейсов:"
|
||||
ip -4 -br address show
|
||||
echo ""
|
||||
echo "Маршруты (маршрут по умолчанию должен идти через $WAN_IF):"
|
||||
ip route show
|
||||
echo ""
|
||||
echo "Правила NAT:"
|
||||
iptables -t nat -L POSTROUTING -n -v
|
||||
echo ""
|
||||
echo "Дополнительные проверки вручную:"
|
||||
echo " ping -c2 77.88.8.7 (доступ в Интернет от ISP)"
|
||||
echo " ping -c2 <адрес HQ-RTR> (линк к HQ-RTR)"
|
||||
echo " ping -c2 <адрес BR-RTR> (линк к BR-RTR)"
|
||||
Loading…
Reference in a new issue