Переезд: 188.246.224.93 заблокирован у российских операторов — продукты недоступны клиентам с 25.08 #3110

Closed
opened 2026-08-26 10:46:01 +00:00 by lekss361 · 2 comments
Owner

Что происходит

С момента переключения DNS на Poincare (25.08) продукты недоступны из российских сетей. Проверено на двух разных провайдерах — домашнем и мобильном. Симптом без VPN: TCP-соединение к 188.246.224.93:443 не устанавливается, таймаут 21 с.

При этом снаружи сервер полностью исправен: с Beget тот же адрес отвечает за 0.07 с с валидным сертификатом, за сутки на него пришло 26 успешных запросов с зарубежных адресов.

Доказательство: трассировка

tracert -d 188.246.224.93          tracert -d 46.173.16.127
 1   1 ms  192.168.1.1              1   2 ms  192.168.1.1
 2   *  *  *  Request timed out      2   8 ms  95.165.128.1     ← провайдер отвечает
 3..16 — все таймауты                3   7 ms  62.231.31.165
                                     4   8 ms  62.231.31.164
                                     5   7 ms  79.104.235.131
                                     6   5 ms  195.218.186.161
                                    11  43 ms  46.173.16.127    ← Trace complete

Ключевое: узел 95.165.128.1 — первый хоп провайдера — отвечает для адреса Beget и молчит для адреса Selectel. Один и тот же узел, разное поведение в зависимости от адреса назначения. Пакеты к 188.246.224.93 отбрасываются на входе в сеть оператора. Это картина null-route, а не потери в магистрали и не проблема Selectel.

Мобильный интернет ведёт себя так же — то есть это не один оператор.

Что исключено измерениями

версия чем опровергнута
конфигурация Caddy caddy adapt показывает :443 и все 9 доменов; нет фильтров по IP, гео, rate_limit, on_demand, ограничений TLS; контейнер без перезапусков; локально сайты отдают 200
сертификат цепочка из 4 звеньев до ISRG Root X1, Verify return code: 0, SAN совпадает, срок до 31.10.2026; TLS 1.3 + ALPN h2 и TLS 1.2 проходят с чистого пути
фаервол сервера UFW пропускает 80/443 отовсюду; fail2ban держит только sshd, банов нет
настройки в панели Selectel порт «Интернет» включён, VLAN общий; из услуг подключена только сама машина — ни файрвола, ни защиты от DDoS, ни CDN; сети не требуются
лимит MAC-адресов Selectel (25/порт) eth0 не входит ни в один мост — все 37 MAC внутренние (veth докера и zoobr0), наружу через NAT выходит один MAC f0:2f:74:b0:df:df
блокировка доменов новый домен app.gendsgn.ru, заведённый 26.08 на этот же адрес, недоступен так же
вина переезда как такового инфра-домены на Beget (git, errors, obsidian, metrics) работают штатно

Снятые доводы (важно для чистоты дела)

Часть моих ранних замеров делалась с машины, где активен VPN с локальным прокси, и оказалась артефактом: «фантомные» открытые порты 12345/54321, подменённый сертификат example.com при обращении на адрес Poincare, опыт со слушателем на 9443 и браузерные ERR_CONNECTION_CLOSED. Всё это снято и в обращение к хостеру не включалось. Достоверны только замеры без VPN (таймаут, трассировка) и замеры с серверов.

Последствия

  • МЕРА недоступна клиентам с 25.08. По журналам Caddy: до переезда 189–506 браузерных запросов в сутки с реальными маршрутами приложения (/trade-in/api/v1/me, чанки Next.js), после — только сканеры, обращений к маршрутам приложения от внешних клиентов нет.
  • Откат подорожал. Раннбук #3057 исходил из «откат бесплатный, Beget нетронут». Это больше не так: продуктовые контейнеры на Beget остановлены, копии баз удалены 26.08. Дампы целы и проверены pg_restore -l (/opt/gendesign/backups/pre-drop-20260826-gendesign/), восстановление — полтора-два часа.
  • Окно 30.08 в текущем виде бессмысленно — переезжать на адрес, до которого не доходят клиенты, нельзя.

Что делать

  1. Обращение в Selectel: запросить замену IP и уточнить, затрагивает ли ограничение всю подсеть — иначе адрес из того же пула может оказаться таким же.
  2. Параллельно проверить адрес в реестре блокировок и выяснить причину: типовой случай — адрес был заблокирован за прежним арендатором и переиспользован.
  3. Решить, поднимать ли продукты обратно на Beget на время замены адреса.
  4. После получения рабочего адреса — назначить новую дату окна.

Пункты 1, 2 и 4 требуют владельца. Пункт 3 готов выполнить по команде.

Refs #3057, #2989

## Что происходит С момента переключения DNS на Poincare (25.08) продукты недоступны из российских сетей. Проверено на двух разных провайдерах — домашнем и мобильном. Симптом без VPN: **TCP-соединение к `188.246.224.93:443` не устанавливается, таймаут 21 с**. При этом снаружи сервер полностью исправен: с Beget тот же адрес отвечает за 0.07 с с валидным сертификатом, за сутки на него пришло 26 успешных запросов с зарубежных адресов. ## Доказательство: трассировка ``` tracert -d 188.246.224.93 tracert -d 46.173.16.127 1 1 ms 192.168.1.1 1 2 ms 192.168.1.1 2 * * * Request timed out 2 8 ms 95.165.128.1 ← провайдер отвечает 3..16 — все таймауты 3 7 ms 62.231.31.165 4 8 ms 62.231.31.164 5 7 ms 79.104.235.131 6 5 ms 195.218.186.161 11 43 ms 46.173.16.127 ← Trace complete ``` Ключевое: узел `95.165.128.1` — первый хоп провайдера — **отвечает для адреса Beget и молчит для адреса Selectel**. Один и тот же узел, разное поведение в зависимости от адреса назначения. Пакеты к `188.246.224.93` отбрасываются на входе в сеть оператора. Это картина null-route, а не потери в магистрали и не проблема Selectel. Мобильный интернет ведёт себя так же — то есть это не один оператор. ## Что исключено измерениями | версия | чем опровергнута | |---|---| | конфигурация Caddy | `caddy adapt` показывает :443 и все 9 доменов; нет фильтров по IP, гео, `rate_limit`, `on_demand`, ограничений TLS; контейнер без перезапусков; локально сайты отдают 200 | | сертификат | цепочка из 4 звеньев до ISRG Root X1, `Verify return code: 0`, SAN совпадает, срок до 31.10.2026; TLS 1.3 + ALPN h2 и TLS 1.2 проходят с чистого пути | | фаервол сервера | UFW пропускает 80/443 отовсюду; fail2ban держит только sshd, банов нет | | настройки в панели Selectel | порт «Интернет» включён, VLAN общий; из услуг подключена только сама машина — ни файрвола, ни защиты от DDoS, ни CDN; сети не требуются | | лимит MAC-адресов Selectel (25/порт) | `eth0` не входит ни в один мост — все 37 MAC внутренние (veth докера и `zoobr0`), наружу через NAT выходит один MAC `f0:2f:74:b0:df:df` | | блокировка доменов | новый домен `app.gendsgn.ru`, заведённый 26.08 на этот же адрес, недоступен так же | | вина переезда как такового | инфра-домены на Beget (`git`, `errors`, `obsidian`, `metrics`) работают штатно | ## Снятые доводы (важно для чистоты дела) Часть моих ранних замеров делалась с машины, где активен VPN с локальным прокси, и оказалась артефактом: «фантомные» открытые порты 12345/54321, подменённый сертификат `example.com` при обращении на адрес Poincare, опыт со слушателем на 9443 и браузерные `ERR_CONNECTION_CLOSED`. Всё это **снято** и в обращение к хостеру не включалось. Достоверны только замеры без VPN (таймаут, трассировка) и замеры с серверов. ## Последствия - **МЕРА недоступна клиентам с 25.08.** По журналам Caddy: до переезда 189–506 браузерных запросов в сутки с реальными маршрутами приложения (`/trade-in/api/v1/me`, чанки Next.js), после — только сканеры, обращений к маршрутам приложения от внешних клиентов нет. - **Откат подорожал.** Раннбук #3057 исходил из «откат бесплатный, Beget нетронут». Это больше не так: продуктовые контейнеры на Beget остановлены, копии баз удалены 26.08. Дампы целы и проверены `pg_restore -l` (`/opt/gendesign/backups/pre-drop-20260826-gendesign/`), восстановление — полтора-два часа. - **Окно 30.08 в текущем виде бессмысленно** — переезжать на адрес, до которого не доходят клиенты, нельзя. ## Что делать 1. Обращение в Selectel: запросить замену IP и уточнить, затрагивает ли ограничение всю подсеть — иначе адрес из того же пула может оказаться таким же. 2. Параллельно проверить адрес в реестре блокировок и выяснить причину: типовой случай — адрес был заблокирован за прежним арендатором и переиспользован. 3. Решить, поднимать ли продукты обратно на Beget на время замены адреса. 4. После получения рабочего адреса — назначить новую дату окна. Пункты 1, 2 и 4 требуют владельца. Пункт 3 готов выполнить по команде. Refs #3057, #2989
Author
Owner

Раннбук замены IP — подготовка закончена

Поддержка Selectel подтвердила: адрес заменить могут, но фильтрация не их, статуса подсети они не знают, и может потребоваться несколько итераций. При замене сервер уходит в офлайн, сеть настраивается вручную через Rescue (либо переустановка ОС с потерей данных — этот путь нам не нужен).

Дополнительный довод за замену: у смежного проекта на Selectel всё работает — значит фильтрация точечная по адресу, а не по подсети целиком.

Что НЕ придётся трогать (проверено)

  • Отпечаток SSH-ключа хоста не меняется — машина та же: SHA256:Og/DwfWg3DjLFk9D9AOcK2Wue1B2MP/RI2d9n+sHOw8 (ED25519). Секрет DEPLOY_SSH_FINGERPRINT остаётся валидным, повторный ssh-keyscan не нужен.
  • Сертификаты остаются валидными — они привязаны к доменам, а не к адресу. Продление потребует уже обновлённого DNS.
  • cloud-init не перезапишет netplan — управление сетью у него отключено (/etc/cloud/cloud.cfg.d/99-disable-network-config.cfg, network: {config: disabled}). Классическая ловушка «отредактировал, перезагрузился, адрес вернулся» здесь не сработает.
  • Правила ufw с адресами касаются только подсети LXC-зоопарка 10.100.0.0/24 — к публичному адресу отношения не имеют.
  • Упоминания адреса в репозитории — только комментарии (deploy.yml, apps.caddy, infra.caddy, docker-compose.prod.yml, docs/observability.md, crontab-poincare.cron, db-bootstrap). Функционально адрес нигде не зашит. Исключение — ops/selectel-ci-access.sh:171, там HOST_IP по умолчанию равен старому адресу; при запуске передаётся переменной, но значение по умолчанию стоит поправить.

Текущая конфигурация сети (снимок до замены)

Файл /etc/netplan/50-cloud-init.yaml, статика, интерфейс сопоставляется по MAC:

network:
  version: 2
  renderer: networkd
  ethernets:
    id0:
      match: {macaddress: "f0:2f:74:b0:df:df"}
      optional: true
      addresses: ["188.246.224.93/24"]
      nameservers:
        addresses: [188.93.17.19, 188.93.16.19]
      routes:
        - {to: "0.0.0.0/0", via: "188.246.224.1"}
        - {to: "188.246.224.1", scope: "link"}

SSH на порту 22.

Порядок работ

1. До заявки. Сохранить копию netplan-файла (он выше, этого достаточно). Убедиться, что есть доступ в Rescue через панель Selectel.

2. Заявка в Selectel на замену адреса.

3. После замены — Rescue. Смонтировать корневой раздел и в /etc/netplan/50-cloud-init.yaml заменить:

  • addresses — новый адрес с маской;
  • via в маршруте по умолчанию и адрес в scope: link маршруте — новый шлюз (обычно .1 в новой подсети; точное значение даст поддержка).

match по MAC не трогать — интерфейс тот же. Затем загрузиться штатно, проверить ip a и ip r.

4. ПРОВЕРИТЬ НОВЫЙ АДРЕС ДО ПЕРЕКЛЮЧЕНИЯ DNS. Это важно: если новый адрес тоже отфильтрован, а DNS уже переведён — получаем ещё один простой на ровном месте. С российской сети без VPN:

curl -v --connect-to meraocenka.ru:443:<НОВЫЙ_IP>:443 https://meraocenka.ru/

Ответ 200 — адрес чистый, идём дальше. Таймаут — возвращаемся к пункту 2 за следующим адресом, DNS при этом не тронут и продукты остаются в текущем (пусть и нерабочем для РФ) состоянии, а не в худшем.

5. DNS — семь записей, все сейчас смотрят на старый адрес, TTL 600 с:

gendsgn.ru, www.gendsgn.ru, meraocenka.ru, www.meraocenka.ru, meraotsenka.ru, merahome.ru, app.gendsgn.ru

6. Секреты Forgejo. Если DEPLOY_HOST содержит адрес, а не имя — обновить, иначе CI-деплой пойдёт в никуда. Там же проверить DEPLOY_KNOWN_HOSTS (используется в deploy-tradein.yml): если строки привязаны к адресу, перегенерировать ssh-keyscan-ом по новому адресу. Сам ключ хоста прежний, меняется только адресная часть строки.

7. Локальные ssh-конфиги — алиас selectel указывает на старый адрес.

Проверка после переключения

  • с российской сети без VPN: meraocenka.ru → 200, gendsgn.ru → 401 (его basic-auth);
  • tracert до нового адреса должен доходить до цели, а не гаснуть на первом хопе провайдера;
  • деплой: любой мерж в main должен доехать;
  • метрики: агенты на Poincare должны остаться в Grafana (адрес приёмника у них — имя metrics.gendsgn.ru на Beget, от смены не зависит).

Откат

Если что-то пойдёт не так на шаге 3 — сервер доступен через Rescue, данные не трогаются. Полный откат продуктов на Beget остаётся запасным вариантом: дампы целы и проверены (/opt/gendesign/backups/pre-drop-20260826-gendesign/), подъём 1.5–2 часа.

Готов выполнить шаги 3–4 и 7 по команде; 2, 5, 6 — за владельцем (панель Selectel, DNS, секреты).

## Раннбук замены IP — подготовка закончена Поддержка Selectel подтвердила: адрес заменить могут, но фильтрация **не их**, статуса подсети они не знают, и **может потребоваться несколько итераций**. При замене сервер уходит в офлайн, сеть настраивается вручную через Rescue (либо переустановка ОС с потерей данных — этот путь нам не нужен). Дополнительный довод за замену: у смежного проекта на Selectel всё работает — значит фильтрация точечная по адресу, а не по подсети целиком. ### Что НЕ придётся трогать (проверено) - **Отпечаток SSH-ключа хоста не меняется** — машина та же: `SHA256:Og/DwfWg3DjLFk9D9AOcK2Wue1B2MP/RI2d9n+sHOw8` (ED25519). Секрет `DEPLOY_SSH_FINGERPRINT` остаётся валидным, повторный `ssh-keyscan` не нужен. - **Сертификаты остаются валидными** — они привязаны к доменам, а не к адресу. Продление потребует уже обновлённого DNS. - **cloud-init не перезапишет netplan** — управление сетью у него отключено (`/etc/cloud/cloud.cfg.d/99-disable-network-config.cfg`, `network: {config: disabled}`). Классическая ловушка «отредактировал, перезагрузился, адрес вернулся» здесь не сработает. - **Правила ufw с адресами** касаются только подсети LXC-зоопарка `10.100.0.0/24` — к публичному адресу отношения не имеют. - **Упоминания адреса в репозитории** — только комментарии (`deploy.yml`, `apps.caddy`, `infra.caddy`, `docker-compose.prod.yml`, `docs/observability.md`, `crontab-poincare.cron`, `db-bootstrap`). Функционально адрес нигде не зашит. Исключение — `ops/selectel-ci-access.sh:171`, там `HOST_IP` по умолчанию равен старому адресу; при запуске передаётся переменной, но значение по умолчанию стоит поправить. ### Текущая конфигурация сети (снимок до замены) Файл `/etc/netplan/50-cloud-init.yaml`, статика, интерфейс сопоставляется по MAC: ```yaml network: version: 2 renderer: networkd ethernets: id0: match: {macaddress: "f0:2f:74:b0:df:df"} optional: true addresses: ["188.246.224.93/24"] nameservers: addresses: [188.93.17.19, 188.93.16.19] routes: - {to: "0.0.0.0/0", via: "188.246.224.1"} - {to: "188.246.224.1", scope: "link"} ``` SSH на порту 22. ### Порядок работ **1. До заявки.** Сохранить копию netplan-файла (он выше, этого достаточно). Убедиться, что есть доступ в Rescue через панель Selectel. **2. Заявка в Selectel** на замену адреса. **3. После замены — Rescue.** Смонтировать корневой раздел и в `/etc/netplan/50-cloud-init.yaml` заменить: - `addresses` — новый адрес с маской; - `via` в маршруте по умолчанию и адрес в `scope: link` маршруте — новый шлюз (обычно `.1` в новой подсети; точное значение даст поддержка). `match` по MAC не трогать — интерфейс тот же. Затем загрузиться штатно, проверить `ip a` и `ip r`. **4. ПРОВЕРИТЬ НОВЫЙ АДРЕС ДО ПЕРЕКЛЮЧЕНИЯ DNS.** Это важно: если новый адрес тоже отфильтрован, а DNS уже переведён — получаем ещё один простой на ровном месте. С российской сети без VPN: ``` curl -v --connect-to meraocenka.ru:443:<НОВЫЙ_IP>:443 https://meraocenka.ru/ ``` Ответ 200 — адрес чистый, идём дальше. Таймаут — возвращаемся к пункту 2 за следующим адресом, DNS при этом не тронут и продукты остаются в текущем (пусть и нерабочем для РФ) состоянии, а не в худшем. **5. DNS — семь записей**, все сейчас смотрят на старый адрес, TTL 600 с: `gendsgn.ru`, `www.gendsgn.ru`, `meraocenka.ru`, `www.meraocenka.ru`, `meraotsenka.ru`, `merahome.ru`, `app.gendsgn.ru` **6. Секреты Forgejo.** Если `DEPLOY_HOST` содержит адрес, а не имя — обновить, иначе CI-деплой пойдёт в никуда. Там же проверить `DEPLOY_KNOWN_HOSTS` (используется в `deploy-tradein.yml`): если строки привязаны к адресу, перегенерировать `ssh-keyscan`-ом по новому адресу. Сам ключ хоста прежний, меняется только адресная часть строки. **7. Локальные ssh-конфиги** — алиас `selectel` указывает на старый адрес. ### Проверка после переключения - с российской сети без VPN: `meraocenka.ru` → 200, `gendsgn.ru` → 401 (его basic-auth); - `tracert` до нового адреса должен доходить до цели, а не гаснуть на первом хопе провайдера; - деплой: любой мерж в main должен доехать; - метрики: агенты на Poincare должны остаться в Grafana (адрес приёмника у них — имя `metrics.gendsgn.ru` на Beget, от смены не зависит). ### Откат Если что-то пойдёт не так на шаге 3 — сервер доступен через Rescue, данные не трогаются. Полный откат продуктов на Beget остаётся запасным вариантом: дампы целы и проверены (`/opt/gendesign/backups/pre-drop-20260826-gendesign/`), подъём 1.5–2 часа. Готов выполнить шаги 3–4 и 7 по команде; 2, 5, 6 — за владельцем (панель Selectel, DNS, секреты).
Author
Owner

Решено заменой адреса: 188.246.224.93188.124.37.140

Поддержка Selectel выполнила замену в ночь на 27.08 (сообщение 00:37). Замена, как и предупреждали, уронила сервер: адрес на порте сменился, а в ОС остался прежний — разбор и восстановление в #3119.

Фильтрации на новом адресе нет. Проверено после переключения DNS с машины владельца, российский провайдер, без VPN:

gendsgn.ru       401 за 0.27 с   (гейт basic-auth, так и должно быть)
meraocenka.ru    200 за 0.17 с   70 448 байт
merahome.ru      200 за 0.26 с
meraotsenka.ru   200 за 0.51 с

Именно это было предметом задачи — старый адрес не открывался у российских операторов ни с домашнего интернета, ни с мобильного.

Оговорка из письма поддержки, которую стоит помнить: «статуса фильтрации подсети у нас нет, фильтрация выполняется не нашей стороной, адреса могут как попадать под неё, так и удаляться» и «возможно потребуется несколько итераций замены». То есть гарантии, что новый адрес не попадёт под фильтр позже, никто не даёт. Если повторится — процедура теперь известна и занимает около двадцати минут: замена адреса, Rescue, правка netplan, DNS.

Закрываю.

## Решено заменой адреса: `188.246.224.93` → `188.124.37.140` Поддержка Selectel выполнила замену в ночь на 27.08 (сообщение 00:37). Замена, как и предупреждали, уронила сервер: адрес на порте сменился, а в ОС остался прежний — разбор и восстановление в #3119. **Фильтрации на новом адресе нет.** Проверено после переключения DNS с машины владельца, российский провайдер, без VPN: ``` gendsgn.ru 401 за 0.27 с (гейт basic-auth, так и должно быть) meraocenka.ru 200 за 0.17 с 70 448 байт merahome.ru 200 за 0.26 с meraotsenka.ru 200 за 0.51 с ``` Именно это было предметом задачи — старый адрес не открывался у российских операторов ни с домашнего интернета, ни с мобильного. Оговорка из письма поддержки, которую стоит помнить: **«статуса фильтрации подсети у нас нет, фильтрация выполняется не нашей стороной, адреса могут как попадать под неё, так и удаляться»** и «возможно потребуется несколько итераций замены». То есть гарантии, что новый адрес не попадёт под фильтр позже, никто не даёт. Если повторится — процедура теперь известна и занимает около двадцати минут: замена адреса, Rescue, правка netplan, DNS. Закрываю.
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: lekss361/gendesign#3110
No description provided.