Cloak + wireguard под windows-клиентов

Если не хочется собирать самому, я как-то делал сборку с 2022 и aes (для xp) шифрами Release v1.15.3 · artenax/shadowsocks-rust · GitHub

Есть реализации на разных языках программирования.

Не знаю актуально ли, но вот про cloak клиент на винде. В докер cloak не засовывал, подсказать не смогу. По ощущениям когда wg в докере впн работает медленнее. На винде клиент .exe с офф гитхаба запускаю с параметрами ck-client.exe -s <IP> -p <PORT> -u -l 51820 -c ckclient.json
ckclient.json взял из примеров так же с гитхаба - https://github.com/cbeuw/Cloak/blob/master/example_config/ckclient.json. Меняю в клиенте wg адрес на 127.0.0.1:51820 и один раз быстро подключаюсь и отключаюсь, жду пока в консоли cloak появится сообщение Session 3292283057 established, затем подключаюсь как обычно. Всё.

upd: забыл, в wg 127.0.0.1 должен быть исключён. Можно так AllowedIPs = 0.0.0.0/1, 128.0.0.0/1 или воспользоваться скриптом Reddit - Dive into anything

Это для чего передёргивать? Чтобы зафиксировать маршрут на сервер через интерфейс сетевой карты? Эту задачу можно решить статическим маршрутом, метриками маршрутов или биндингом исходящего соединения клиента на адрес сетевого интерфейса (если не работает BindAddr, то можно пропатчить, разработчики почему-то редко дают возможность указывать outbound интерфейс; не знаю, не пользовался пока cloak).

При запуске cloak без передергивания не создаётся сессия. Наверное это из-за ключа -u (udp), без него работает по tcp такого нет и передёргивать не нужно.

Хм, я подумал это из-за рекурсивного туннеля (клоак подключается через виртуальный интерфейс через клоак через виртуальный интерфейс и т.д.).

Благодарю за ответ, очень даже актуально.

На сервере установил WG контейнер отсюда: GitHub - linuxserver/docker-wireguard , указал следующий docker-compose:

version: "3"
services:
  wireguard:
    image: lscr.io/linuxserver/wireguard:latest
    container_name: wireguard
    cap_add:
      - NET_ADMIN
    environment:
      - PUID=1000
      - PGID=1000
      - TZ=Etc/UTC
      - SERVERURL=127.0.0.1 #optional
      - SERVERPORT=51820 #optional
      - PEERS=1 #optional
      - PEERDNS=auto #optional
      - INTERNAL_SUBNET=10.13.13.0 #optional
      - ALLOWEDIPS=0.0.0.0/0 #optional
      - PERSISTENTKEEPALIVE_PEERS= #optional
      - LOG_CONFS=true #optional
    volumes:
      - ./config:/config
      - /lib/modules:/lib/modules
    ports:
      - 51820:51820/udp
    sysctls:
      - net.ipv4.conf.all.src_valid_mark=1
    restart: unless-stopped

Дальше настроил ckserver следующим образом:

{
  "ProxyBook": {
    "wireguard": [
      "udp",
      "127.0.0.1:51820"
    ],
    "openvpn": [
      "udp",
      "127.0.0.1:8389"
    ],
    "tor": [
      "tcp",
      "127.0.0.1:9001"
    ]
  },
  "BindAddr": [
    ":443",
    ":80"
  ],
  "BypassUID": [
    "ключ клиента"
  ],
  "RedirAddr": "cloudflare.com",
  "PrivateKey": "приватный ключ сервера",
  "DatabasePath": "userinfo.db"
}

Сервер стартую и всё, собственно говоря, гуд.

Дальше на клиенте WG ставлю следующий конфиг.

[Interface]
PrivateKey = приватный ключик
ListenPort = 51820
Address = 10.13.13.2/32
DNS = 10.13.13.1

[Peer]
PublicKey = публичный ключик
PresharedKey = preshared ключик
AllowedIPs = 0.0.0.0/1, 128.0.0.0/1
Endpoint = 127.0.0.1:51820

Потом настраиваю ck-client следующим образом (кстати, насчёт шифрования не понял, ставил и plain и aes-gcm):

{
    "Transport": "direct",
    "ProxyMethod": "wireguard",
    "EncryptionMethod": "aes-gcm",
    "UID": "ключ юзера",
    "PublicKey": "публичный ключ сервера",
    "ServerName": "www.bing.com",
    "NumConn": 4,
    "BrowserSig": "chrome",
    "StreamTimeout": 300
  }

Далее стартую загруженный с оф. гитхаба экзешник со след. параметрами:

.\ck-client.exe -s айпи-сервера -p 443 -u -l 51820 -c .\ckclient.json

Сам сервер стартует нормально:

time="2023-09-26T14:09:10+03:00" level=info msg="Starting standalone mode"
time="2023-09-26T14:09:10+03:00" level=info msg="Listening on UDP 127.0.0.1:51820 for wireguard client"

Но вот как только пробую в клиенте выполнить подключение, то получаю следующее:

time="2023-09-26T14:09:14+03:00" level=info msg="Attempting to start a new session"
time="2023-09-26T14:09:35+03:00" level=error msg="Failed to establish new connections to remote: dial tcp айпи-сервера:443: connectex: A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond."

Причём на сервере в консоли cloak-сервера ничего нет, как только отключаюсь в wg-клиенте, то начинаю видеть в консоли сервера следующее:

WARN[2023-09-26T14:18:45+03:00] decryption/authentication faliure: timestamp is outside of the accepting window: received timestamp 1695727379  UID="ключ клиента" encryptionMethod=1 proxyMethod=wireguard remoteAddr="айпи-клиента:52234" sessionId=0

В чём может быть причина? В принципе не могу понять значения этой ошибки: " timestamp is outside of the accepting window"

RedirAddr на сервере cloak должен соответствовать ServerName на клиенте, возможно не получается из-за этого. На счёт ошибки timestamp is outside of the accepting window может не соотвествует время на клиенте и севрере, хотя у меня тоже и подключается. На счёт шифрования можно и plain так как wg шифрует трафик сам. А так по конфигам всё нормально.

upd: ещё ListenPort у wg клиента на какой нибудь другой перекиньте, 51821 например

Отписываюсь по результату, 2 недели был в отъезде, так что протестить не мог. В общем попробовал донастроить конфиг по вашему совету, установил такой же ServerName на клиенте, как и RedirAddr на клиенте, в винде поставил автоматическую синхронизацию даты и времени (до этого она была в ручном режиме), по дефолту было глухо.

После переноса на 51825 всё стало окей, вообще не могу сообразить, как мне не хватило мозгов глянуть, что порт по умолчанию из докер-образа для WG в качестве слушающего и эндпоинта ставился один и тот же

P.S. Премного благодарен за вашу помощь!

Рад что у вас всё работает :slight_smile:
P.S А я тут додумался как сделать без передёргивания wg. Нужно поменять AllowedIPs клиента, добавить только ip сервера в исключения. Можно сгенерировать с помощью сайта WireGuard AllowedIPs Calculator | Pro Custodibus или скрипт питона из поста выше
В вг клиента вроде нужно убрать галку Block untunneled traffic (kill-switch)