Commit 2a671517 authored by Vitaly Lipatov's avatar Vitaly Lipatov

egw: add ikev2.fr and ikev2.gr reverse-initiated tunnels

New CT 704 (ikev2.fr.egw, .140) and CT 706 (ikev2.gr.egw, .139) act as IKEv2 responders for peers behind NAT (RPi/Free.fr and parentglobal/Cosmote) that cannot accept inbound IKE. Peers initiate outbound; CT pins peer outer-IP to provider gw via updown script so encapsulated ESP doesn't loop through ipsec0 default. Docs updated; gateways added to web sidebar and CHECK_GATEWAYS for proxy health probing. Co-Authored-By: 's avatarClaude Opus 4.7 <noreply@anthropic.com>
parent 7bfbdebb
......@@ -110,6 +110,8 @@ graph LR
| 695 | cloak.ovpn.hetzner.egw | 91.232.225.132 | hetzner | OpenVPN+Cloak | tun0 |
| 671 | amneziawg.sprintbox.egw | 91.232.225.114 | sprintbox | AmneziaWG | awg0 |
| 703 | warp.egw | 91.232.225.134 | beget (GRE) | Cloudflare WARP | CloudflareWARP |
| 704 | ikev2.fr.egw | 91.232.225.140 | rpi @ anyssh.eterhost.ru:10338 | IKEv2/IPsec (responder) | ipsec0 |
| 706 | ikev2.gr.egw | 91.232.225.139 | parentglobal @ anyssh.ru:10337 | IKEv2/IPsec (responder) | ipsec0 |
**CT 703 (warp.egw):** Cloudflare WARP клиент. Трафик к Cloudflare идёт через gre.beget (.124 → beget VDS 217.12.37.55). Split-tunnel: 91.232.225.0/24 и 2a03:5a00:c:20::/64 исключены (локальная сеть доступна). Exit IP через Cloudflare (PoP ARN Stockholm). microsocks :1080 для мониторинга. Склонирован из xray.hetzner (CT 684).
......@@ -123,6 +125,10 @@ graph LR
**CT 693 (ikev2.vdska.egw):** IPv6 через IPsec-туннель с NAT66 (NETMAP). Tunnel p2p: `2a0d:6c2:25:42::2/112` (контейнер) ↔ `::1/112` (VDS). NETMAP: `2a03:5a00:c:20::/118``2a0d:6c2:25::c00/118`. MASQUERADE для остального IPv6. Выходной IPv6: `2a0d:6c2:25::3` (MASQUERADE на VDS, shared /47 subnet). Персистентность: `ip6tables-nat66.service` + `ip6tables-save` на VDS.
**CT 704/706 (ikev2.fr / ikev2.gr) — reverse-инициируемые туннели:** удалённая сторона за NAT (Free.fr / Сбер), сама инициирует IKE наружу к нашему CT (responder, `remote_addrs=%any`). CT — XFRM `ipsec0` (if_id=42, p2p `10.10.10.5/30`), MASQUERADE для офисного трафика на ipsec0. На удалённой стороне ставится только `10.10.10.6/30` — никаких маршрутов на офис/`91.232.225.0/24` (см. [[../../.claude/memory/feedback_no_routes_on_remote_nat_peers.md]]). На CT обязателен default через `91.232.225.1` (без него `rp_filter=2` дропает входящий UDP/4500 от внешних IP). **Тонкости:**
- `ikev2.fr` — RPi Debian13 с docker, контейнер `ikev2-fr` в default-bridge netns (изоляция маршрутов от host). Образ собран из `/opt/ikev2-fr-docker/` (`debian:trixie-slim` + strongswan), entrypoint поднимает ipsec0 и запускает charon. `--cap-add NET_ADMIN,NET_RAW,NET_BIND_SERVICE --sysctl net.ipv4.ip_forward=1`. healthcheck — `swanctl --list-sas | grep ESTABLISHED`.
- `ikev2.gr` — parentglobal (ALT11), `ipsec0.service` (oneshot, создаёт XFRM-интерфейс) + `strongswan`. **Провайдер блокирует исходящий UDP/500**, в swanctl нужен `local_port = 4500` чтобы initiator не пытался стартовать с :500.
**Xray-контейнеры (CT 684, CT 674):** Xray работает на уровне приложения (VLESS/REALITY), ICMP через xray0 не проходит. Для работы ping используется policy routing — ICMP-трафик направляется через 91.232.225.1 (провайдер) вместо туннеля:
```ini
# /etc/systemd/network/eth0.network.d/override.conf
......
......@@ -152,6 +152,8 @@ CHECK_GATEWAYS = [
("gre.vdska", "socks5://91.232.225.127:1080", "socks5://[2a03:5a00:c:20::127]:1080"),
("gre.beget.ogw", "socks5://91.232.225.124:1080", None),
("ikev2.beget.ogw", "socks5://91.232.225.130:1080", None),
("ikev2.fr", "socks5://91.232.225.140:1080", "socks5://[2a03:5a00:c:20::140]:1080"),
("ikev2.gr", "socks5://91.232.225.139:1080", "socks5://[2a03:5a00:c:20::139]:1080"),
]
_list_lock = threading.Lock()
......@@ -806,6 +808,8 @@ HTML_PAGE = """\
<div class="sidebar-item" id="gw-132" title="Cloak + OpenVPN"><span class="proxy-dot unknown"></span>cloak.ovpn.hetzner <span class="ip">.132</span></div>
<div class="sidebar-item" id="gw-122" title="GRE tunnel"><span class="proxy-dot unknown"></span>gre.hetzner <span class="ip">.122</span></div>
<div class="sidebar-item" id="gw-127" title="GRE tunnel"><span class="proxy-dot unknown"></span>gre.vdska <span class="ip">.127</span></div>
<div class="sidebar-item" id="gw-140" title="IKEv2 IPsec (responder, rpi @ Free.fr)"><span class="proxy-dot unknown"></span>ikev2.fr <span class="ip">.140</span></div>
<div class="sidebar-item" id="gw-139" title="IKEv2 IPsec (responder, parentglobal @ Cosmote)"><span class="proxy-dot unknown"></span>ikev2.gr <span class="ip">.139</span></div>
<div class="sidebar-item" id="gw-120" title="IKEv2 IPsec"><span class="proxy-dot unknown"></span>ikev2.hetzner <span class="ip">.120</span></div>
<div class="sidebar-item" id="gw-131" title="IKEv2 IPsec"><span class="proxy-dot unknown"></span>ikev2.vdska <span class="ip">.131</span></div>
<div class="sidebar-item" id="gw-112" title="OpenConnect VPN"><span class="proxy-dot unknown"></span>openconnect.hetzner <span class="ip">.112</span></div>
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment