Настройка dns в nekoray (fork от Mahdi-zarei)

Доброго времени суток. Пытаюсь разобраться как настроить, чтобы все dns-запросы шли через vpn-сервер. И, будет ли этого достаточно чтобы условный https://dnsleaktest.com/ всё показывал правильно.
Что сделано - во вкладке DNS и в direct, и в remote прописал https://dns.comss.one/dns-query. И, вот такой routing profile сейчас.

Спойлер
[{
    "action": "route",
    "outbound": "proxy",
    "protocol": "dns"
}
,{
    "action": "route",
    "outbound": "direct",
    "rule_set": [
        "ru_IP",
        "category-ru_SITE",
        "category-gov-ru_SITE"
    ]
}
,{
    "action": "route",
    "domain_suffix": [
        "cloudflare-ech.com",
        "wixmp.com",
        "autoevolution.com",
        "linktr.ee",
        "greasyfork.org",
        "nsc.org",
        "science.org",
        "techspot.com",
        "qbittorrent.org",
        "phoronix.com",
        "habr.com",
        "audiophilesoft.com",
        "newtrack.info",
        "t-ru.org",
        "tractor.in",
        "rsshub.app",
        "t.me",
        "temu.to",
        "temu.com",
        "futurecdn.net",
        "woztell.com",
        "nyaa.si",
        "userscloud.com",
        "myip.ru",
        "whatismyipaddress.com",
        "yarnpkg.com",
        "vk-save.com",
        "poe.com",
        "linustechtips.com",
        "grok.com",
        "openrouter.ai",
        "ngrok.com",
        "nyaa.si",
        "nyaa.land",
        "lidarr.audio",
        "servarr.com",
        "4pda.to",
        "proton.me",
        "trustpilot.com",
        "googlevideo.com"
    ],
    "outbound": "proxy",
    "rule_set": [
        "kemono_SITE",
        "steam_SITE",
        "anthropic_SITE",
        "poe_SITE",
        "tiktok_SITE"
    ]
}
,{
    "action": "route",
    "domain_suffix": [
        "whatsmyipadress.com",
        "myip.com",
        "browserleaks.com"
    ],
    "outbound": "proxy"
}
,{
    "action": "route",
    "domain_suffix": [
        "superhuman.ai"
    ],
    "outbound": "proxy",
    "rule_set": [
        "ookla-speedtest_SITE",
        "speedtest_SITE"
    ]
}
,{
    "action": "route",
    "ip_cidr": [
        "173.245.48.0/20",
        "103.21.244.0/22",
        "103.22.200.0/22",
        "103.31.4.0/22",
        "141.101.64.0/18",
        "108.162.192.0/18",
        "190.93.240.0/20",
        "188.114.96.0/20",
        "197.234.240.0/22",
        "198.41.128.0/17",
        "162.158.0.0/15",
        "104.16.0.0/13",
        "104.24.0.0/14",
        "172.64.0.0/13",
        "131.0.72.0/22"
    ],
    "outbound": "proxy"
}
]

Может подскажете как правильно сделать. Или я что-то фундаментально не понимаю.

правила для днс уже должны быть в nekoray, вы добавили своё (первое) которое не к месту (скорее всего никогда не сработает, нужен полный конфиг чтобы точно понять)

Вот полный конфиг, вроде. По понятным причинам часть параметров подключения к vpn-серверу убрал.

Спойлер
{"dns":{"rules":[{"action":"route","domain":[],"domain_keyword":[],"domain_regex":[],"domain_suffix":[],"rule_set":["category-ru_SITE","category-gov-ru_SITE"],"server":"dns-direct"}],"servers":[{"address":"https://dns.comss.one/dns-query","address_resolver":"dns-local","detour":"direct","strategy":"prefer_ipv4","tag":"dns-direct"},{"address":"https://dns.comss.one/dns-query","address_resolver":"dns-local","detour":"proxy","strategy":"prefer_ipv4","tag":"dns-remote"},{"address":"rcode://success","tag":"dns-block"},{"address":"underlying://0.0.0.0","detour":"direct","tag":"dns-local"}]},"endpoints":[],"experimental":{"clash_api":{"default_mode":""}},"inbounds":[{"domain_strategy":"","listen":"127.0.0.1","listen_port":2080,"tag":"mixed-in","type":"mixed"}],"log":{"level":"error"},"outbounds":[{"domain_strategy":"","method":"chacha20-ietf-poly1305","password":"","server":"","server_port":,"tag":"proxy","type":"shadowsocks","udp_over_tcp":false},{"tag":"direct","type":"direct"}],"route":{"final":"direct","find_process":true,"rule_set":[{"format":"binary","path":"rule_sets/ru_IP.srs","tag":"ru_IP","type":"local"},{"format":"binary","path":"rule_sets/category-ru_SITE.srs","tag":"category-ru_SITE","type":"local"},{"format":"binary","path":"rule_sets/category-gov-ru_SITE.srs","tag":"category-gov-ru_SITE","type":"local"},{"format":"binary","path":"rule_sets/kemono_SITE.srs","tag":"kemono_SITE","type":"local"},{"format":"binary","path":"rule_sets/steam_SITE.srs","tag":"steam_SITE","type":"local"},{"format":"binary","path":"rule_sets/anthropic_SITE.srs","tag":"anthropic_SITE","type":"local"},{"format":"binary","path":"rule_sets/poe_SITE.srs","tag":"poe_SITE","type":"local"},{"format":"binary","path":"rule_sets/tiktok_SITE.srs","tag":"tiktok_SITE","type":"local"},{"format":"binary","path":"rule_sets/ookla-speedtest_SITE.srs","tag":"ookla-speedtest_SITE","type":"local"},{"format":"binary","path":"rule_sets/speedtest_SITE.srs","tag":"speedtest_SITE","type":"local"}],"rules":[{"action":"sniff","inbound":["mixed-in","tun-in"]},{"action":"route","outbound":"proxy","protocol":"dns"},{"action":"route","outbound":"direct","rule_set":["ru_IP","category-ru_SITE","category-gov-ru_SITE"]},{"action":"route","domain_suffix":["cloudflare-ech.com","wixmp.com","autoevolution.com","linktr.ee","greasyfork.org","nsc.org","science.org","techspot.com","qbittorrent.org","phoronix.com","habr.com","audiophilesoft.com","newtrack.info","t-ru.org","tractor.in","rsshub.app","t.me","temu.to","temu.com","futurecdn.net","woztell.com","nyaa.si","userscloud.com","myip.ru","whatismyipaddress.com","yarnpkg.com","vk-save.com","poe.com","linustechtips.com","grok.com","openrouter.ai","ngrok.com","nyaa.si","nyaa.land","lidarr.audio","servarr.com","4pda.to","proton.me","trustpilot.com","googlevideo.com"],"outbound":"proxy","rule_set":["kemono_SITE","steam_SITE","anthropic_SITE","poe_SITE","tiktok_SITE"]},{"action":"route","domain_suffix":["whatsmyipadress.com","myip.com","browserleaks.com"],"outbound":"proxy"},{"action":"route","domain_suffix":["superhuman.ai"],"outbound":"proxy","rule_set":["ookla-speedtest_SITE","speedtest_SITE"]},{"action":"route","ip_cidr":["173.245.48.0/20","103.21.244.0/22","103.22.200.0/22","103.31.4.0/22","141.101.64.0/18","108.162.192.0/18","190.93.240.0/20","188.114.96.0/20","197.234.240.0/22","198.41.128.0/17","162.158.0.0/15","104.16.0.0/13","104.24.0.0/14","172.64.0.0/13","131.0.72.0/22"],"outbound":"proxy"}]}}

дай нормальный конфиг, это нечитабельно и даже не парсится из-за ошибки в синтаксисе

Да, извиняюсь по поводу форматирования. А то что не парсится - это очевидно, ибо убраны значения у password, server и server_port

Спойлер
{
    "dns": {
        "rules": [
            {
                "action": "route",
                "domain": [
                ],
                "domain_keyword": [
                ],
                "domain_regex": [
                ],
                "domain_suffix": [
                ],
                "rule_set": [
                    "category-ru_SITE",
                    "category-gov-ru_SITE"
                ],
                "server": "dns-direct"
            }
        ],
        "servers": [
            {
                "address": "https://dns.comss.one/dns-query",
                "address_resolver": "dns-local",
                "detour": "direct",
                "strategy": "prefer_ipv4",
                "tag": "dns-direct"
            },
            {
                "address": "https://dns.comss.one/dns-query",
                "address_resolver": "dns-local",
                "detour": "proxy",
                "strategy": "prefer_ipv4",
                "tag": "dns-remote"
            },
            {
                "address": "rcode://success",
                "tag": "dns-block"
            },
            {
                "address": "underlying://0.0.0.0",
                "detour": "direct",
                "tag": "dns-local"
            }
        ]
    },
    "endpoints": [
    ],
    "experimental": {
        "clash_api": {
            "default_mode": ""
        }
    },
    "inbounds": [
        {
            "domain_strategy": "",
            "listen": "127.0.0.1",
            "listen_port": 2080,
            "tag": "mixed-in",
            "type": "mixed"
        }
    ],
    "log": {
        "level": "error"
    },
    "outbounds": [
        {
            "domain_strategy": "",
            "method": "chacha20-ietf-poly1305",
            "password": "",
            "server": "",
            "server_port": ,
            "tag": "proxy",
            "type": "shadowsocks",
            "udp_over_tcp": false
        },
        {
            "tag": "direct",
            "type": "direct"
        }
    ],
    "route": {
        "final": "direct",
        "find_process": true,
        "rule_set": [
            {
                "format": "binary",
                "path": "rule_sets/ru_IP.srs",
                "tag": "ru_IP",
                "type": "local"
            },
            {
                "format": "binary",
                "path": "rule_sets/category-ru_SITE.srs",
                "tag": "category-ru_SITE",
                "type": "local"
            },
            {
                "format": "binary",
                "path": "rule_sets/category-gov-ru_SITE.srs",
                "tag": "category-gov-ru_SITE",
                "type": "local"
            },
            {
                "format": "binary",
                "path": "rule_sets/kemono_SITE.srs",
                "tag": "kemono_SITE",
                "type": "local"
            },
            {
                "format": "binary",
                "path": "rule_sets/steam_SITE.srs",
                "tag": "steam_SITE",
                "type": "local"
            },
            {
                "format": "binary",
                "path": "rule_sets/anthropic_SITE.srs",
                "tag": "anthropic_SITE",
                "type": "local"
            },
            {
                "format": "binary",
                "path": "rule_sets/poe_SITE.srs",
                "tag": "poe_SITE",
                "type": "local"
            },
            {
                "format": "binary",
                "path": "rule_sets/tiktok_SITE.srs",
                "tag": "tiktok_SITE",
                "type": "local"
            },
            {
                "format": "binary",
                "path": "rule_sets/ookla-speedtest_SITE.srs",
                "tag": "ookla-speedtest_SITE",
                "type": "local"
            },
            {
                "format": "binary",
                "path": "rule_sets/speedtest_SITE.srs",
                "tag": "speedtest_SITE",
                "type": "local"
            }
        ],
        "rules": [
            {
                "action": "sniff",
                "inbound": [
                    "mixed-in",
                    "tun-in"
                ]
            },
            {
                "action": "route",
                "outbound": "proxy",
                "protocol": "dns"
            },
            {
                "action": "route",
                "outbound": "direct",
                "rule_set": [
                    "ru_IP",
                    "category-ru_SITE",
                    "category-gov-ru_SITE"
                ]
            },
            {
                "action": "route",
                "domain_suffix": [
                    "cloudflare-ech.com",
                    "wixmp.com",
                    "autoevolution.com",
                    "linktr.ee",
                    "greasyfork.org",
                    "nsc.org",
                    "science.org",
                    "techspot.com",
                    "qbittorrent.org",
                    "phoronix.com",
                    "habr.com",
                    "audiophilesoft.com",
                    "newtrack.info",
                    "t-ru.org",
                    "tractor.in",
                    "rsshub.app",
                    "t.me",
                    "temu.to",
                    "temu.com",
                    "futurecdn.net",
                    "woztell.com",
                    "nyaa.si",
                    "userscloud.com",
                    "myip.ru",
                    "whatismyipaddress.com",
                    "yarnpkg.com",
                    "vk-save.com",
                    "poe.com",
                    "linustechtips.com",
                    "grok.com",
                    "openrouter.ai",
                    "ngrok.com",
                    "nyaa.si",
                    "nyaa.land",
                    "lidarr.audio",
                    "servarr.com",
                    "4pda.to",
                    "proton.me",
                    "trustpilot.com",
                    "googlevideo.com"
                ],
                "outbound": "proxy",
                "rule_set": [
                    "kemono_SITE",
                    "steam_SITE",
                    "anthropic_SITE",
                    "poe_SITE",
                    "tiktok_SITE"
                ]
            },
            {
                "action": "route",
                "domain_suffix": [
                    "whatsmyipadress.com",
                    "myip.com",
                    "browserleaks.com"
                ],
                "outbound": "proxy"
            },
            {
                "action": "route",
                "domain_suffix": [
                    "superhuman.ai"
                ],
                "outbound": "proxy",
                "rule_set": [
                    "ookla-speedtest_SITE",
                    "speedtest_SITE"
                ]
            },
            {
                "action": "route",
                "ip_cidr": [
                    "173.245.48.0/20",
                    "103.21.244.0/22",
                    "103.22.200.0/22",
                    "103.31.4.0/22",
                    "141.101.64.0/18",
                    "108.162.192.0/18",
                    "190.93.240.0/20",
                    "188.114.96.0/20",
                    "197.234.240.0/22",
                    "198.41.128.0/17",
                    "162.158.0.0/15",
                    "104.16.0.0/13",
                    "104.24.0.0/14",
                    "172.64.0.0/13",
                    "131.0.72.0/22"
                ],
                "outbound": "proxy"
            }
        ]
    }
}

хз куда у вас пропало стоковое правило hijack-dns, у меня оно есть на конфиге без кастомных правил

"rules": [
            {
                "action": "sniff",
                "inbound": [
                    "mixed-in",
                    "tun-in"
                ]
            },
            {
                "action": "hijack-dns",
                "protocol": "dns"
            }
        ]

и его должно быть достаточно. 1 правило определяет тип пакетов, если видит днс пакет то помечает его как днс, 2 правило заворачивает все днс пакеты на локальный днс сервер синг бокса который будет работать по правилам в самом начале конфига, а у вас это заворачивание пакетов из ruleset в dns-direct, все остальные пакеты пойдут на первый днс сервер (у вас это dns-direct).
логика работы днс поменяется в sing-box 1.12 (тег дефолтного днс придётся указывать, порядок серверов уже не будет иметь значения), но это наверное будет еще не скоро

Спасибо, восстановил hijack-dns и перед ним добавил это новое правило.
Так и должно быть, верно?

Спойлер

chatgpt/grok по крайней мере работают без заворачивания их траффика в vpn.

верного или неверного тут нет, проверяйте работу правил через лог сингбокса и/или wireshark

не понял, для правильной работы днс нужны правила как у меня, т.е. стоковые, своих добавлять не нужно, дальнейшая “правильность” зависит от правил днс (объяснил выше) а не правил роутинга

Как-то так. Начало конфига (это экспорт именно из routing rules). Ну, седя по работоспособности нейронок - то всё работает ровно так, как мне и было нужно. Так что думаю, вопрос закрыт. И, ещё раз спасибо.

Спойлер
[{
    "action": "sniff",
    "inbound": [
        "mixed-in",
        "tun-in"
    ]
}
,{
    "action": "hijack-dns",
    "protocol": "dns"
}
,{
    "action": "route",
    "outbound": "direct",
    "rule_set": [
        "ru_IP",
        "category-ru_SITE",
        "category-gov-ru_SITE"
    ]
}

плохо понятно что вы экспортнули, днс правила автоматически добавляются некореем, в правилах конкретного профиля их добавлять не надо. если это полный конфиг который экспортнут после включения tun-mode, затем share - export sing-box config, то всё ок.

кстати проверил дефолтные настройки nekobox от mahdi-zarei, утечек днс нет даже если в винде указан днс от роутера

У меня не tun-mode. А просто в параметрах запуска chromium’a прописана прокси nekoray.
То есть у меня конкретно в браузере сейчас dns от comss, а во всей остальной системе - от cloudflare. Почему так? Потому что периодически github жалуется на лимит запросов, если использовать dns от comss.
По поводу дефолтного правила hijack-dns, которого у меня не было - это я похоже пока пытался сам разобраться - его и удалил. Ну, теперь оно есть.

Достаточно добавить auto_route, strict_route в конфиг sing-box.

[quote=“arinoki, post:1, topic:15687”]
Может подскажете как правильно сделать.
[/quote].

Если всерьёз беспокоят утечки днс - не используйте некобокс и его форки. Он умудряется постоянно ломать sing-box, отстаёт от апстрима и добавляет ненужное доверенное лицо между вами и sing-box.

А можете подсказать где вы его восстановили?
В интерффейсе вижу только вкладку Hijack и там можно галочку поставить, это оно?

Во вкладке hijack я вообще ничего не трогал (там галочки не стоят).

Спасибо, у меня более старая версия 4.2.9, там такого нет

На всякий случай. Есть изначальный nekoray (был 3.x версии), который с выходом 4ой версии переименовался в nekobox (но даже он по итогу уже приличное время не обновляется). А тут, в этой теме, речь конкретно про форк - GitHub - Mahdi-zarei/nekoray: Qt based cross-platform GUI proxy configuration manager (backend: sing-box)
Тут система UI поменялась, так что конфиги через интерфейс настраиваются несколько иначе.

Да у меня тоже неко от махди, только 4.2.9 версия, там ваиргард норм работает

которые и так есть в конечных конфигах некобокса по дефолту?

В Nekobox эти настройки не дают нужного результата.