# Runbook: выход в интернет через RU-хостинг (SSH SOCKS)

Симптом: **RU-сервисы режут доступ из‑за рубежа** (бан иностранного IP). Нужен выход с IP `ru.hunab.app` (**149.154.64.19**).

Команды ниже — **из любой папки** (абсолютные пути).

Корень репо: `/Users/eternal/code/local_machine`

---

## Быстрый старт (включить RU)

```bash
bash /Users/eternal/code/local_machine/scripts/vpn/exit-via-ru.sh
```

Что делает: SOCKS `127.0.0.1:10809` → `hsites-ahau` + **системный SOCKS** на Wi‑Fi.

Проверка:

```bash
bash /Users/eternal/code/local_machine/scripts/vpn/ssh-exit-mode.sh verify
```

Ожидание в блоке «Через SOCKS»: **149.154.64.19**, `country: RU`.  
В браузере: https://ipinfo.io → RU.

Статус портов / системного прокси:

```bash
bash /Users/eternal/code/local_machine/scripts/vpn/ssh-exit-mode.sh status
```

---

## Другие режимы

| Цель | Команда |
|------|---------|
| Выход с **IP RU** | `bash /Users/eternal/code/local_machine/scripts/vpn/exit-via-ru.sh` |
| Выход с **IP DO** (через RU) | `bash /Users/eternal/code/local_machine/scripts/vpn/exit-via-ru-do.sh` |
| Снять туннели + системный SOCKS | `bash /Users/eternal/code/local_machine/scripts/vpn/exit-via-local.sh` |

---

## Мёртвый системный SOCKS 10809

**Симптомы:** `curl` / `nc` до почтовых серверов OK, но Thunderbird не качает **все** ящики; браузер «висит»; Cursor с `socks5://127.0.0.1:10809` мёртв.

**RCA (2026-07-22):** после `exit-via-ru` / `exit-via-ru-do` системный SOCKS Wi‑Fi остаётся на `127.0.0.1:10809`, а SSH-туннель на порту уже не слушает. Thunderbird (и др.) используют системный прокси → отказ сразу на всех аккаунтах.

**Проверка:**

```bash
networksetup -getsocksfirewallproxy "Wi-Fi"
lsof -nP -iTCP:10809 -sTCP:LISTEN || echo "10809: nothing"
bash /Users/eternal/code/local_machine/scripts/vpn/ssh-exit-mode.sh status
```

Паттерн: `Enabled: Yes`, Port `10809`, а `lsof` пустой.

---

## Сброс при проблемах с интернетом

Если после `exit-via-ru` «пропал интернет», браузер не грузит, Thunderbird молчит при живом `curl`, или туннель умер при включённом системном SOCKS — **сначала снять мёртвый системный SOCKS**, потом при необходимости recover хотспота.

### 0. Мягкий сброс (сохранить Telegram на 1081)

Только выключить системный SOCKS — **не** убивает LaunchAgent / SSH на **1081**:

```bash
networksetup -setsocksfirewallproxystate "Wi-Fi" off
networksetup -getsocksfirewallproxy "Wi-Fi"   # Enabled: No
```

После этого в Thunderbird — «Получить сообщения».

### 1. Полный сброс SSH-exit

```bash
bash /Users/eternal/code/local_machine/scripts/vpn/exit-via-local.sh
```

Снимает SSH SOCKS на **10809 / 1081 / 1082** и выключает системный SOCKS на Wi‑Fi. Telegram через 1081 после этого нужно поднять снова (LaunchAgent или `telegram-socks-tunnel.sh`).

Проверка, что системный SOCKS выключен:

```bash
networksetup -getsocksfirewallproxy "Wi-Fi"
```

Ожидание: `Enabled: No`.

Быстрый тест сети без прокси:

```bash
curl -sS --max-time 8 https://1.1.1.1
curl -sS --max-time 8 https://ipinfo.io/ip
```

### 2. Если интернет всё ещё мёртв (хотспот / stale Manual / route)

```bash
bash /Users/eternal/code/local_machine/docs/connectivity/scripts/macos-hotspot-network-recover.sh recover
```

Запросит sudo. Подробно: [HOTSPOT_NETWORK_EMERGENCY.md](../HOTSPOT_NETWORK_EMERGENCY.md).

### 3. Ядерный сброс прокси вручную (если скрипт недоступен)

```bash
networksetup -setautoproxystate "Wi-Fi" off
networksetup -setsocksfirewallproxystate "Wi-Fi" off
pkill -f 'ssh.*-D 10809' 2>/dev/null || true
pkill -f 'ssh.*-D 1081' 2>/dev/null || true
pkill -f 'ssh.*-D 1082' 2>/dev/null || true
curl -sS --max-time 8 https://ipinfo.io/ip
```

### 4. Снова включить RU (после рабочего интернета)

```bash
curl -sS --max-time 8 https://1.1.1.1 && \
  bash /Users/eternal/code/local_machine/scripts/vpn/exit-via-ru.sh && \
  bash /Users/eternal/code/local_machine/scripts/vpn/ssh-exit-mode.sh verify
```

Не поднимайте `exit-via-ru`, пока не работает обычный `curl https://1.1.1.1`.

---

## WireGuard на телефоне (выход через RU `149.154.64.19`)

На RU уже крутится **wg-quick@wg0**, UDP **51820**, full-tunnel (`AllowedIPs = 0.0.0.0/0`) → снаружи IP **RU**.

### Установка

1. App Store / Google Play → **WireGuard**
2. **+** → **Create from QR code** (или «Создать из файла»)
3. Сканируйте QR peer3 (неиспользуемый слот `192.168.15.3`) — файл: `/tmp/wg-ru-mobile-peer3-qr.png`  
   Пересоздать QR:

```bash
ssh -o BatchMode=yes hsites-ahau 'sudo -n cat /etc/wireguard/peer3.conf' | qrencode -t PNG -s 8 -o /tmp/wg-ru-mobile-peer3-qr.png && open /tmp/wg-ru-mobile-peer3-qr.png
```

4. Имя туннеля: например `ru-hunab`
5. Включить туннель → в браузене https://ipinfo.io → **RU** / `149.154.64.19`

### Файл вместо QR

```bash
ssh -o BatchMode=yes hsites-ahau 'sudo -n cat /etc/wireguard/peer3.conf' > /tmp/wg-ru-mobile.conf
```

Импорт в WireGuard: **+** → Create from file → `/tmp/wg-ru-mobile.conf`.

### Важно

| | |
|--|--|
| Endpoint | `149.154.64.19:51820` |
| peer3 | свободен (не подключался); peer2 уже использовался |
| Не коммитьте | `.conf` / QR с PrivateKey в git |
| Kill switch | в приложении WireGuard (Android) при необходимости |

Если handshake не идёт: UDP **51820** до RU не доходит (оператор/Wi‑Fi режет) — проверьте с другой сети.

---

## Brave не открывает tbank.ru (Chrome открывает)

Туннель OK (`curl -x socks5h://127.0.0.1:10809` → 200), Chrome с системным SOCKS проходит, **Brave** — нет.

**Причина:** у Brave включён **Secure DNS (DoH)** на Cloudflare (`mode: secure`). Запросы DNS/часть трафика идут мимо SOCKS → с зарубежного IP до `tbank.ru` таймаут. У Chrome DoH обычно выключен.

### В Brave (UI, 30 секунд)

1. `brave://settings/security` → **Use secure DNS** → **Off**
2. `brave://settings/system` → **Use system proxy settings when available** → **On**
3. (если всё ещё тупит) `brave://flags/#enable-quic` → **Disabled** → Relaunch
4. Проверка: https://ipinfo.io → должно быть **RU** / `149.154.64.19`, затем https://www.tbank.ru/

### Если правили prefs скриптом

Brave должен быть **закрыт**, иначе перезапишет `Local State`.

```bash
osascript -e 'quit app "Brave Browser"' 2>/dev/null || true
sleep 2
python3 - <<'PY'
import json
from pathlib import Path
p = Path.home() / "Library/Application Support/BraveSoftware/Brave-Browser/Local State"
st = json.loads(p.read_text())
st["dns_over_https"] = {"mode": "off"}
p.write_text(json.dumps(st, separators=(",", ":")))
print("Brave Secure DNS → off")
PY
open -a "Brave Browser"
```

---

## Диагностика

| Признак | Что делать |
|---------|------------|
| Thunderbird не грузит **все** ящики, `curl` OK | Системный SOCKS на мёртвом **10809** → мягкий off (шаг 0) или `exit-via-local.sh` |
| `Enabled: Yes` / Port 10809, `lsof :10809` пусто | То же: снять системный SOCKS; при нужде снова `exit-via-ru.sh` |
| SOCKS verify = RU, браузер всё ещё «за рубежом» | Системный SOCKS off → снова `exit-via-ru.sh`; в Chrome: «Use system proxy» |
| Chrome OK, Brave нет (tbank и т.п.) | Выключить Secure DNS в Brave — см. выше |
| `verify` — «нет ответа» | `exit-via-local.sh`, затем `exit-via-ru.sh`; `ssh -o ConnectTimeout=10 hsites-ahau 'echo OK'` |
| Интернет умер после RU | `exit-via-local.sh` → при необходимости hotspot `recover` |
| Cursor мёртв при живой сети | Снять мёртвый proxy в settings; [apps/cursor/RUNBOOK.md](../../apps/cursor/RUNBOOK.md) |
| Только CLI нужен RU, без системного SOCKS | `SSH_EXIT_SYSTEM_PROXY=0 bash /Users/eternal/code/local_machine/scripts/vpn/exit-via-ru.sh` |

Проверка SSH до RU:

```bash
ssh -o BatchMode=yes -o ConnectTimeout=10 hsites-ahau 'echo RU_OK'
```

Без алиаса:

```bash
ssh -o BatchMode=yes -o ConnectTimeout=10 -i ~/.ssh/id_ed25519 ahau@149.154.64.19 'echo RU_OK'
```

---

## Cursor (опционально)

Тот же порт **10809**:

```json
"http.proxy": "socks5://127.0.0.1:10809",
"http.proxySupport": "override"
```

На локальный выход: `exit-via-local.sh` **и** в Cursor `"http.proxy": ""`, `"http.proxySupport": "off"`.

---

## Связанные документы

| Документ | Зачем |
|----------|--------|
| [SSH_EXIT_MODES.md](./SSH_EXIT_MODES.md) | Режимы local / ru / ru-do, схема |
| [HOTSPOT_NETWORK_EMERGENCY.md](../HOTSPOT_NETWORK_EMERGENCY.md) | Сеть после reconnect хотспота |
| [PROXY_EMERGENCY.md](../PROXY_EMERGENCY.md) | SSH / прокси «всё слетело» |
| [apps/cursor/RUNBOOK.md](../../apps/cursor/RUNBOOK.md) | Cursor + мёртвый SOCKS |

---

*Обновлено: 2026-07-22*
