🏗️ Архитектура — vipnet

FTP-шлюз ЕвроТранса в ЕГИС ОТБ через ViPNet + АРМ оператора
Хост: vm-evrotrans-yandex-vipnet-1769183391910
Дата: 2026-06-06
ОС: Ubuntu 20.04.6 LTS · ядро 5.4.0-216
Платформа: Yandex Cloud
ViPNet: tun0 7.1.39.7 · DNS 7.1.39.7:53
Аптайм: 133 дня · TZ Europe/Moscow (MSK)
📎 Связанные документы: AUDIT.html — аудит безопасности этого узла · АРХИТЕКТУРА_ОБЩАЯ.html — общая карта парка.
Содержание
  1. Назначение узла
  2. Аппаратура и платформа
  3. Сетевая топология
  4. Прикладной слой — FTP-шлюз
  5. Удалённый доступ и АРМ
  6. Криптозащита — ViPNet
  7. Эксплуатация: мониторинг / бэкап
  8. Пользователи и роли
  9. Сводная карта компонентов
  10. Сквозной поток данных в ЕГИС ОТБ
  11. Runbook
  12. Открытые вопросы
  13. Приложения: конфигурации

1. Назначение узла (роль в системе)

Узел — это шлюз сдачи данных в ЕГИС ОТБ (Единая государственная информационная система обеспечения транспортной безопасности). ЕвроТранс как субъект транспортной инфраструктуры обязан передавать в ЕГИС ОТБ данные; передача идёт по FTP через защищённый канал ViPNet. Это не веб-/ERP-узел — здесь нет 80/443, нет OpenVPN, нет Portainer, нет certbot.

Функционально узел: принимает данные от внутренних операторов по FTP (vsftpd, 48080), проксирует FTP-соединения к серверам импорта ЕГИС ОТБ (*.import.inet.egis-otb.local:21021) через 4 контейнера ftp-proxy (порты 21001–21004), шифрует транспорт до ЕГИС ОТБ туннелем ViPNet (tun0) и дополнительно несёт графический АРМ.

🌐 1. Транспорт / сеть
ViPNet + 2× Yandex Cloud VPC

Клиент ViPNet (tun0 7.1.39.7) и две внутренние Yandex Cloud-сети (eth0 основная, eth1 резерв). Защищённый ведомственный обмен и выход в интернет.

📁 2. Приложение — FTP-шлюз
ftp-proxy ×4 + vsftpd

4 контейнера-прокси ftp-proxy (proxy-suite, порты 21001–21004) на исходящие каналы pdp / onsi / timetable / ack + хостовый vsftpd (48080) на входящий FTP.

🖥️ 3. АРМ / обслуживание
LightDM/Xorg/VNC + Zabbix + Acronis

Графическое окружение (LightDM/Xorg/TigerVNC), мониторинг (Zabbix), резервное копирование и антивирус (Acronis Cyber Protect).

🔎 Четыре канала данных в ЕГИС ОТБ:
КаналЧто передаётЛокальный портСервер импорта ЕГИС ОТБ
pdpПерсональные данные пассажиров (ПДП)21001auto.pdp.import.inet.egis-otb.local:21021
onsiДанные подсистемы ОНСИ21002onsi.import.inet.egis-otb.local:21021
timetableРасписания21003timetable.import.inet.egis-otb.local:21021
ackКвитанции / подтверждения21004ack.import.inet.egis-otb.local:21021
Отличие от первого сервера (...-global-...): тот — веб/ERP-узел (80/443/OpenVPN/Portainer/certbot). Этот — узкоспециализированный FTP-шлюз в гос. систему. Общего кода нет; общие только базовая ОС, Yandex Cloud-платформа и личный SSH-ключ администратора.

2. Аппаратное обеспечение и платформа

ПараметрЗначение
Hostnamevm-evrotrans-yandex-vipnet-1769183391910
РольВыходной FTP-шлюз ЕвроТранса в ЕГИС ОТБ через ViPNet + АРМ оператора
ОСUbuntu 20.04.6 LTS (Focal Fossa)
Ядро5.4.0-216-generic #236-Ubuntu SMP Fri Apr 11 19:53:21 UTC 2025 x86_64
ПлатформаYandex Cloud (cloud-init, google-guest-agent), сеть 10.128.0.0/24
Аптайм на момент аудита133 дня
ТаймзонаEurope/Moscow (MSK)

3. Сетевая топология

3.1 Интерфейсы

ИнтерфейсАдресМетрикаНазначениеСостояние
lo127.0.0.1/8, ::1/128Локальные сервисы (Acronis, CUPS, resolved и т.д.)UNKNOWN
eth010.128.0.5/24100Осн. сеть Yandex Cloud: управление/SSH, мониторинг, выход в интернет (default via 10.128.0.1)UP
eth110.0.0.5/24200Вторая сеть Yandex Cloud: резервный шлюз по умолчанию (default via 10.0.0.1, метрика выше → не используется, пока жив eth0)UP
docker0172.17.0.1/16Bridge Docker — не используется (host-сеть)DOWN
tun07.1.39.7/32Туннель ViPNet — защищённый ведомственный обмен (point-to-point)UNKNOWN/UP

docker0 в состоянии DOWN, потому что все FTP-контейнеры работают в режиме network_mode: host (см. §4.2) — они подключены не к bridge, а напрямую к сетевому стеку хоста. docker network ls показывает только дефолтные сети bridge/host/none, пользовательских сетей нет.

3.2 Шлюзы по умолчанию

default via 10.128.0.1 dev eth0 proto dhcp src 10.128.0.5 metric 100   ← основной
default via 10.0.0.1   dev eth1 proto dhcp src 10.0.0.5   metric 200   ← резервный

3.3 Маршруты в сеть ViPNet (через tun0 7.1.39.7)

Через туннель доступны сети контрагентов / ведомственные сегменты (включая серверы импорта ЕГИС ОТБ) — это и есть карта доступных через ViPNet ресурсов (вероятные upstream-цели FTP-прокси):

Блок маршрутовКомментарий
10.10.1.0/2410.10.3.0/24 (десятки мелких подсетей /31/24)Сегменты защищённой ведомственной сети контрагентов
10.10.104.14, 10.10.104.50Отдельные хосты / служебные узлы
10.10.255.110.10.255.250Служебные узлы ViPNet
11.0.0.0/8Крупный блок партнёрской сети
172.16.16.100/31, 172.16.16.103/111/139/160, 172.16.17.205/206, 172.16.32.32Отдельные хосты контрагентов

Служебный трафик ViPNet: UDP 41034, 55781; DNS внутри туннеля — 7.1.39.7:53 (обслуживает vipnetclient).

🟠 ⚠️ В какой именно из этих сетей резолвятся *.egis-otb.local — уточнить через getent hosts ack.import.inet.egis-otb.local. Маршруты показывают, что цели достижимы именно через ViPNet, а не напрямую.

3.4 Схема каналов доступа

flowchart TB
  admin["Админ / АРМ
r3ddan9, evrotrans"]:::ext zbx["Zabbix server"]:::ext contra["Контрагенты"]:::ext vipnetnet["Сеть ViPNet
контрагенты, ЕГИС ОТБ"]:::ext subgraph Host["ХОСТ vm-...-vipnet"] direction TB eth0["eth0 10.128.0.5
управление / интернет"]:::net proxy["ftp-proxy
0.0.0.0:21001-21004"]:::ftp vsftpd["vsftpd :48080"]:::ftp tun0["tun0 7.1.39.7
ViPNet"]:::vip end egis["ЕГИС ОТБ
*.import.inet.egis-otb.local:21021
pdp / onsi / timetable / ack"]:::ext admin -- "SSH 48008 (только ключи)" --> eth0 zbx -- "TCP 10050" --> eth0 contra -- "FTP 48080 + 21001-21004" --> proxy vipnetnet -- "шифрованный туннель" --> tun0 vsftpd -. "приём из 10.128.0.0/24" .- eth0 tun0 == "FTP через ViPNet" ==> egis classDef ftp fill:#0f2417,stroke:#56d364,color:#dbe4ee classDef net fill:#11202e,stroke:#4ea1ff,color:#dbe4ee classDef vip fill:#1d1430,stroke:#bc8cff,color:#e9def9 classDef ext fill:#12161c,stroke:#5a6675,color:#cfd8e2
Рис. 1 — Каналы доступа: управление только из внутренней сети 10.128.0.0/24, SSH на порту 48008 (только ключи), защищённый обмен через ViPNet-туннель tun0 (DNS 7.1.39.7:53).
🔴 Локальный firewall выключен (ufw inactive, iptables -P INPUT ACCEPT) — фильтрация только на уровне облачных security-groups Yandex Cloud. См. AUDIT.html.

4. Прикладной слой — FTP-шлюз

Важное уточнение по реальным данным (docker-compose.yml, docker inspect): контейнеры — это не FTP-серверы, а прокси протокола FTP (/usr/sbin/ftp-proxy -n -d, пакет proxy-suite). Они не хранят файлы, а проксируют FTP-соединения к вышестоящим (upstream) FTP-серверам. Конфигурация каждого монтируется только для чтения из ./ftp-<name>/config//etc/proxy-suite/.

Узел совмещает две FTP-роли: входной сервер vsftpd (приём) и 4 исходящих прокси ftp-proxy (передача в ЕГИС ОТБ).

4.1 Состав стека (compose-проект stable)

flowchart TB
  clients["Внутренние системы / клиенты"]:::ext

  vsftpd["vsftpd
:48080 (хост)"]:::ftp subgraph Docker["Docker · compose project «stable»
/home/evrotrans/stable"] direction LR pdp["ftp-pdp
:21001"]:::ftp onsi["ftp-onsi
:21002"]:::ftp timetable["ftp-timetable
:21003"]:::ftp ack["ftp-ack
:21004"]:::ftp end upstream["Upstream FTP-серверы контрагентов
*.import.inet.egis-otb.local:21021"]:::ext clients -- "FTP 48080" --> vsftpd clients -- "FTP 21001-21004" --> pdp clients --> onsi clients --> timetable clients --> ack pdp -- "FTP" --> upstream onsi -- "FTP" --> upstream timetable -- "FTP" --> upstream ack -- "FTP" --> upstream classDef ftp fill:#0f2417,stroke:#56d364,color:#dbe4ee classDef ext fill:#12161c,stroke:#5a6675,color:#cfd8e2
Рис. 2 — Стек FTP-прокси: входной vsftpd (:48080) и четыре прокси-канала (21001-21004) в Docker-проекте «stable», проксирующие FTP к upstream-серверам контрагентов (*.import.inet.egis-otb.local:21021).
Сервис (compose)КонтейнерСлушаетUpstream (через ViPNet)Порт upstreamUser/Group
ftp-pdpstable-ftp-pdp-10.0.0.0:21001auto.pdp.import.inet.egis-otb.local21021nobody/nogroup
ftp-onsistable-ftp-onsi-10.0.0.0:21002onsi.import.inet.egis-otb.local21021nobody/nogroup
ftp-timetablestable-ftp-timetable-10.0.0.0:21003timetable.import.inet.egis-otb.local21021nobody/nogroup
ftp-ackstable-ftp-ack-10.0.0.0:21004ack.import.inet.egis-otb.local21021nobody/nogroup
(хост) vsftpd*:48080— (приём от r3ddan9/evrotrans)
✅ Все прокси запущены как User nobody / Group nogroup (минимальные привилегии), процесс /usr/sbin/ftp-proxy -n -d. Контейнеры файлы не хранят — только проксируют.

4.2 Входной FTP-сервер vsftpd (порт 48080)

Запущен на хосте (systemd vsftpd.service), вне Docker. Ключевые параметры /etc/vsftpd.conf:

ПараметрЗначениеСмысл
listen_port48080Порт
listen / listen_ipv6YES / NOТолько IPv4
anonymous_enableNOАнонимный вход запрещён
local_enableYESВход локальных системных пользователей
write_enableYESРазрешена запись
local_umask022Маска новых файлов
chroot_local_userYESКаждый пользователь заперт в своём каталоге
local_root/home/$USER/Корень = домашний каталог
allow_writeable_chrootYES🟠 Разрешён writable-chroot (небольшое послабление)
user_sub_token$USERПодстановка имени в путь
userlist_enableYESВключён список пользователей
userlist_file/etc/vsftpd.userlistФайл списка
userlist_denyNOБелый список — пускать только r3ddan9 и evrotrans
ssl_enableNO🔴 Шифрование выключено — открытый текст
rsa_cert_filesnakeoilСертификат прописан, но не используется (SSL off)
connect_from_port_20YESАктивный режим данных с порта 20
pam_service_namevsftpdPAM-сервис
xferlog_enable / log_ftp_protocolYESЛогирование в /var/log/vsftpd.log
force_dot_filesyesПоказывать скрытые файлы
secure_chroot_dir/var/run/vsftpd/emptyСлужебный пустой каталог

Список доступа /etc/vsftpd.userlist: r3ddan9, evrotrans (те же, что в AllowUsers SSH).

🔴 Риск: по открытому FTP передаются пароли учёток r3ddan9 и evrotrans — а это те же аккаунты, что имеют SSH/sudo/docker. Перехват трафика = компрометация привилегированных пользователей. Смягчает только нахождение канала во внутренней сети.

4.3 Сетевая модель: network_mode: host

Все 4 контейнера запущены в сетевом пространстве хоста (network_mode: host), а не в изолированном bridge. Следствия:

4.4 Параметры безопасности контейнеров (из compose / inspect)

ПараметрЗначениеОценка
privilegedfalse
SecurityOptno-new-privileges=true, apparmor=docker-default запрет эскалации + профиль AppArmor
Монтирование конфига./ftp-*/config → /etc/proxy-suite режим :ro только чтение
Docker-сокет в контейнерне проброшен
CapAdd / CapDropnull / nullстандартный набор capabilities
ReadonlyRootfsfalse
DOCKER_CONTENT_TRUST1.env) проверка подписей образов
Логированиеjson-file, max-size=64m, max-file=4, compress=true
RestartPolicyalways
MaskedPaths / ReadonlyPathsстандартные (/proc/kcore, /sys/firmware, …) дефолт Docker
network_modehost🟠 нет сетевой изоляции (см. §4.3)
Вывод: прикладной стек аккуратно захардненен — единственная уступка безопасности это network_mode: host, осознанно выбранный из-за специфики FTP.

4.5 Конфигурация и секреты

5. Удалённый доступ и АРМ (десктоп)

Узел несёт полноценное графическое окружение — нетипично для сервера, объясняется ролью АРМ ViPNet (для работы с криптоклиентом часто нужен GUI).

КомпонентСервисДоступ / канал
Менеджер входа / X11lightdm, XorgЛокальная консоль (greeter активен, seat0)
Удалённый рабочий столTigerVNC (/etc/tigervnc, ~/.vnc/...SrvKey.pem)✅ сейчас не запущен (нет systemd-юнита, не слушает порт). По логам поднимался на localhost:5903 (только loopback), пароль задан (~/.vnc/passwd, 600). Доступ — лишь через SSH-туннель
Печатьcups, cups-browsed✅ только localhost (127.0.0.1:631, [::1]:631)
Автообнаружение принтеровcups-browsed🟠 вещание в сеть
mDNS / Zeroconfavahi-daemon🟠 5353/udp + 38317/39398 вещание
Десктоп-демоныcolord, upower, switcheroo-control, rtkit-daemon, udisks2, accounts-daemon, ModemManagerЛокально
VNC детально: systemd-юнита *vnc* нет, порт 590x сейчас закрыт. Из лога ~/.vnc/*.log: запускался на дисплее :3, Listening for VNC connections on local interface(s), port 5903, подключения только с 127.0.0.1, последняя активность — 23 января. Пароль VNC установлен. Удалённый доступ к десктопу возможен лишь после проброса порта по SSH — это правильная схема, риск низкий. Ключ/сертификат VNC-сервера лежат у пользователя evrotrans — то есть удалённый рабочий стол предназначен именно для этого аккаунта.
🟠 ModemManager, wpa_supplicant, switcheroo-control, cups-browsed, avahi-daemon на серверном узле избыточны (атрибуты рабочей станции / ноутбука).

5.1 SSH

ПараметрЗначениеНазначение
port48008Нестандартный порт
permitrootloginnoRoot-логин запрещён
pubkeyauthenticationyesАутентификация по ключам
passwordauthenticationnoПарольный вход отключён
maxauthtries3Лимит попыток за сессию
x11forwardingyes🟠 Проброс X11 (есть GUI; лучше no)
gatewayportsnoЗапрет проброса на внешние интерфейсы
allowusersr3ddan9 evrotransБелый список
🟠 Переиспользование ключа: один и тот же приватный ключ danil@IdeaPad-3-14ALC6 используется и здесь, и на первом сервере. Компрометация ноутбука IdeaPad-3-14ALC6 = доступ к обоим узлам. Подробнее — в AUDIT.html.

6. Криптозащита — ViPNet

ПараметрЗначение
Клиентvipnetclient / vipnetclientdaemon (systemd timer vipnetclientdaemon1002.timer, под UID 1002 = evrotrans)
Интерфейсtun0 7.1.39.7/32 (point-to-point)
Служебные портыUDP 41034, 55781
DNS7.1.39.7:53
Каталог/home/evrotrans/.vipnet/ — владелец root (не evrotrans)
Подкаталогиdata, etc, mftp, var, tmp — все drwx------ root ✅ (изолированы)
export.db49 КБ, rw-r--r-- (world-readable) 🟠 — экспорт справочника узлов; проверить чувствительность
ПодсистемыMFTP (mftp/) — защищённый файловый/почтовый транспорт; ViPNet CSP (for_rand.key — инициализация ГПСЧ)

Маршрутизация: через tun0 доступны сети контрагентов (см. §3.3) — это адресаты защищённого обмена. ViPNet — сертифицированное средство защиты канала; через него (включая MFTP) идёт основной защищённый файловый обмен с ведомственной сетью, в том числе передача в ЕГИС ОТБ.

7. Эксплуатация: мониторинг, бэкап, обновления

ПодсистемаКомпонентыПортыПримечание
Мониторингzabbix-agent210050/tcp (все интерфейсы)🟠 Снимает метрики; должен опрашиваться только сервером Zabbix — ограничить firewall'ом по IP
Резервное копирование / защитаAcronis Cyber Protect: acronis_mms, acronis_schedule, active-protection, aakore, acp-update-controller, adp-agent, task-managerlocalhost (6109, 9772, 9850, 24100-24102, 35375, 43234, 33159) + grpm-sync на *:41765 🟠Бэкап + антивирус; основной набор портов — только localhost ✅
Облачный агентgoogle-guest-agentУправляет SSH-ключами и google-sudoers через метаданные Yandex Cloud
Обновленияunattended-upgradesАвтопатчи безопасности ✅; таймеры apt-daily(-upgrade), fwupd-refresh
Времяsystemd-timesyncdNTP
Именаsystemd-resolved127.0.0.53:53+ ViPNet DNS на 7.1.39.7
🟠 Acronis: бóльшая часть портов — только localhost ✅. Исключение — grpm-sync-unit на *:41765 (все интерфейсы).

8. Пользователи и роли

ПользовательUIDОболочкаПарольРоль в архитектуре
root0/bin/bash🔒 L (заблокирован)Системный (SSH-вход заблокирован)
y4tsun0v1000/bin/bashP (задан)Orphan от первичной настройки VM (⚠️ беспарольный sudo — см. аудит)
r3ddan91001/bin/bashPАдминистратор (danil): SSH, sudo (с паролем), группа docker
evrotrans1002/bin/bashPОператор узла: владелец ViPNet, VNC, Docker-стека FTP (/home/evrotrans/stable), группа docker
ftp114/usr/sbin/nologinДемон FTP (служебный), /srv/ftp
🔴 /etc/sudoers.d/90-cloud-init-users: y4tsun0v ALL=(ALL) NOPASSWD:ALL — беспарольный root у orphan-аккаунта. Подробности и риски — в AUDIT.html.

9. Сводная карта компонентов

flowchart TB
  subgraph Net["Сеть"]
    direction TB
    eth0["eth0 10.128.0.5
управление / мониторинг"]:::net eth1["eth1 10.0.0.5
данные (резерв, metric 200)"]:::net tun0["tun0 7.1.39.7
ViPNet (point-to-point)"]:::net end subgraph App["Прикладной слой"] direction TB vsftpd["vsftpd :48080 (вход, хост)"]:::ftp proxy["ftp-proxy :21001-21004"]:::ftp chans["stable-ftp-pdp / onsi / timetable / ack"]:::ftp proxy --> chans end subgraph Arm["АРМ / десктоп"] direction TB lightdm["LightDM / Xorg"]:::svc vnc["TigerVNC (localhost)"]:::svc cups["CUPS (localhost)"]:::svc end subgraph Ops["Эксплуатация"] direction TB zbx["Zabbix :10050"]:::svc acronis["Acronis Cyber Protect"]:::svc gga["google-guest-agent"]:::svc uu["unattended-upgrades"]:::svc end subgraph Vip["ViPNet"] direction TB vipclient["vipnetclient"]:::vip csp["ViPNet CSP / MFTP"]:::vip end sshd["sshd :48008 (ключи)"]:::svc eth0 -- "SSH" --> sshd eth0 --> vsftpd eth0 --> proxy eth0 --> zbx tun0 --> vipclient classDef ftp fill:#0f2417,stroke:#56d364,color:#dbe4ee classDef net fill:#11202e,stroke:#4ea1ff,color:#dbe4ee classDef vip fill:#1d1430,stroke:#bc8cff,color:#e9def9 classDef svc fill:#10242b,stroke:#3fb6c9,color:#cfeef5
Рис. 3 — Сводная карта компонентов узла: сеть (eth0 / eth1 / tun0), прикладной слой (vsftpd + ftp-proxy), АРМ-десктоп, эксплуатация (мониторинг / бэкап / обновления) и криптозащита ViPNet.

10. Сквозной поток данных в ЕГИС ОТБ

flowchart TB
  oper["Оператор
r3ddan9 / evrotrans"]:::ext vsftpd["vsftpd :48080"]:::ftp file["файл в /home/<user>/
(chroot в $HOME)"]:::net proxy["ftp-proxy :2100x
User nobody, network_mode host"]:::ftp egis["<канал>.import.inet.egis-otb.local:21021
серверы импорта ЕГИС ОТБ
pdp / onsi / timetable / ack"]:::ext oper -- "FTP открытый текст (ssl_enable=NO)" --> vsftpd vsftpd --> file file -- "подаётся на прокси" --> proxy proxy == "FTP через ViPNet-туннель tun0
(шифрование на уровне сети)" ==> egis classDef ftp fill:#0f2417,stroke:#56d364,color:#dbe4ee classDef net fill:#11202e,stroke:#4ea1ff,color:#dbe4ee classDef ext fill:#12161c,stroke:#5a6675,color:#cfd8e2 classDef warn fill:#2a1416,stroke:#ff5c5c,color:#ffd9d9 class oper,vsftpd warn
Рис. 4 — Сквозной поток данных в ЕГИС ОТБ: приём по открытому FTP (48080) → файл в chroot-домашнем каталоге → проксирование (ftp-proxy, nobody) → передача через ViPNet-туннель tun0 на серверы импорта ЕГИС ОТБ (:21021).
  1. Приём: оператор (r3ddan9/evrotrans) кладёт файлы по FTP в свой $HOME через vsftpd (48080) — в открытом виде, изнутри сети 10.128.0.0/24.
  2. Проксирование: соответствующий ftp-proxy (21001–21004) пробрасывает FTP-сессию к серверу импорта *.egis-otb.local:21021. Контейнеры файлы не хранят — только проксируют, работая под nobody.
  3. Транспорт: маршрут до egis-otb.local идёт через ViPNet-туннель (tun0), который шифрует канал на сетевом уровне (компенсирует то, что сам FTP открытый).
  4. Управление: r3ddan9 — по SSH (48008); evrotrans — оператор узла (ViPNet/GUI, при необходимости VNC через SSH-туннель).
  5. Наблюдаемость: Zabbix (10050) снимает метрики; Acronis делает бэкап и антивирусную защиту.

11. Эксплуатация (runbook)

11.1 Расположение ключевых файлов

ЧтоПуть
Docker-стек (compose)/home/evrotrans/stable/docker-compose.yml
Переменные окружения/home/evrotrans/stable/.env
Конфиги прокси (per-канал)/home/evrotrans/stable/ftp-<pdp|onsi|timetable|ack>/config/*.conf
Конфиг vsftpd/etc/vsftpd.conf
Список FTP-доступа/etc/vsftpd.userlist
Лог vsftpd/var/log/vsftpd.log
ViPNet/home/evrotrans/.vipnet/ (root)
VNC/home/evrotrans/.vnc/

11.2 Типовые операции

# Статус прикладного стека
cd /home/evrotrans/stable && docker compose ps
docker ps --format 'table {{.Names}}\t{{.Status}}\t{{.Ports}}'

# Перезапуск одного канала (пример: ack)
cd /home/evrotrans/stable && docker compose restart ftp-ack

# Логи прокси (диагностика передачи в ЕГИС ОТБ)
docker logs --tail 100 -f stable-ftp-ack-1

# Пересборка образов (получить свежие патчи)
cd /home/evrotrans/stable && docker compose build --pull && docker compose up -d

# Статус/логи входного FTP
systemctl status vsftpd
tail -f /var/log/vsftpd.log

# Состояние ViPNet-туннеля
ip addr show tun0
ip route show | grep tun0
systemctl status vipnetclientdaemon1002

# Проверка доступности сервера импорта ЕГИС ОТБ
getent hosts ack.import.inet.egis-otb.local

11.3 Зависимости запуска

vipnetclientdaemon (туннель) → docker/контейнеры ftp-proxy (передача в ЕГИС ОТБ работает только при поднятом tun0). При недоступности ViPNet прокси не смогут достучаться до *.egis-otb.local.

12. Открытые вопросы / зоны неопределённости

#ВопросКоманда / источникПриоритет
1Облачные security-groups Yandex Cloud (единственный фильтр периметра — локальный FW выключен)консоль Yandex Cloud → VPC → Firewall rules🔴
2Ключи SSH r3ddan9 / evrotrans (в выводе их не было — вероятно, инжектируются guest-agent)cat /home/{r3ddan9,evrotrans}/.ssh/authorized_keys🟠
3Метаданные Yandex Cloud / OS Login (альтернативный канал доступа)консоль Yandex Cloud; curl -H "Metadata-Flavor: Google" .../oslogin/users🟠
4Резолв *.egis-otb.local (в какой ViPNet-сети серверы импорта)getent hosts <host>.import.inet.egis-otb.local🟢
5Чувствительность export.db (world-readable)проверить содержимое🟢
6Целостность системы (не было в audit.sh)getcap -r / 2>/dev/null; debsums -c; world-writable файлы🟢
7История / поведениеjournalctl -p err -b; ~/.bash_history; docker logs🟢

13. Приложения: сырые конфигурации

13.1 docker-compose.yml (структура)

Проект stable, 4 сервиса (ftp-pdp, ftp-onsi, ftp-timetable, ftp-ack), все по шаблону:

version: "3"
services:
  ftp-<name>:
    build: ./ftp-<name>
    restart: always
    privileged: false
    network_mode: host
    security_opt:
      - "no-new-privileges=true"
      - "apparmor=docker-default"
    logging:
      driver: "json-file"
      options: { max-file: "4", max-size: "64m", compress: "true" }
    expose:  ["2100X"]
    ports:   ["2100X:2100X"]
    volumes: ["./ftp-<name>/config/:/etc/proxy-suite/:ro"]
    environment:
      TZ: ${ENV_TIMEZONE}

(маппинг порта: pdp→21001, onsi→21002, timetable→21003, ack→21004)

13.2 ftp-proxy *.conf (proxy-suite, общий вид)

[-Global-]
DestinationAddress   <канал>.import.inet.egis-otb.local
DestinationPort      21021
Group                nogroup
Port                 2100X
User                 nobody
КаналDestinationAddressPort (local)
pdpauto.pdp.import.inet.egis-otb.local21001
onsionsi.import.inet.egis-otb.local21002
timetabletimetable.import.inet.egis-otb.local21003
ackack.import.inet.egis-otb.local21004

13.3 /etc/vsftpd.conf (значимые директивы)

listen=YES
listen_ipv6=NO
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
use_localtime=YES
xferlog_enable=YES
log_ftp_protocol=YES
connect_from_port_20=YES
listen_port=48080
xferlog_file=/var/log/vsftpd.log
xferlog_std_format=YES
chroot_local_user=YES
secure_chroot_dir=/var/run/vsftpd/empty
pam_service_name=vsftpd
rsa_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
rsa_private_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
ssl_enable=NO
setproctitle_enable=YES
force_dot_files=yes
user_sub_token=$USER
local_root=/home/$USER/
allow_writeable_chroot=YES
userlist_enable=YES
userlist_file=/etc/vsftpd.userlist
userlist_deny=NO

13.4 .env

TZ="Europe/Moscow"
ENV_TIMEZONE="Europe/Moscow"
DOCKER_CONTENT_TRUST=1