Вариантов много:
- использовать защиту dns на шлюзе сети (самое надежное и гарантированно защищает от “особенностей” разных ОС), то есть ловить любые исходящие на 53 и делать redirect на локальный сервис DoH/DNSCrypt
- использовать локальный DNS-сервис на самом серваке - можно просто системный (то есть dns-запрос делается на выходе обращений из direct)
- можно завернуть udp/53 в xray и использовать его встроенный резолвер и кэш DNS (через outbound “dns”)
{
"dns": {
"hosts": {
},
"servers": [
{
"address": "127.0.0.53","skipFallback": false
},
{
"address": "127.0.2.1","skipFallback": false
}
],
"queryStrategy": "UseIPv4",
"disableCache": false,
"disableFallback": false,
"disableFallbackIfMatch": true,
"tag": "dns-srv"
}
}
{
"outbounds": [
{
"tag": "direct",
"protocol": "freedom"
},
{
"tag": "dns-out",
"protocol": "dns",
"settings": {
"address":"127.0.0.1",
"comment": "на DNS хоста идут прочие запросы кроме A/CNAME, A/CNAME идут в встроенный dns xray",
"port": 53,
"nonIPQuery": "skip"
}
}
]
}
{
"routing": {
"rules": [
{
"protocol": "dns",
"outboundTag": "dns-out",
"ruleTag": "dns"
}
]
}
- можно использовать fake-dns, он позволяет перехватывать только dns запросы вместо всего трафика и выдавать на него адреса из указанного вами диапазона, затем дотстаточно заворачивать на nftables в tproxy только эти адреса и использовать снифер fakedns - xray будет сам подставлять вместо них правильные и отправлять запрос дальше