Тогда удаляйте то, что сами наставили и скрипт на всякий случай тоже. Потом устанавливайте скрипт и настраивайте согласно ридми. Будут проблемы- пишите в личку или в 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 секцией конфига.
Хитро, спасибо)