Не проходит соединение xray dokodemo-door + wireguard

Всех приветствую, друзья.

Подскажите, куда копать.

Схема: Клиенты Wireguard → VPS (RU) Wireguard + XRAY dokodemo-door → VPS (EU) XRAY точка выхода.

Цель: Маршрутизация на VPS (RU) по geoip силами XRAY + доступ пиров Wireguard друг к другу.

Конфиги:

  1. Конфиг XRAY VPS (RU) - { "log": { "loglevel": "debug" }, "inbounds": [ { "tag - Pastebin.com
  2. Конфиг NFTABLES VPS (RU) - flush rulesetdefine ETHDEV = eth0define WGDEV = wg0define WGPORT = 49999 - Pastebin.com
  3. Конфиг XRAY VPS (EU) - { "log": { "loglevel": "info" }, "routing": { " - Pastebin.com

Что имеем:

  1. Клиенты Wireguard успешно друг с другом общаются и выходят через шлюз VPS (RU) во весь интернет.
  2. Опробованные клиенты XRAY, связанные напрямую с VPS (EU) в обход VPS (RU) работают (телефон со straisand/foxray). То есть вроде как XRAY на VPS (EU) работает.

Что не работает:

  1. Перенаправления трафика от пиров Wireguard на XRAY dokodemo-door и последующая маршрутизация по geoip (RU → direct, остальное → VPS (EU)).

Почему не работает - не хватает опыта понять. Вероятно, неправильно настроил nftables для перевода трафика с интерфейса Wireguard и, возможно, неправильно настроил связь между XRAY на VPS (RU) и XRAY на VPS (EU).

Настраивал в основном из небольшого личного опыта + доков + где-то на форуме увидел нечто похожее. Не нашел, где. Давно было.

Прошу помочь разобраться.

Вам необходимо настроить машрутизацию.

В xray не tun а tproxy. Tun есть в sing-box

@Keita у меня подозрения что nftables понимают только несколько человек на форуме, я в их число не вхожу. Маршрутизация через sing-box с tun будет гораздо проще

Я плохо знаю firewalld, но на мой взгляд, все что есть вашем посте есть в моих правилах nftables. Не 1 в 1 конечно, с учетом работы моей VPS, но все же…

А я sing-box совсем не знаю. Он нужен на обоих концах (VPS RU и VPS EU)? Или будет достаточно его поставить на VPS RU и связать с XRAY на VPS EU?

Del

Del

Случайно удалил посты выше… Сингбокс нужен только на клиенте (ру впс). Examples с tun есть на офф сайте, форуме в соседних темах или на гитхабе, только авто роутинг надо выключить иначе сеть сломается 99%. Роутинг можно настроить вручную через systemd-networkd (поместить шлюз сингбокса в отдельную rt table (sing-rt-table) и сделать ip rule правило "from подсеть_wg/24 table sing-rt-table)

Спасибо, буду изучать в выходные.

Там дальше пример и для xray есть от @sakontwist (не знаю, насколько информативный для вопрошающего).

Кроме правил для nftables необходимо разрешить направлять пакеты с mark 1 на loopback, для этого нужно добавить правила:

ip route add local default dev lo table 100
ip rule add fwmark 1 pref 32765 table 100

Должно получится вот так:

~# ip rule
0:	from all lookup local
32765:	from all fwmark 0x1 lookup 100
32766:	from all lookup main
32767:	from all lookup default

~# ip route sh table 100
local default dev lo scope host 

p.s. сорри, не тому ответил )

На некоторых ОС еще нужно разрешить роутингу ядра обрабатывать такую ситуацию в sysctl:

sysctl -w net.ipv4.conf.eth0.route_localnet=1

Спасибо, @sakonwist ! Завелось какое-то взаимодействие между VPS RU и VPS EU через XRAY, однако, работа еще до конца не налажена.

2025/04/13 00:40:59.156880 [Debug] [1058314867] transport/internet: dialing to tcp:VPS EU IP:443
2025/04/13 00:40:59.174409 [Info] [3097179696] proxy/vless/outbound: tunneling request to udp:104.21.48.1:443 via VPS EU IP:443
2025/04/13 00:40:59.174748 [Info] [3097179696] app/proxyman/outbound: app/proxyman/outbound: failed to process outbound traffic > proxy/vless/outbound: XTLS rejected UDP/443 traffic
2025/04/13 00:40:59.175280 [Info] [59726726] proxy: XtlsPadding 64 871 0
2025/04/13 00:40:59.179307 [Info] [59726726] proxy: XtlsPadding 503 483 2
2025/04/13 00:40:59.224110 [Info] [59726726] proxy: Xtls Unpadding new block, content 512 padding 540 command 2
2025/04/13 00:40:59.224442 [Info] [59726726] proxy: CopyRawConn splice
2025/04/13 00:40:59.278076 [Info] [1058314867] proxy/vless/outbound: tunneling request to udp:104.21.64.1:443 via VPS EU IP:443
2025/04/13 00:40:59.278489 [Info] [1058314867] app/proxyman/outbound: app/proxyman/outbound: failed to process outbound traffic > proxy/vless/outbound: XTLS rejected UDP/443 traffic
2025/04/13 00:40:59.958818 [Info] [1222081087] app/proxyman/inbound: connection ends > proxy/dokodemo: connection ends > context canceled
2025/04/13 00:41:00.064248 [Info] [4072679547] app/proxyman/inbound: connection ends > proxy/dokodemo: connection ends > context canceled
2025/04/13 00:41:00.175549 [Info] [3097179696] app/proxyman/inbound: connection ends > proxy/dokodemo: connection ends > context canceled
2025/04/13 00:41:00.278877 [Info] [1058314867] app/proxyman/inbound: connection ends > proxy/dokodemo: connection ends > context canceled

Роутинг из конфига, который я привел, не работает. Все запросы к RU идут через EU VPS, а не напрямую.

Xray не умеет объединять правила в routing как singbox (вернее он именно объединяет через И). Делайте отдельное для geoip:ru и отдельное для domain:

 "rules": [
  {
    "ip": [
      "geoip:private",
      "geoip:ru"
    ],
    "outboundTag": "direct"
  },
  {
    "domain": [
       "domain:ru"
   ],
   "outboundTag": "direct"
  }
]

Странно, смотрел несколько конфигов на гитхабе, везде было объеденино… В любом случае:

      "routing": {
        "rules": [
          {
            "type": "field",
            "ip": ["geoip:private", "geoip:ru"],
            "outboundTag": "direct"
          },
          {
            "type": "field",
            "domain": ["domain:ru"], 
            "outboundTag": "direct"
          }
        ],
        "domainStrategy": "AsIs"
      }

Поправил, но все равно весь трафик идет через VPS EU. У меня, наверное, уже глаз замылился )

Если никакие правила в routing не сработали, то все идёт в самый первый outbound, который видимо на EU VPS. Но здесь совершенно очевидно не работают правила в rules. Даже если xray не видит geo-файлы, правило по домену ru должно работать.

Проверяйте вложенность разделов, желательно в нормальном редакторе типа vscode. Раздел routing должен быть на одном уровне с outbounds.
Log, dns, inbounds, oubtounds, routing, observatory это все головные разделы, они должны быть на одном уровне в конфиге. Возможно xray просто не распарсил раздел и игнорирует его.

Переписал конфиг, отформатировал в VSCode и заработало. Спасибо! Можете еще глянуть мой конфиг на предмет оптимальности и правильности настройки? Может кому-то еще он пригодиться.

{
  "log": {
    "loglevel": "debug"
  },
  "inbounds": [
    {
      "tag": "in-tproxy",
      "listen": "127.0.0.1",
      "port": 61221,
      "protocol": "dokodemo-door",
      "settings": {
        "followRedirect": true,
        "network": "tcp"
      },
      "streamSettings": {
        "sockopt": {
          "tproxy": "tproxy"
        }
      },
      "sniffing": {
        "enabled": true,
        "destOverride": ["http", "tls", "quic", "fakedns"],
        "routeOnly": true
      }
    }
  ],
  "outbounds": [
    {
      "protocol": "vless",
      "settings": {
        "domainStrategy": "UseIPv4",
        "vnext": [
          {
            "address": "SERVERIP",
            "port": 443,
            "users": [
              {
                "id": "ID",
                "encryption": "none",
                "flow": "xtls-rprx-vision"
              }
            ]
          }
        ]
      },
      "streamSettings": {
        "network": "tcp",
        "security": "reality",
        "realitySettings": {
          "fingerprint": "chrome",
          "serverName": "www.google.com",
          "publicKey": "PRIVATEKEY",
          "spiderX": "",
          "shortId": "SHORTID"
        }
      },
      "tag": "proxy"
    },
    {
      "protocol": "freedom",
      "settings": {
        "domainStrategy": "UseIPv4"
      },
      "tag": "direct"
    },
    {
      "protocol": "blackhole",
      "tag": "blocked"
    }
  ],
  "routing": {
    "domainStrategy": "IPIfNotMatch",
    "domainMatcher": "hybrid",
    "rules": [
      {
        "domain": ["2ip.ru"],
        "outboundTag": "proxy"
      },
      {
        "domain": ["domain:ru"],
        "outboundTag": "direct"
      },
      {
        "ip": ["::/0"],
        "outboundTag": "blocked"
      },
      {
        "ip": [
          "geoip:private",
          "geoip:ru"
        ],
        "outboundTag": "direct"
      },
      {
        "network": "tcp,udp",
        "outboundTag": "proxy"
      }
    ]
  }
}

Кстати, через Xray утекает IP через WebRTC. Это из-за того, что UDP пакеты не проходят через Xray?

ну так вы не заворачиваете udp в dokodemo:

settings": {
        "followRedirect": true,
        "network": "tcp"
      },

Хотя можно заворачивать, xray будет использовать xudp и отправлять их поверх tcp, а на стороне сервера обрабатывать как udp.

В целом конфиг нормальный, разве что последнее правило особо и не нужно, если у вас первый outbound в списке outbounds это proxy, то всё что не перенаправлено в rules полетит в него и так.

И в конфиге никак не обрабатывается трафик dns. Каким образом вы защищаете DNS-запросы от просмотра? UDP у вас не принимается в tproxy.

Изменил на

settings": {
        "followRedirect": true,
        "network": "tcp,udp"
      },

И в конфиге никак не обрабатывается трафик dns. Каким образом вы защищаете DNS-запросы от просмотра? UDP у вас не принимается в tproxy.

Добавления в правило udp недостаточно для этого будет? В доках не нашел, как отдельно обрабатывать DNS запросы, разве что через свой сервер или какой-то встроенный.