Warhammer 40,000: Space Marine 2 в России: лечим ошибку CSF (EAC) через WireGuard-мост на роутере
Стенд
- Роутер: Keenetic Giga
- Прошивка/окружение: Xkeen — запуск прокси-ядер прямо на Keenetic
- Ядро: Mihomo (clash.meta) с маршрутизацией по правилам
- Списки правил: DigneZzZ/routing + geo-данные MetaCubeX
Весь трафик домашней сети заворачивается в Mihomo на роутере (TPROXY), а тот уже раскидывает его по правилам: что напрямую, что через VPN.
Коротко
SM2 выдаёт CSF (или Error 4) и не пускает в сетевые службы. Причина — игровые серверы недоступны из РФ по IP, а обычный VPN ломает анти-чит. Решение: WireGuard-мост «вход в России → выход за рубежом», заведённый прямо в Mihomo как выход по умолчанию, чтобы весь трафик шёл через один чистый зарубежный IP с открытым NAT.
Симптомы
- При запуске не подключается к онлайн-сервисам, в меню —
Error code: CSF(либоError 4,N-14/N-15). - Сетевые режимы недоступны, кооп/PvP не собирается.
- Локальные пляски (проверка файлов, переустановка EOS, фаервол) не помогают.
CSF по сути — провал хендшейка Easy Anti-Cheat: игра не может тебя аутентифицировать и выкидывает на входе.
Почему это происходит в РФ
Складываются две независимые проблемы:
- РКН блокирует игровые серверы по IP. Бэкенд SM2 и матчмейкинг — на зарубежных облаках (AWS, Azure). Часть адресов заблокирована, поэтому напрямую из России не зайти в принципе.
- Обычный VPN ломает анти-чит:
- датацентровые IP во флаге EAC;
- strict/симметричный NAT у большинства прокси — а игре нужен открытый NAT (тип 1/2);
- если выходной IP «прыгает» (балансировка/перебор нод) — сессия EAC рвётся мгновенно.
Вилка: без VPN — блок по IP, с обычным VPN — отлуп анти-чита. Отсюда бесконечный CSF.
Что не сработало
Сначала гоняли только игру через VLESS-подписку (Mihomo, селективные правила на домены Epic/EOS, EAC и порты игры). Маршрутизация была верной — но CSF оставался:
- exit-IP подписочных нод — датацентр, который EAC не любит;
- симметричный NAT → матчмейкинг не собирается;
- разные части трафика игры (логин, серверы, STUN) могли уходить разными IP → анти-чит видит рассинхрон.
Вывод: важно не «куда направить», а качество выхода — нужен чистый IP и открытый NAT.
Что сработало: WireGuard-мост
WireGuard, настроенный мостом: точка входа — сервер внутри России, выход (exit) — за рубежом.
Почему именно так:
- Вход в РФ — соединение от тебя до точки входа идёт по российскому адресу: быстро, стабильно, не упирается в блок зарубежных IP. Хендшейк WG поднимается надёжно.
- Выход за рубежом — наружу выходишь под зарубежным IP, и серверы игры на AWS/Azure становятся доступны.
- Чистый IP + full-cone NAT — у такого моста выход обычно не во флаге EAC, а NAT открытый. Ровно то, чего не хватало.
- Единый стабильный выход — один IP на всю сессию, ничего не «прыгает».
И главное — WG поднят в Mihomo на роутере, поэтому весь трафик игры (логин EOS, игровые серверы, STUN, анти-чит) идёт через один и тот же чистый IP. Эта консистентность и добивает CSF.
Настройка
1. Переносим wg.conf в Mihomo
Обычный конфиг WireGuard, который даёт провайдер моста:
1[Interface]
2PrivateKey = <ВАШ_PRIVATE_KEY>
3Address = 10.10.2.215/32
4DNS = 8.8.8.8
5
6[Peer]
7PublicKey = <PUBLIC_KEY_СЕРВЕРА>
8Endpoint = <ХОСТ_МОСТА>:39547
9PersistentKeepalive = 20
10AllowedIPs = 0.0.0.0/0
Превращается в запись proxies для Mihomo так:
1proxies:
2 - name: 🪽 WG
3 type: wireguard
4 private-key: <ВАШ_PRIVATE_KEY> # = [Interface] PrivateKey
5 server: <ХОСТ_МОСТА> # = хост из Endpoint (до ":")
6 port: 39547 # = порт из Endpoint (после ":")
7 ip: 10.10.2.215 # = [Interface] Address без /маски
8 public-key: <PUBLIC_KEY_СЕРВЕРА> # = [Peer] PublicKey
9 allowed-ips: ['0.0.0.0/0'] # = [Peer] AllowedIPs
10 persistent-keepalive: 20 # = [Peer] PersistentKeepalive
11 udp: true
12 mtu: 1408
13 remote-dns-resolve: true
14 dns: [8.8.8.8] # = [Interface] DNS
15 # pre-shared-key: <PSK> # = [Peer] PresharedKey (если есть)
Таблица соответствия полей:
wg.conf | Mihomo |
|---|---|
[Interface] PrivateKey | private-key |
[Interface] Address (IPv4) | ip (без /32) |
[Interface] DNS | dns (+ remote-dns-resolve: true) |
[Peer] PublicKey | public-key |
[Peer] Endpoint host:port | server + port |
[Peer] PresharedKey | pre-shared-key |
[Peer] AllowedIPs | allowed-ips |
[Peer] PersistentKeepalive | persistent-keepalive |
2. Делаем WG выходом по умолчанию
В группе-селекторе ставим 🪽 WG первым — он становится выходом для всего, что уходит в VPN. Подписочные ноды остаются резервом:
1proxy-groups:
2 - name: 🛡️ VPN
3 type: select
4 proxies:
5 - 🪽 WG # ← выход по умолчанию (мост РФ → зарубеж)
6 - ⚡ Самый быстрый # резерв: ноды подписки
7 - 📶 Первый доступный
3. Правила маршрутизации
Игру (домены Epic/EOS/EAC + бэкенд SM2 + порты + STUN) поднимаем в самый верх и гоним в 🛡️ VPN (= WG). Глобальная модель: всё в VPN, исключения (RU/локалка/директ) — мимо.
Список доменов игры (inline-правило):
1games-vpn:
2 type: inline
3 behavior: domain
4 payload:
5 - "+.epicgames.com" # авторизация Epic
6 - "+.epicgames.dev" # EOS: матчмейкинг/релей/кроссплей (ядро мультиплеера)
7 - "+.easyanticheat.net" # Easy Anti-Cheat
8 - "+.eac-cdn.com"
9 - "+.easy.ac"
10 - "+.prismray.io" # бэкенд онлайн-сервисов SM2 (Saber)
11 - "+.hydrapi.net" # STUN/NAT-траверсал SM2
12 # ...epicgamescdn, unrealengine, fortnite и т.п.
Порядок правил (главное):
1rules:
2 # приватные сети и локалка — напрямую
3 - RULE-SET,direct-ip,DIRECT,no-resolve
4 - GEOIP,PRIVATE,DIRECT,no-resolve
5 - RULE-SET,geosite-private,DIRECT
6
7 # ИГРА → VPN(=WG), в самом верху, чтобы ничто не перехватило
8 - RULE-SET,games-vpn,🛡️ VPN
9 - AND,((NETWORK,tcp),(DST-PORT,11700-11720)),🛡️ VPN # порты SM2 (Saber)
10 - AND,((NETWORK,udp),(DST-PORT,48800-55000)),🛡️ VPN # порты SM2 (Saber)
11
12 # сервисы, которым нужен реальный RU-IP (Госуслуги, пуши) — напрямую
13 - RULE-SET,vpndetect,DIRECT
14 # торрент-трекеры — напрямую
15 - RULE-SET,torrent-trackers,DIRECT
16
17 # обход РКН → VPN
18 - RULE-SET,refilter-d,🛡️ VPN
19 - RULE-SET,proxy,🛡️ VPN
20
21 # российские сайты/IP — напрямую
22 - RULE-SET,geosite-ru,🏠 RU
23 - RULE-SET,direct,DIRECT
24 - RULE-SET,geoip-ru,🏠 RU,no-resolve
25
26 # всё остальное → VPN(=WG)
27 - MATCH,🛡️ VPN
Списки
refilter-*,proxy,direct,games,geoip-ruи пр. — это rule-providers из DigneZzZ/routing и MetaCubeX в формате.mrs(компактно для роутера).
Соль в том, что и игровые правила, и финальный MATCH ведут в одну группу 🛡️ VPN, а она = 🪽 WG. Значит весь трафик игры выходит через один WG-IP — именно это и нужно EAC.
Важные моменты, без которых не взлетит
- Один тоннель на весь трафик игры. Если часть соединений уйдёт другим IP — анти-чит снова отвалится.
MATCH → VPN(=WG)гарантирует единый выход даже для «сырых» IP и STUN. - Открытые порты игры: SM2 — TCP 11700–11720 и UDP 48800–55000; тоннель обязан пропускать UDP.
- Открытый NAT (full-cone, тип 1/2) на выходе моста — иначе кооп не соберётся.
- Не дублируй WG. Один клиент на один ключ. Не поднимай WireGuard одновременно на роутере (отдельным интерфейсом) и в Mihomo с одними ключами — сервер не любит два сеанса.
- Гигиена клиента: проверка целостности файлов в Steam, никаких модов (EAC ловит «Mods Detected» → тоже CSF), верное системное время.
Итог
CSF в Space Marine 2 из России — это сумма блокировок по IP и нелюбви EAC к датацентровым VPN со strict NAT. Лекарство — не «любой VPN», а WireGuard-мост с российским входом и зарубежным выходом, заведённый в Mihomo на роутере и работающий выходом по умолчанию, чтобы весь трафик игры шёл через один чистый IP с открытым NAT. После этого хендшейк EAC проходит, и сетевые режимы наконец работают.
Та же логика лечит и другие EAC/EOS-игры, заблокированные по IP.