Настройка DNS на Sing-Box

Приветствую всех, прошу помощи в настройке Sing-Box, необходимо чтобы все запросы DNS шли на локальный адрес 127.0.0.1 там их будет обрабатывать DNS сервер, проблема в том что все DNS запросы уходят через outbound proxy на сервер vless и там успешно обрабатывается, пробовал версию 1.12, 1.11, сейчас стоит 1.10.4, у каждой версии свои настройки судя по оф сайту синга, к сожалению так и не удалось заставить отравлять запросы локально, Ubuntu 22.04 ниже конфиг

Спойлер
{
  "log": {
    "level": "debug",
    "output": "/var/log/sing-box.log"
  },
  "dns": {
  "servers": [
      {
        "tag": "local-dns",
        "address": "127.0.0.1",
        "strategy": "prefer_ipv4",
        "detour": "direct"
      }
    ],
    "rules": [
      {
        "domain": "any",
        "server": "local-dns"
      }
    ]
  },

  "inbounds": [
    {
      "type": "mixed",
      "listen": "0.0.0.0",
      "listen_port": 2080,
      "sniff": true,
      "sniff_override_destination": true,
      "users": []
    }
  ],
  "outbounds": [
    {
      "type": "direct",
      "tag": "direct"
    },
    {
      "type": "vless",
      "tag": "proxy",
      "server": "ИП СЕРВАКА",
      "server_port": 443,
      "uuid": "УАЙДИ",
      "flow": "xtls-rprx-vision",
      "packet_encoding": "xudp",
      "tls": {
        "enabled": true,
        "server_name": "САЙТ ПРИКРЫТИЯ",
        "utls": {
          "enabled": true,
          "fingerprint": "БРАУЗЕР"
        },
        "reality": {
          "enabled": true,
          "public_key": "ПУБЛИК КЛЮЧ",
          "short_id": "ШОРТ"
        }
      }
    },
    {
      "tag": "dns",
      "type": "dns"
    },
    {
      "type": "block",
      "tag": "block"
    }
  ],
  "route": {
    "rules": [
      {
        "protocol": "dns",
        "outbound": "dns"
      },
      {
        "ip_is_private": true,
        "outbound": "direct"
      },
      {
        "rule_set": "block-ads",
        "outbound": "block"
      },
      {
        "domain_suffix": ["СУФИКСЫ ДОМЕНОВ"],
        "outbound": "direct"
      },
      {
        "domain": [
          "ДОМЕН"
        ],
        "outbound": "direct"
      },
      {
        "rule_set": "ПРАВИЛО",
        "outbound": "direct"
      },
      {
        "rule_set": "ПРАВИЛО",
        "outbound": "direct"
      },
      {
        "rule_set": "ПРАВИЛО",
        "outbound": "direct"
      },
      {
        "rule_set": "ПРАВИЛО",
        "outbound": "direct"
      },
      {
        "rule_set": "ПРАВИЛО",
        "outbound": "direct"
      },
      {
        "outbound": "proxy"
      }
    ],
    "rule_set": [
      {
        "tag": "ПРАВИЛО",
        "type": "remote",
        "format": "binary",
        "url": "СЕРВЕР ОБНОВЫ ПРАВИЛ"
      },
      {
        "tag": "ПРАВИЛО",
        "type": "remote",
        "format": "binary",
        "url": "СЕРВЕР ОБНОВЫ ПРАВИЛ"
      },
      {
        "tag": "ПРАВИЛО",
        "type": "remote",
        "format": "binary",
        "url": "СЕРВЕР ОБНОВЫ ПРАВИЛ"
      },
      {
        "tag": "ПРАВИЛО",
        "type": "remote",
        "format": "binary",
        "url": "СЕРВЕР ОБНОВЫ ПРАВИЛ"
      },
      {
        "tag": "ПРАВИЛО",
        "type": "remote",
        "format": "binary",
        "url": "СЕРВЕР ОБНОВЫ ПРАВИЛ"
      },
      {
        "tag": "ПРАВИЛО",
        "type": "remote",
        "format": "binary",
        "url": "СЕРВЕР ОБНОВЫ ПРАВИЛ"
      }
    ],
    "auto_detect_interface": true
  },
  "experimental": {
    "cache_file": {
      "enabled": true
    }
  }
}

Я не уверен, что это валидное правило, скорее всего, Sing-Box будет искать совпадение имени домена со строкой “any”.
Попробуйте:

    "rules": [
      {
        "outbound": "any",
        "server": "local-dns"
      }
    ]

Или:

    "rules": [
      {
        "domain_regex": ".*",
        "server": "local-dns"
      }
    ]

сервер один, если бы был tun, то никаких правил чтобы он был использован не нужно. но здесь inbound - socks, а ему нужно route rule - resolve а не procotol: dns

к сожалению не одно не сработало, так же всё на сервер гонит

подробнее пожалуйста

{
    "dns": {
        "servers": [
			{
                "address": "127.0.0.1:53",
				"detour": "direct",
                "tag": "localhost-dns"
            }
        ],
        "strategy": "ipv4_only"
    },
    "inbounds": [
        {
            "listen": "0.0.0.0",
            "listen_port": 1080,
            "tag": "mixed-in",
            "type": "mixed"
        }
    ],
    "log": {
        "disabled": false,
        "level": "debug"
    },
    "outbounds": [
		#add your outbound
        {
            "tag": "direct",
            "type": "direct"
        }
    ],
    "route": {
        "rules": [
			{
                "action": "sniff"
            },
            {
				"protocol": "dns",
                "action": "hijack-dns" # в случае если будет добавлен tun или другой inbound
            },
            {
                "inbound": "mixed-in",
				"action": "resolve"
            }
        ]
    }
}

если на сервере включен сниффинг, то в случае сингбокса sniff_override_destination быть не должно, в случае xray должен быть включен RouteOnly, иначе будет использоваться днс который на сервере

спасибо за предложенные изменения, версия 1.10.4 не стартует, на 1.11.4 запустил, но поведение то же, гонит днс через прокси на сервак

вот поный конфиг после изменений, я где то накосячил?

Спойлер
{
  "log": {
    "level": "debug",
    "output": "/var/log/sing-box.log"
  },
  "dns": {
  "servers": [
      {
        "address": "127.0.0.1",
        "detour": "direct",
        "tag": "localhost-dns"
      }
     ],
        "strategy": "ipv4_only"
  },
  "inbounds": [
    {
      "type": "mixed",
      "listen": "0.0.0.0",
      "listen_port": 2080,
      "sniff": true,
      "users": []
    }
  ],
  "outbounds": [
    {
      "type": "direct",
      "tag": "direct"
    },
    {
      "type": "vless",
      "tag": "proxy",
      "server": "ИП СЕРВАКА",
      "server_port": 443,
      "uuid": "УАЙДИ",
      "flow": "xtls-rprx-vision",
      "packet_encoding": "xudp",
      "tls": {
        "enabled": true,
        "server_name": "САЙТ ПРИКРЫТИЯ",
        "utls": {
          "enabled": true,
          "fingerprint": "БРАУЗЕР"
        },
        "reality": {
          "enabled": true,
          "public_key": "ПУБЛИК КЛЮЧ",
          "short_id": "ШОРТ"
        }
      }
    },
    {
      "type": "block",
      "tag": "block"
    }
  ],
  "route": {
    "rules": [
      {
         "action": "sniff"
      },
      {
         "protocol": "dns",
         "action": "hijack-dns"
      },
      {
         "inbound": "mixed",
         "action": "resolve"
      },
      {
        "rule_set": "block-ads",
        "outbound": "block"
      },
      {
        "domain_suffix": ["СУФИКСЫ ДОМЕНОВ"],
        "outbound": "direct"
      },
      {
        "domain": [
          "ДОМЕН"
        ],
        "outbound": "direct"
      },
      {
        "rule_set": "ПРАВИЛО",
        "outbound": "direct"
      },
      {
        "rule_set": "ПРАВИЛО",
        "outbound": "direct"
      },
      {
        "rule_set": "ПРАВИЛО",
        "outbound": "direct"
      },
      {
        "rule_set": "ПРАВИЛО",
        "outbound": "direct"
      },
      {
        "rule_set": "ПРАВИЛО",
        "outbound": "direct"
      },
      {
        "outbound": "proxy"
      }
    ],
    "rule_set": [
      {
        "tag": "ПРАВИЛО",
        "type": "remote",
        "format": "binary",
        "url": "СЕРВЕР ОБНОВЫ ПРАВИЛ"
      },
      {
        "tag": "ПРАВИЛО",
        "type": "remote",
        "format": "binary",
        "url": "СЕРВЕР ОБНОВЫ ПРАВИЛ"
      },
      {
        "tag": "ПРАВИЛО",
        "type": "remote",
        "format": "binary",
        "url": "СЕРВЕР ОБНОВЫ ПРАВИЛ"
      },
      {
        "tag": "ПРАВИЛО",
        "type": "remote",
        "format": "binary",
        "url": "СЕРВЕР ОБНОВЫ ПРАВИЛ"
      },
      {
        "tag": "ПРАВИЛО",
        "type": "remote",
        "format": "binary",
        "url": "СЕРВЕР ОБНОВЫ ПРАВИЛ"
      },
      {
        "tag": "ПРАВИЛО",
        "type": "remote",
        "format": "binary",
        "url": "СЕРВЕР ОБНОВЫ ПРАВИЛ"
      }
    ],
    "auto_detect_interface": true
  },
  "experimental": {
    "cache_file": {
      "enabled": true
    }
  }
}

если outbound сменить на direct то запросы идут на 127.0.0.1

      {
        "outbound": "direct"
      }

но в моём случае должно быть outbound proxy, т.е. я использую правила исключения для коннекта на прямую а весь трафик идёт за бугор, и понятно почему днс туда же идут, но возможность настройки есть а реализовать так и не вышло

      {
        "outbound": "proxy"
      }

даже если стоит outbound proxy то правило "ip_is_private"должно отправлять 127.0.0.1 на direct, не понимаю почему этого не происходит

      {
        "ip_is_private": true,
        "outbound": "direct"
      }

Если к примеру конфига добавить только outbound без route правил, то проблема остается?
Если нет, то добавляйте к рабочему конфигу не всё сразу, а частями, чтобы определить проблемную часть.

проблема остаётся, так же бегает на удалённый, даже без правил, оставил только dns

Спойлер
  "route": {
    "rules": [
      {
         "action": "sniff"
      },
      {
         "inbound": "mixed",
         "action": "resolve"
      },
      {
        "outbound": "proxy"
      }
    ],
  },
}

зачем вы добавляете последнее правило с outbound proxy? первый outbound это дефолтный, ставьте первым свой vless. я посмотрел на ваш конфиг выше и вы кажется так и не попробовали взять мой конфиг и отредачить его, а стали менять свой и поменяли не до конца (т.к. у mixed in остался sniff который уже не поддерживается, и даже нет tag и значит правило resolve никогда не сработает). ну и ещё: все десяток правил с rule_set, domain, domain_suffix можно сделать в 1 правило

без данного правила не идет трафик через proxy, вот ваш конфиг вставил свой outbound и естественно без правил данный конфиг становится бесполезным, без правил не работают маршруты

мой конфиг рабочий и маршруты работают, то что их больше одного это работе не мешает, проблема только в dns

Спойлер
{
  "dns": {
    "servers": [
      {
        "address": "127.0.0.1:53",
        "detour": "direct",
        "tag": "localhost-dns"
      }
    ],
    "strategy": "ipv4_only"
  },
  "inbounds": [
    {
      "listen": "0.0.0.0",
      "listen_port": 1080,
      "tag": "mixed-in",
      "type": "mixed"
    }
  ],
  "log": {
    "disabled": false,
    "level": "debug"
  },
  "outbounds": [
    {
      "type": "direct",
      "tag": "direct"
    },
    {
      "type": "vless",
      "tag": "proxy",
      "server": "ИП СЕРВАКА",
      "server_port": 443,
      "uuid": "УАЙДИ",
      "flow": "xtls-rprx-vision",
      "packet_encoding": "xudp",
      "tls": {
        "enabled": true,
        "server_name": "САЙТ ПРИКРЫТИЯ",
        "utls": {
          "enabled": true,
          "fingerprint": "БРАУЗЕР"
        },
        "reality": {
          "enabled": true,
          "public_key": "ПУБЛИК КЛЮЧ",
          "short_id": "ШОРТ"
        }
      }
    },
    {
      "type": "block",
      "tag": "block"
    }
  ],
  "route": {
    "rules": [
      {
        "inbound": "mixed",
         "action": "sniff"
      },
      {
         "inbound": "mixed",
         "action": "resolve"
      },
    ]
  }
}

зато мне мешают когда я читаю конфиг

потому что вы ставите vless вторым outbound.

inbound с тегом “mixed-in”, в правиле вы пишете “mixed”

Спасибо вам огромное! с вашими рекомендациями всё получилось, DNS остаётся в локале, ниже выложу рабочий конфиг для DNS на 127.0.0.1 может кому пригодится

Спойлер
{
  "dns": {
    "servers": [
      {
        "address": "127.0.0.1:53",
        "detour": "direct",
        "tag": "localhost-dns"
      }
    ],
    "strategy": "ipv4_only"
  },
  "inbounds": [
    {
      "listen": "0.0.0.0",
      "listen_port": 2080,
      "tag": "mixed",
      "type": "mixed"
    }
  ],
  "log": {
    "disabled": false,
    "level": "debug"
  },
  "outbounds": [
    {
      "type": "direct",
      "tag": "direct"
    },
    {
      "type": "vless",
      "tag": "proxy",
      "server": "ИП СЕРВАКА",
      "server_port": 443,
      "uuid": "УАЙДИ",
      "flow": "xtls-rprx-vision",
      "packet_encoding": "xudp",
      "tls": {
        "enabled": true,
        "server_name": "САЙТ ПРИКРЫТИЯ",
        "utls": {
          "enabled": true,
          "fingerprint": "БРАУЗЕР"
        },
        "reality": {
          "enabled": true,
          "public_key": "ПУБЛИК КЛЮЧ",
          "short_id": "ШОРТ"
        }
      }
    },
    {
      "type": "block",
      "tag": "block"
    }
  ],
  "route": {
    "rules": [
      {
        "inbound": "mixed",
         "action": "sniff"
      },
      {
         "inbound": "mixed",
         "action": "resolve"
      },
    ]
  }
}

В вашем последнем конфиге в конце ошибка- запятая после }, закрывающей последнее правило. Ещё по этому конфигу весь трафик пойдет в директ.
А с DNS "address": "local" не пробовали? Вот поправил немного последний конфиг, не люблю когда маячат лишние, ни на что не влияющие строки, убрал их. Применил более логичное правило в конце, убрал лишнюю запятую и сделал чтобы весь трафик шёл в proxy. Конфиг для версии 1.11.

{
  "log": {
    "level": "debug"
  },
  "dns": {
    "servers": [
      {
        "address": "local"
      }
    ],
    "strategy": "ipv4_only"
  },
  "inbounds": [
    {
      "type": "mixed",
      "listen": "0.0.0.0",
      "listen_port": 2080
    }
  ],
  "outbounds": [
    {
      "type": "vless",
      "server": "ИП СЕРВАКА",
      "server_port": 443,
      "uuid": "УАЙДИ",
      "flow": "xtls-rprx-vision",
      "tls": {
        "enabled": true,
        "server_name": "САЙТ ПРИКРЫТИЯ",
        "utls": {
          "enabled": true,
          "fingerprint": "БРАУЗЕР"
        },
        "reality": {
          "enabled": true,
          "public_key": "ПУБЛИК КЛЮЧ",
          "short_id": "ШОРТ"
        }
      }
    }
  ],
  "route": {
    "rules": [
      {
         "action": "sniff"
      },
      {
         "protocol": "dns",
         "action": "hijack-dns"
      }
    ]
  }
}

эти новые конфиги это уже флуд, сингбокс ту запятую сожрёт нормально, а ваш конфиг неправильный т.к. будет гонять днс через сервер (а точнее пакеты сокс прокси с доменом внутри, а не c ip), вы удалили ключевое правило resolve…
я рабочий уже давал Настройка DNS на Sing-Box - #6 by 0ka и учёл что в будущем могут добавить tun и правила роутинга с доменами

Вы бы хоть сначала попробовали, а потом делали заключения о том, что и как в нём работает и работает ли вообще. На убунту не имел возможности проверить, но если очень захочу, то проверю и на нём. Но андроиде работает как задумано последним конфигом Buttercup, только трафик идёт не в директ, а в туннель. Dns запросы при проверке поймал именно на домашнем dns сервере, а не на поднятом на vps. Честь вам и хвала, что учли возможное добавление tun, я предпочитаю не учитывать возможное, а только то, что имеем.
Можете задать вопросы по смущающим вас частям конфига или их отсутствию. Я приведу свои аргументы, вы свои, может я что-то новое узнаю. Я же не утверждаю, что познал sing-box полностью и что мои решения единственно верные. Но этот конфиг рабочий. А основной его смысл в предложении использовать “address”: “local” вместо прописывания ip адреса локалхоста, так что я бы не сказал что мой пост с конфигом- флуд.

логи вашего конфига:


на клиенте в логе никаких упоминаний о днс, а на сервер пришел пакет с доменным именем и резолвинг произошёл именно там, неожиданно?
проверялось через curl -x socks5h://127.0.0.1 2ip.me, буква h в socks5h важна т.к. она включает резолвинг через сокс прокси а не через системный днс, вы скорее всего не учли данный момент когда тестировали (т.е. ваш софт не умеет socks5h, а только socks5)

Я, честно говоря, впервые слышу про socks5h. Расскажу как я тестировал. Этот свой конфиг запускал в приложении sing-box на ТВ боксе с 9 андроидом. Подключался к нему как к socks5 серверу с приложения sing-box на мобильнике. Конфигом на мобильнике весь трафик, включая и днс запросы, направляется в туннель до sing-box на тв-боксе. Всё это находится в домашней сети. Так же в домашней сети в lxc контейнере proxmox на мини-пк работает Adgurad Home, локальный ip которого роутером назначается всем устройствам dns сервером. И на vps работает AGH в качестве dns сервера для туннелируемого туда трафика. Если в sing-box на тв-боксе запущен этот конфиг, являющийся по факту серверным, а на мобильнике запущен конфиг, являющийся для него клиентским, и я в браузере на мобильнике открываю конкретные сайты, то днс запросы к этим конкретным сайтам фиксируются в AGH дома, а в AGH на vps не фиксируются. Если в этом конфиге вместо “address”: “local” я вписываю “address”: “127.0.0.1”, то выходит наоборот- днс запросы фиксируются в AGH на vps, а в AGH дома не фиксируются. Логично же сделать вывод, что в первом случае резолв идёт через локалхост, а во втором через туннель на vps?

Логично только на половину т.к. у вас не используется socks5h (а напр в firefox используется именно он если в настройках вписать сокс прокси и поставить галку resolve through socks), в вашем случае (прозрачный прокси или же tun через socks) при загрузке 1 сайта происходит два запроса к прокси серверу: днс запрос (который ловится правилами sniff и hijack-dns) и https запрос на ip адрес, в случае с firefox и curl (socks5h) при загрузке 1 сайта происходит один запрос к прокси серверу: https запрос на доменное имя (которое может быть поймано через правило resolve).
Ваш конфиг работает только для socks5, мой конфиг работает для socks5 и socks5h (и скорее всего для http прокси тоже). Если не учитывать это и прописать прокси напр firefox или другом софте, то вы не заметите как будет использоваться удаленный днс и правила роутинга по ip перестанут работать.
Надеюсь это последний пост в теме и для остальных повторяю что рабочий конфиг Настройка DNS на Sing-Box - #6 by 0ka

Точно. Проверить через просто прокси расширение (FoxyProxy) в файрфоксе как-то в голову не пришло, не пользуюсь я такими методами. Проверил. Действительно, при подключении к конфигу через FoxyProxy, днс запросы при “address”: “local” уходят в AGH на vps. Делаю вывод, что это зависит от реализации клиента. Если клиент на sing-box, в моём случае с tun inbound и socks5 outbound, то работает как я описал выше, если клиент, например, FoxyProxy в браузере, тот тут уже “address”: “local” не канает без дополнительных правил в серверном конфиге. Хорошо, ваш конфиг самый лучший). И спасибо за науку, реально полезно. А всем остальным- не пользуйтесь моим конфигом ни в коем случае, а то я вас плохому научу). За сим откланиваюсь.

1 Like