Настройка sing-box. Как зароутить в прокси ipv6-only домены не сломав все остальное?

Тогда удаляйте то, что сами наставили и скрипт на всякий случай тоже. Потом устанавливайте скрипт и настраивайте согласно ридми. Будут проблемы- пишите в личку или в issues. На этом хватит тут про скрипт.

Поднял sing-box 1.12.12 с tproxy на роутере asus RT-AX86U:

  • router: 511 Мб/c и под 100% CPU.
  • desktop (windows): 839 Мб/c.

Роутер не тянет или мб не так настроил, хз)

На роутере пытался (ради интереса) зароутить сам, без специальных скриптов
modprobe xt_TPROXY
#modprobe xt_socket

### ============================
### CONFIG
### ============================

# --- Режим A: только один клиент ---
CLIENT_CIDR="192.168.1.10/32"

# --- Режим B: вся подсеть ---
#CLIENT_CIDR="192.168.1.0/24"

# Порт sing-box TPROXY
TPROXY_PORT="12345"

### ============================
### ROUTING POLICY
### ============================

# Очистка старых правил
ip rule del fwmark 1 table 100 2>/dev/null
ip route flush table 100

# Создание таблицы policy routing
ip rule add fwmark 1 lookup 100
ip route add local 0.0.0.0/0 dev lo table 100


### ============================
### IPTABLES (IPv4)
### ============================

iptables -t mangle -F SBOX 2>/dev/null
iptables -t mangle -X SBOX 2>/dev/null
iptables -t mangle -N SBOX

# Исключения (LAN + Multicast + Broadcast)
iptables -t mangle -A SBOX -d 192.168.1.0/24 -j RETURN
iptables -t mangle -A SBOX -d 224.0.0.0/4 -j RETURN
iptables -t mangle -A SBOX -d 255.255.255.255 -j RETURN

# Проксирование TCP/UDP для выбранного клиента
iptables -t mangle -A SBOX -s $CLIENT_CIDR -p tcp \
    -j TPROXY --on-port $TPROXY_PORT --on-ip 0.0.0.0 --tproxy-mark 1

iptables -t mangle -A SBOX -s $CLIENT_CIDR -p udp \
    -j TPROXY --on-port $TPROXY_PORT --on-ip 0.0.0.0 --tproxy-mark 1

# Включение цепочки в PREROUTING
iptables -t mangle -A PREROUTING -j SBOX


### ============================
### MSS FIX
### ============================

iptables -t mangle -A FORWARD -p tcp --tcp-flags SYN,RST SYN \
    -j TCPMSS --clamp-mss-to-pmtu

echo "TPROXY rules loaded successfully."


Выяснил! Дело было в моем локальном dnsmaq. sing-box в случае direct доменов пытался идти не в шлюз 192.168.1.1 для резолва dns, а на мой dnsmaq, который был выключен. Он тупил 5 сек, а потом шел на 192.168.1.1.

То есть когда я включил свой dnsmaq - все заработало. Альтернативно можно просто удалить в настройках роутера доп dns сервер.

P.S. Нашел, что он идет на адрес моего dnsmaq через wireshark

Так работает HAPP

Наконец-то разобрался с отваливанием ipv6 на openwrt у мгтс, и с учётом стабильного аплинка пришлось доработать для ipv6 точечную маршрутизацию по доменам в туннель. Она настроена стандартно, через (ручные) списки хостов в dhcp, которые автоматически резолвятся через dnsmasq при dns-запросе. Везде продублировал отдельные таблицы, маркировку, правила, маршрут и т.п. для ipv6, единым пока остался только сам туннель, которому добавил внутренний ipv6 адрес, всё работает. Однако получается, теперь в dhcp нужно вести два списка доменов, один для ipv6, другой для ipv4, при этом заносить одновременно в два не получится. Опытным путём выяснено, что отрабатывает (или не отрабатывает) только первый по порядку в файле dhcp список, где домен попадается. Т.е. теперь ещё нужно проверять, как домен ходит, и добавлять в нужный список, для ipv4 или ipv6. В такой схеме оно так у всех базово организовано или я что-то упускаю очевидное в настройках?

Х.з., у меня Asus с прошивкой Мерлина и организовано принципиально по другому- никаких списков в dhcp, в ядро sing-box с помощью правил и маршрутов, созданных скриптом, попадает весь (или не весь при использовании fakeip) трафик выбранных устройств и всё днсится и роутится в самом sing-box.

Я вот почитал по диагонали ваш скриптец и вижу тут всякие штуки по типу строк ниже. В одном варианте ходим мимо sing-box, в другом заходим в sing-box, но если из него в {“type”: “local”,“tag”: “dns-local”} - получим тыкву

iptables -t nat -I SBS-NAT -p tcp -m mark --mark $FW_MARK --dport 53 -j DNAT --to-destination $DNAT_DNS

iptables -t mangle -I SBS-MANGLE -p tcp -s $subnet -d $BR0_ADDRESS --dport 53 -j TPROXY --on-port $TPROXY_PORT --tproxy-mark $FW_MAR

Где у вас настраивается роутинг dns запросов, чтобы работало по схеме: dns запрос → [sing-box → если ru домен → direct/local] → резолвинг через BR0, как будто sing-box не участвовал вовсе (см топик)? Нигде? Вы тупо всегда в какой-то remote DNS ходите по типу 8.8.8.8?

Я хочу слепить свой максимально простой скрипт, где только основные правила роутинга и ничего лишнего.

Что-то не догоняю. Можете подробнее что надо сделать, чтобы получить тыкву, и чем это грозит?

Упрощённо- есть меню для указания ip адресов устройств, трафик которых будет идти через sing-box. Соответственно и их dns запросы будут завёрнуты в sing-box. Дальше всё разруливается в самом sing-box, согласно прописанному конфигу.

Ну вот я так и хотел сделать, ток у меня получается как раз та самая тыква, когда пытаюсь в конфиге sing-box зароутить запрос в local dns : )

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

А, так это у вас тыква, при работе с вашим скриптом, а не с моим.

Все так. Можете пример вашего конфига sing-box скинуть? Конкретно dns части

  "dns": {
    "servers": [
      {
        "type": "udp",
        "tag": "dns-direct",
        "server": "192.168.50.30"
      },
      {
        "type": "udp",
        "tag": "dns-vps",
        "detour": "Proxy",
        "server": "10.73.105.1"
      }
    ],
    "rules": [
      {
        "clash_mode": "Direct",
        "server": "dns-direct"
      },
      {
        "action": "predefined",
        "answer": "ntc.party IN A 130.255.77.28",
        "domain":"ntc.party"
      },
      {
        "type": "logical",
        "mode": "or",
        "rules": [
          {
            "clash_mode": "VPS"
          },
          {
            "inbound": "mixed2global"
          },
          {
            "source_ip_cidr": [
              "192.168.50.39",
              "192.168.50.40"
            ]
          },
          {
            "rule_set": "my_domains"
          }
        ],
        "server": "dns-vps"
      }
    ],
    "reverse_mapping": true,
    "strategy": "ipv4_only",
    "independent_cache": true
  },

Спасибо. Это ваш шлюз или отдельный dns сервер в домашней сети?

Да, AGH в lxc контейнере proxmox на мини-пк. На vps тоже AGH стоит, это один из его локальных ip прописан как dns-vps.

Понятно. А можешь рассказать про DNAT_DNS=“1.1.1.1:53535” ?

Это какая-то хитрость и у тебя локально что-то слушает 53535 или это клиентские DNS запросы действительно туда улетят?

Параллельно изучаю твою перписку вот тут, вижу что изначально была идея указать адрес sing-box в DNAT_DNS, но в итоговом скрипте такого нет. В чем фишка?

Можно в личку

Это какая-то хитрость). Порт меняем чтобы помеченные пакеты днс запросов не попали в dnsmasq роутера, который эксклюзивно сидит на 53 порту, а адрес меняем чтобы не возникало петель запросов. Днс запросы туда не улетят, т.к. будут отсниффлены по протоколу днс и обработаны dns секцией конфига.

Хитро, спасибо)