Xray и transparent udp

Есть желание завернуть прозрачно с linux клиента (с самой системы) порты tcp 80,443 и udp 443.
С tcp проблем не возникло. DNAT отработал, xray подхватил адрес назначения через getsockopt(SO_ORIGINAL_DST).

Но в случае udp ни в какую. Сервер в outbound пытается лезть на 127.0.0.1 на прозначный порт клиента. Получается, что SO_ORIGINAL_DST не сработал, и был оставлен адрес назначения как dnat target.

Правила nft все абсолютно симметричны для udp и tcp.
Вариант tproxy слишком муторный для output, там проблема на проблеме и сложные схемы.

Есть у кого практический опыт ? Произвольный набор портов udp завернуть на один порт transparent udp, подхватив оригинальный адрес назначения и передав его на сервер

sing-box делает это автоматически, можешь посмотреть что он делает

Автоматически что ? nftables прямо из своего процесса загоняет ?

Судя по strace он че-то делает по приходу udp, но не getsockopt. То есть он даже не пытается взять оригинальный адрес. Похоже, что механизм работает только для TCP, xray об этом знает и не пытается.
А по приходу tcp все как ожидалось

Может tun тогда проще ?

Sockopt “tproxy”: “tproxy” стоит?

Вот инструкция с nftables для hysteria2

(Там еще выше команды есть)

И еще

С tproxy вроде дело пошло, но не удается победить вот эту проблему

app/proxyman/inbound: connection ends > fake: socket bind: permission denied

Адрес назначения и порт он нормально подхватывает.
И еррор только на udp

В v2rayA клиенте используется tproxy и добавляет таблицу в nftables, UDP там как-то работал.

Что я понял про эти xray-core клиенты, так версий там как собак.
И везде что-то меняют, в 25 почему-то даже tun нет. Он ругается как на любой левый протокол

Начиная с v26.1.23 только добавили tun
https://github.com/XTLS/Xray-core/releases/tag/v26.1.23

Интересно. А я откатился с него, потому что они что-то поменяли в kcp, и он ругался на инвалидный размер пакетов. 25-26 по kcp несовместимы. 26 как-то стал очень тяжело запускаться на mips с малой памятью. Совсем тупит в разы

И формат конфига для mkcp поменялся Finalmask: Add XDNS (relies on mKCP, like DNSTT), header-*, mkcp-* by LjhAUMEM · Pull Request #5560 · XTLS/Xray-core · GitHub

client

{
  "log": { "loglevel": "debug" },
  "inbounds": [
    {
      "listen": "127.0.0.1",
      "port": 1080,
      "protocol": "socks",
      "settings": {
        "auth": "noauth",
        "udp": true
      }
    }
  ],
  "outbounds": [
    {
      "protocol": "vless",
      "settings": {
        "address": "127.0.0.1",
        "port": 1081,
        "id": "5783a3e7-e373-51cd-8642-c83782b807c5",
        "encryption": "none"
      },
      "streamSettings": {
        "network": "kcp",
        "finalmask": {
          "udp": [
            {
              "type": "header-dtls"
            },
            {
              "type": "mkcp-original"
            },
            {
              "type": "mkcp-aes128gcm",
              "settings": {
                "password": "123"
              }
            }
          ]
        }
      }
    }
  ]
}

server

{
  "log": { "loglevel": "debug" },
  "inbounds": [
    {
      "listen": "127.0.0.1",
      "port": 1081,
      "protocol": "vless",
      "settings": {
        "clients": [
          {
            "id": "5783a3e7-e373-51cd-8642-c83782b807c5"
          }
        ],
        "decryption": "none"
      },
      "streamSettings": {
        "network": "kcp",
        "finalmask": {
          "udp": [
            {
              "type": "header-dtls"
            },
            {
              "type": "mkcp-original"
            },
            {
              "type": "mkcp-aes128gcm",
              "settings": {
                "password": "123"
              }
            }
          ]
        }
      }
    }
  ],
  "outbounds": [
    {
      "protocol": "freedom"
    }
  ]
}