Xray server: freedom outbound всегда идет в системный dns

Привет!

Подскажите, пожалуйста, где косяк в конфиге XRAY на СЕРВЕРЕ:

config.json
{
  "log": {
    "loglevel": "warn"
  },
  "dns": {
    "servers": [
      {
        "address": "https+local://dns.google/dns-query"
      }
    ]
  },
  "inbounds": [],
  "outbounds": [
    {
      "protocol": "freedom",
      "tag": "direct",
	  "domainStrategy": "UseIP"
    },
    {
      "protocol": "blackhole",
      "tag": "block"
    },               
	{
	  "protocol": "vless",
	  "settings": {
		"address": "",
		"port": 443,
		"id": "",
		"flow": "xtls-rprx-vision",
		"encryption": "none",
		"reverse": {
		  "tag": "",
		  "sniffing": {
			"enabled": true,
			"routeOnly": false,
			"destOverride": [
			  "http",
			  "tls"
			]
		  }
		}
	  },
	  "streamSettings": {
	  	"network": "raw",
	  	"security": "reality",
	  	"realitySettings": {
	  	  "fingerprint": "",
	  	  "serverName": "",
	  	  "password": "",
	  	  "shortId": ""
	  	}
	  }
    }
  ],
  "routing": {
    "rules": [
      {
        "ip": [
          "geoip:ru",
		  "geoip:by",
          "geoip:private"
        ],
        "outboundTag": "block"
      },
      {
        "domain": [
		  ...
          "geosite:category-ru",
          "geosite:habr"
        ],
        "outboundTag": "block"
      },
	  {
		"protocol": "bittorrent",
		"outboundTag": "block"
      }
    ],
    "domainStrategy": "IPIfNonMatch"
  }
}

Вроде UseIp указал, dns сервер указал. Какие-то рулы еще нужны?

  1. sudo tcpdump -ni any port 53 на сервере
  2. curl youtube.com на клиенте
  3. в дампе на сервере вижу запросы на системный dns
{
  "tag": "direct",
  "protocol": "freedom",
  "streamSettings": {
    "sockopt": {
      "domainStrategy": "UseIP"
    }
  }
}

так днс пошёл в DoH через провайдера, ещё здесь описано как можно сделать чтобы только днс xray шёл в прокси xray uses dns from dhcp, how to avoid this? · Issue #1141 · XTLS/Xray-core · GitHub

вообще я до сих пор не догоняю xray, sing-box проще, лучше его использовать на клиенте

curl не лезет в настройки xray и ничего не знает о том, какой dns-сервер указан в нем. Он всегда использует системный, если явно не указать флагами.

Для всех еще раз повторяю: на сервере xray, на клиенте sing-box. Проблема на сервере xray.

Попробуйте прямо указать IP DNS:

"servers": [
      {
        "address": "https+local://8.8.8.8/dns-query"
      }
    ]

либо добавить hosts:

"hosts": {
      "dns.google": ["8.8.8.8", "8.8.4.4"]
    },

Проблема на сервере

Ну так что это меняет?

Вообще у вас IPIfNonMatch, то есть для всех назначений, которые не указаны явно в rules будет выполняться разрешение через xray dns. Но это не значит, что вообще всё будет разрешаться через него. Домены, которые явно в rules совпали, не будут разрешены, пойдут в direct “как есть“ и разрешаться будут уже через системный dns. А +local собственно означает, что запросы DNS игнорируют роутинг вообще и уходят сразу в direct, где он опять же должен пойти на системный dns, чтобы получить адрес.

Не меняет.

Вот это помогло, спасибо
    {
      "tag": "direct",
      "protocol": "freedom",
	  "streamSettings": {
		"sockopt": {
		  "domainStrategy": "ForceIPv6v4"
		}
      }
    }

Только теперь я вижу 2 похода за DNS (фактически один, второй - это cache hit). Полагаю если я хочу чтобы все неизвестное резолвилось дополнительно и проверялось по ip (IPIfNonMatch) - избежать двух обращений в dns мне не удастся?

Докучи еще вопрос по sing-box клиенту появился - можно ли на нем настроить аналогичную схему с двойной проверкой по рулам (сначала по геосайту(домену) и потом по geoip)? С ходу показалось что он так не умеет - если по домену рул отработал, то все.

Ты не там пишешь domainStrategy. Это специфичная для Freedom настройка (а не для любого Outbound), поэтому её (как и другие настройки Freedom: fragment, noises, пр.) надо писать внутри раздела settings:

“outbounds”: [
{
“protocol”: “freedom”,
“tag”: “direct”,
“settings”: {
“domainStrategy”: “UseIP”
}
},

Ну или настроить domainStrategy в streamSettings > sockopt (как уже посоветовали).

del