Wireguard через sing-box

Привет. Уже несколько недель пытаюсь настроить wireguard для роутера, чтобы он шел через trojan или что-то подобное.
Дано, есть два роутера, один из которых имеет интернет, другой берет интернет от первого и используется как роутер с впн. Раньше он подключался по wireguard напрямую к удаленному серверу, сейчас протокол неработает.

Поэтому идея была подключать raspberrypi4, чтобы она раздавала wireguard( для второго роутера) и проксировала трафик наружу каким-то незаблокированным протоколом. Для этих целей купил trojan/vless проксю и пытаюсь ее настроить таким образом.

Сразу оговорюсь, что я хоть и из айти, но никогда не работал с iptables, роутингами и прочим, поэтому все делается без понимания, но очень хотелось бы понять, как это должно работать.

Идея была такая, чтобы поднять в sing-box интерфейс и заставить через него работать wg, но ничего не получилось.
Удалось подключиться с помощью sing-box и настроить интерфейс:

{
  "inbounds": [
    {
      "type": "tun",
      "tag": "tun-inbound",
      "interface_name": "tun0",
      "inet4_address": [
        "10.0.0.2/24"
      ],
      "mtu": 1500
    },
    {
      "type": "socks",
      "tag": "socks-inbound",
      "listen": "127.0.0.1",
      "listen_port": 1080
    }
  ],
  "outbounds": [
    {
      "type": "trojan",
      "tag": "trojan-outbound",
      "server": "domain",
      "server_port": 443,
      "password": "password",
      "tls": {
        "enabled": true,
        "server_name": "domain",
        "insecure": false
      },
      "transport": {
        "type": "ws",
        "path": "/tw",
        "headers": {
          "Host": "host"
        }
      }
    }
  ],
  "route": {
    "rules": [
      {
        "inbound": [
          "tun-inbound",
          "socks-inbound"
        ],
        "outbound": "trojan-outbound"
      }
    ]
  }
}

Через него даже заработал курл:
curl --interface tun0 ipinfo.io/ip
Далее установил wg через скрипт быстрой установки GitHub - angristan/wireguard-install: WireGuard VPN installer for Linux servers
Во время установки он спросил про интерфейс, я там напечатал tun0 и он настроил такой конфиг:

[Interface]
Address = 10.66.66.1/24,fd42:42:42::1/64
ListenPort = 52590
PrivateKey = private_key
PostUp = iptables -I INPUT -p udp --dport 52590 -j ACCEPT
PostUp = iptables -I FORWARD -i tun0 -o wg0 -j ACCEPT
PostUp = iptables -I FORWARD -i wg0 -o tun0 -j ACCEPT
PostUp = iptables -t nat -A POSTROUTING -o tun0 -j MASQUERADE
PostUp = ip6tables -I FORWARD -i wg0 -j ACCEPT
PostUp = ip6tables -t nat -A POSTROUTING -o tun0 -j MASQUERADE
PostDown = iptables -D INPUT -p udp --dport 52590 -j ACCEPT
PostDown = iptables -D FORWARD -i tun0 -o wg0 -j ACCEPT
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT
PostDown = iptables -t nat -D POSTROUTING -o tun0 -j MASQUERADE
PostDown = ip6tables -D FORWARD -i wg0 -o tun0 -j ACCEPT
PostDown = ip6tables -t nat -D POSTROUTING -o tun0 -j MASQUERADE

### Client router
[Peer]
PublicKey = public_key
PresharedKey = p9zs0WAMxRLPwhOUAAVv9mn2vJGKVexw7VI7dfi+nfU=
AllowedIPs = 10.66.66.2/32,fd42:42:42::2/128

Но с таким конфигом трафик на клиенте не работает. Если поменять tun0 везде на eth0 в этом конфиге, то интернет появляется.

Возможна ли вообще такая схема и если да, то что надо сделать чтобы заработало?

На самом деле даже не понимаю зачем wireguard свой интерфейс и как правильно должен идти трафик.

ВПН на роутере нужен для работы, так как на работе используется проприетарный palo alto, который нужно запускать поверх зарубежного. Возможно тут еще какие-то ограничения всплывут.

Я успешно подключал WG поверх vless, для этого делал на своей стороне порт dokodemo, который прокидывается поверх vless на удаленный сервер, где для приема на lo добавлен vip-адрес. На этом випе слушает WG. Только надо учитывать, что в такой схеме трафик на вип при выходе из vless приходит с этого же випа. Это надо учитывать в allowed. И нужно включить в WG на своей стороне keepalive, чтобы туннель не отключался.

Свой интерфейс нужен WG во-первых для route-based инкапсуляции, во-вторых - как защита от утечки трафика мимо (если правильно настроить)

докодемо это значит v2ray? А можете показать настройки wg? И докудемо настройки если они какие-то особенные. К сожалению по словам ничего настроить не могу.

dokodemo это проброс порта в Xray Core. Почему все предпочитают sing-box, не знаю…

Попробую набросать схему.
Узел-клиент - назначаем vip на интерйфейс LO, например 10.8.88.254, поднимаем порт-слушатель для wireguard и отправляем все с него в VLESS-outbound на vps на адрес vip (10.8.11.254):

  "inbounds": [
    {
      "tag": "in-wg1",
      "listen": "10.8.88.254","port": 1090,
      "protocol": "dokodemo-door",
      "settings": {
        	"address": "10.8.11.254",
	    	"port": 1092,
	    	"network": "tcp,udp"
      }
    },
"routing": {
		{
			"inboundTag": ["in-wg1"],
			"outboundTag": "vless-vps1",
		},
}
outbounds.....

То есть на клиенте цепляемся на локальный порт, который пробрасывается на vps:

[Interface]
Address = 10.8.88.253/32
PrivateKey = xxxx

[Peer]
PublicKey = xxx
AllowedIPs = 10.8.11.0/24
Endpoint = 10.8.88.254:1090
PersistentKeepalive = 15

На vps нужно просто настроить приемник wireguard также на локальном адресе:

[Interface]
Address = 10.8.11.253/32
ListenPort = 1092
PrivateKey = xxxx

[Peer]
PublicKey = xxxx
AllowedIPs = 10.8.88.0/24

Переложить на sing-box не могу, не уверен что там вообще есть dokodemo-in

И еще - такая схема в целом не очень удачная, потому что обнуляет все плюсы wireguard. WG изначально UDP, то есть тут будет переклад в UoT. Теоретически такое лучше пускать по shadowsocks, но shadowsocks UDP уже палится и легко режется…

А зачем в этой схеме dokodemo? Вполне достаточно обявить wireguard интерфейс на том ip, которым малинка смотрит в локалку. Типа

   {
      "listen": "192.168.0.xx",
      "port": 3125,
      "protocol": "wireguard",
      "settings": {
        "mtu": 1420,
        "secretKey": "PrivkeyB",
        "peers": [
          {
            "privateKey": "PrivkeyA",
            "publicKey": "PubkeyA",
            "allowedIPs": [
              "0.0.0.0/0",
              "::/0"
            ],
            "keepAlive": 0
          }
        ],
        "kernelMode": false
      },
      "streamSettings": null,
      "tag": "WG_in",
      "sniffing": {
        "enabled": false,
        "destOverride": [
          "http",
          "tls",
          "quic",
          "fakedns"
        ],
        "metadataOnly": false,
        "routeOnly": false
      }
    }

Всё, после этого на роутере можно настраивать WG подключение на 192.168.0.xx:3125, а в xray соотв. прописать маршрут

  "routing": {
    "domainStrategy": "AsIs",
    "rules": [
      {
        "type": "field",
        "inboundTag": [
          "WG_in"
        ],
        "outboundTag": "Trojan_out"
      },

а у кого wireguard есть на inbound протоколе? Видел только на outbound

xray-core умеет ещё с зимы по-моему(и как следствие 3x-ui). У меня вышеописанная схема(только с VLESS) живёт с февраля этого года. Вот недавно заехала в контейнер прямо на роутере.
Вот тут буквально недавно восстановил мануал по настройке

Здесь вы не пробрасываете WG поверх другого протокола, а терминируете его на узле… Задача была поставлена несколько иначе

Я прочитал задачу как “подключаться по WG к малинке, которая будет проксировать траффик наружу по незаблокированному протоколу”. Но даже если стоит задача протянуть WG до улалённой тачки - то ИМХО лучше его всё же терминировать а на выходном узле развернуть такой же xray-core, но с wg-outbound. Туннель внутри туннеля - такое себе.

на самом деле мне подойдет любой вариант, который бы мне сделал на роутере впн. Сейчас роутер поддерживает только wg и openvpn. Желательно чтобы это было энкапсулировано в каком-то устройстве.

настроил через x-ui, фантастикак как просто все оказалось со встроенным wireguard)
стабильность правда сомнительная, видимо издержки протоколов, но это лучше чем ничего
спасибо за помощь
Как придет orangepi с двумя ланами, попробую на нем завести

На работу с registry-1.docker.io хватает. И на репку графаны тоже. На самом деле работает весь этот велосипед достаточно стабильно и ресурсов особо не жрёт. Единственная задержка в работе бывает при хендшейке, т.к. в этот момент на стороне сервера стягивается сертификат с подменного хоста. А в остальное время всё достаточно резво(в рамках интернет канала на стороне VPS разумеется)

а когда после чего проихсодит? После того как соединение с прокси по таймауту рвется?
И есть ли разница между vless или trojan в этой конфигурации? Вроде они оба по tcp работают и должны быть аналогичны по накладным расходам