gitscope
https://dev.kronoz.win/r/awesome-scripts.git
dnsleak-guard/README.md · master
Source
1 735f165 KronoZ 1mo ago # dnsleak-guard
2 735f165 KronoZ 1mo ago
3 735f165 KronoZ 1mo ago Страж системного DNS для macOS. Автоматически возвращает DNS на `127.0.0.1`, если сторонняя программа (например, Clash Verge Rev) его перезаписывает.
4 735f165 KronoZ 1mo ago
5 735f165 KronoZ 1mo ago ## 📖 Зачем это нужно
6 735f165 KronoZ 1mo ago
7 735f165 KronoZ 1mo ago **Clash Verge Rev** при запуске в режиме TUN принудительно прописывает `114.114.114.114` (китайский публичный DNS) в системные настройки macOS. Это приводит к:
8 735f165 KronoZ 1mo ago
9 735f165 KronoZ 1mo ago - **Утечке DNS** — провайдер перехватывает запросы к `114.114.114.114` и подставляет свои резолверы.
10 735f165 KronoZ 1mo ago - **Рассинхрону** — часть DNS-запросов идёт через Clash TUN, часть — мимо.
11 735f165 KronoZ 1mo ago
12 735f165 KronoZ 1mo ago `dnsleak-guard` решает проблему: LaunchDaemon раз в 10 секунд проверяет системный DNS и возвращает его на `127.0.0.1`, где его перехватывает Clash TUN.
13 735f165 KronoZ 1mo ago
14 735f165 KronoZ 1mo ago ## 📂 Состав
15 735f165 KronoZ 1mo ago
16 735f165 KronoZ 1mo ago | Файл | Назначение |
17 735f165 KronoZ 1mo ago |---|---|
18 735f165 KronoZ 1mo ago | `ensure_dns.sh` | Основной скрипт-страж. Работает от root, бесконечный цикл |
19 735f165 KronoZ 1mo ago | `com.user.dnsleak-guard.plist` | LaunchDaemon для автозапуска при загрузке |
20 735f165 KronoZ 1mo ago | `install.sh` | Скрипт автоустановки |
21 735f165 KronoZ 1mo ago
22 735f165 KronoZ 1mo ago ## 🔧 Требования
23 735f165 KronoZ 1mo ago
24 735f165 KronoZ 1mo ago - macOS 11+ (Big Sur и новее)
25 735f165 KronoZ 1mo ago - **Clash Verge Rev** или другой клиент в режиме TUN
26 735f165 KronoZ 1mo ago - `dns.listen` в конфиге Clash должен слушать порт **53** (например, `0.0.0.0:53`)
27 735f165 KronoZ 1mo ago - Права root (для `networksetup -setdnsservers`)
28 735f165 KronoZ 1mo ago
29 735f165 KronoZ 1mo ago ## 📥 Установка
30 735f165 KronoZ 1mo ago
31 735f165 KronoZ 1mo ago ### Автоматическая
32 735f165 KronoZ 1mo ago
33 735f165 KronoZ 1mo ago ```bash
34 735f165 KronoZ 1mo ago WIP
35 735f165 KronoZ 1mo ago ```
36 735f165 KronoZ 1mo ago
37 735f165 KronoZ 1mo ago ### Ручная
38 735f165 KronoZ 1mo ago
39 735f165 KronoZ 1mo ago ```bash
40 735f165 KronoZ 1mo ago # 1. Скрипт
41 735f165 KronoZ 1mo ago sudo cp ensure_dns.sh /usr/local/bin/ensure_dns.sh
42 735f165 KronoZ 1mo ago sudo chmod +x /usr/local/bin/ensure_dns.sh
43 735f165 KronoZ 1mo ago sudo chown root:wheel /usr/local/bin/ensure_dns.sh
44 735f165 KronoZ 1mo ago
45 735f165 KronoZ 1mo ago # 2. LaunchDaemon
46 735f165 KronoZ 1mo ago sudo cp com.user.dnsleak-guard.plist /Library/LaunchDaemons/
47 735f165 KronoZ 1mo ago sudo chown root:wheel /Library/LaunchDaemons/com.user.dnsleak-guard.plist
48 735f165 KronoZ 1mo ago sudo chmod 644 /Library/LaunchDaemons/com.user.dnsleak-guard.plist
49 735f165 KronoZ 1mo ago
50 735f165 KronoZ 1mo ago # 3. Загрузить
51 735f165 KronoZ 1mo ago sudo launchctl load /Library/LaunchDaemons/com.user.dnsleak-guard.plist
52 735f165 KronoZ 1mo ago
53 735f165 KronoZ 1mo ago # 4. Проверить
54 735f165 KronoZ 1mo ago sudo launchctl list | grep dnsleak-guard
55 735f165 KronoZ 1mo ago ```
56 735f165 KronoZ 1mo ago
57 735f165 KronoZ 1mo ago ## 🚀 Использование
58 735f165 KronoZ 1mo ago
59 735f165 KronoZ 1mo ago После установки демон работает автоматически:
60 735f165 KronoZ 1mo ago
61 735f165 KronoZ 1mo ago - Запускается при загрузке системы (до логина пользователя).
62 735f165 KronoZ 1mo ago - Каждые 10 секунд проверяет DNS на всех активных сетевых сервисах.
63 735f165 KronoZ 1mo ago - Если DNS отличается от `127.0.0.1` — сбрасывает его и очищает DNS-кэш macOS.
64 735f165 KronoZ 1mo ago - Пишет события в `/tmp/dnsleak-guard.log`.
65 735f165 KronoZ 1mo ago
66 735f165 KronoZ 1mo ago ### Проверка состояния
67 735f165 KronoZ 1mo ago
68 735f165 KronoZ 1mo ago ```bash
69 735f165 KronoZ 1mo ago # Демон запущен?
70 735f165 KronoZ 1mo ago sudo launchctl list | grep dnsleak-guard
71 735f165 KronoZ 1mo ago
72 735f165 KronoZ 1mo ago # Текущий системный DNS
73 735f165 KronoZ 1mo ago scutil --dns | grep nameserver
74 735f165 KronoZ 1mo ago # Должно быть: nameserver[0] : 127.0.0.1
75 735f165 KronoZ 1mo ago
76 735f165 KronoZ 1mo ago # Логи работы
77 735f165 KronoZ 1mo ago tail -20 /tmp/dnsleak-guard.log
78 735f165 KronoZ 1mo ago ```
79 735f165 KronoZ 1mo ago
80 735f165 KronoZ 1mo ago ### Ожидаемые логи
81 735f165 KronoZ 1mo ago
82 735f165 KronoZ 1mo ago ```
83 735f165 KronoZ 1mo ago [2026-09-14 18:30:01] dnsleak-guard started
84 735f165 KronoZ 1mo ago [2026-09-14 18:30:05] [Wi-Fi] DNS reset: '114.114.114.114' -> 127.0.0.1
85 735f165 KronoZ 1mo ago [2026-09-14 18:30:05] DNS cache flushed
86 735f165 KronoZ 1mo ago ```
87 735f165 KronoZ 1mo ago
88 735f165 KronoZ 1mo ago Если в логах только `dnsleak-guard started` — значит, Clash не перезаписывает DNS, и страж просто ждёт.
89 735f165 KronoZ 1mo ago
90 735f165 KronoZ 1mo ago ## 🛑 Управление
91 735f165 KronoZ 1mo ago
92 735f165 KronoZ 1mo ago ```bash
93 735f165 KronoZ 1mo ago # Остановить
94 735f165 KronoZ 1mo ago sudo launchctl unload /Library/LaunchDaemons/com.user.dnsleak-guard.plist
95 735f165 KronoZ 1mo ago
96 735f165 KronoZ 1mo ago # Запустить
97 735f165 KronoZ 1mo ago sudo launchctl load /Library/LaunchDaemons/com.user.dnsleak-guard.plist
98 735f165 KronoZ 1mo ago
99 735f165 KronoZ 1mo ago # Перезапустить (после правки скрипта)
100 735f165 KronoZ 1mo ago sudo launchctl unload /Library/LaunchDaemons/com.user.dnsleak-guard.plist
101 735f165 KronoZ 1mo ago sudo launchctl load /Library/LaunchDaemons/com.user.dnsleak-guard.plist
102 735f165 KronoZ 1mo ago ```
103 735f165 KronoZ 1mo ago
104 735f165 KronoZ 1mo ago ### Полное удаление
105 735f165 KronoZ 1mo ago
106 735f165 KronoZ 1mo ago ```bash
107 735f165 KronoZ 1mo ago sudo launchctl unload /Library/LaunchDaemons/com.user.dnsleak-guard.plist
108 735f165 KronoZ 1mo ago sudo rm /Library/LaunchDaemons/com.user.dnsleak-guard.plist
109 735f165 KronoZ 1mo ago sudo rm /usr/local/bin/ensure_dns.sh
110 735f165 KronoZ 1mo ago sudo rm -f /tmp/dnsleak-guard.log /tmp/dnsleak-guard.out /tmp/dnsleak-guard.err
111 735f165 KronoZ 1mo ago
112 735f165 KronoZ 1mo ago # Вернуть автоматический DNS
113 735f165 KronoZ 1mo ago sudo networksetup -setdnsservers Wi-Fi "Empty"
114 735f165 KronoZ 1mo ago sudo networksetup -setdnsservers Ethernet "Empty" 2>/dev/null
115 735f165 KronoZ 1mo ago sudo dscacheutil -flushcache
116 735f165 KronoZ 1mo ago sudo killall -HUP mDNSResponder
117 735f165 KronoZ 1mo ago ```
118 735f165 KronoZ 1mo ago
119 735f165 KronoZ 1mo ago ## ⚙️ Конфигурация
120 735f165 KronoZ 1mo ago
121 735f165 KronoZ 1mo ago Параметры задаются в начале `ensure_dns.sh`:
122 735f165 KronoZ 1mo ago
123 735f165 KronoZ 1mo ago ```bash
124 735f165 KronoZ 1mo ago DNS_SERVER="127.0.0.1" # Целевой DNS-сервер
125 735f165 KronoZ 1mo ago LOG_FILE="/tmp/dnsleak-guard.log" # Путь к логу
126 735f165 KronoZ 1mo ago sleep 10 # Интервал проверки (в конце скрипта)
127 735f165 KronoZ 1mo ago ```
128 735f165 KronoZ 1mo ago
129 735f165 KronoZ 1mo ago ### Изменить интервал
130 735f165 KronoZ 1mo ago
131 735f165 KronoZ 1mo ago | Значение | Эффект |
132 735f165 KronoZ 1mo ago |---|---|
133 735f165 KronoZ 1mo ago | `sleep 5` | Быстрее реагирует, больше нагрузки |
134 735f165 KronoZ 1mo ago | `sleep 10` | Компромисс (по умолчанию) |
135 735f165 KronoZ 1mo ago | `sleep 30` | Реже проверяет, тише логи |
136 735f165 KronoZ 1mo ago | `sleep 60` | Минимальная нагрузка |
137 735f165 KronoZ 1mo ago
138 735f165 KronoZ 1mo ago ## 🐛 Решение проблем
139 735f165 KronoZ 1mo ago
140 735f165 KronoZ 1mo ago ### Демон не запускается
141 735f165 KronoZ 1mo ago
142 735f165 KronoZ 1mo ago ```bash
143 735f165 KronoZ 1mo ago sudo launchctl list | grep dnsleak-guard
144 735f165 KronoZ 1mo ago cat /tmp/dnsleak-guard.err
145 735f165 KronoZ 1mo ago ```
146 735f165 KronoZ 1mo ago
147 735f165 KronoZ 1mo ago Если пусто — загрузите принудительно:
148 735f165 KronoZ 1mo ago
149 735f165 KronoZ 1mo ago ```bash
150 735f165 KronoZ 1mo ago sudo launchctl load -w /Library/LaunchDaemons/com.user.dnsleak-guard.plist
151 735f165 KronoZ 1mo ago ```
152 735f165 KronoZ 1mo ago
153 735f165 KronoZ 1mo ago ### Логи переполнены ошибками «X is not a recognized network service»
154 735f165 KronoZ 1mo ago
155 735f165 KronoZ 1mo ago Это псевдо-сервисы (Thunderbolt Bridge и т.д.). Убедитесь, что в скрипте используется `while IFS= read -r service`, а не `for service in $(...)`. Обновите скрипт:
156 735f165 KronoZ 1mo ago
157 735f165 KronoZ 1mo ago ```bash
158 735f165 KronoZ 1mo ago git pull
159 735f165 KronoZ 1mo ago sudo cp ensure_dns.sh /usr/local/bin/ensure_dns.sh
160 735f165 KronoZ 1mo ago sudo launchctl unload /Library/LaunchDaemons/com.user.dnsleak-guard.plist
161 735f165 KronoZ 1mo ago sudo launchctl load /Library/LaunchDaemons/com.user.dnsleak-guard.plist
162 735f165 KronoZ 1mo ago ```
163 735f165 KronoZ 1mo ago
164 735f165 KronoZ 1mo ago ### DNS всё равно утекает
165 735f165 KronoZ 1mo ago
166 735f165 KronoZ 1mo ago **1. Проверьте, что Clash слушает порт 53:**
167 735f165 KronoZ 1mo ago
168 735f165 KronoZ 1mo ago ```bash
169 735f165 KronoZ 1mo ago sudo lsof -iTCP:53 -iUDP:53 | grep -iE "clash|mihomo"
170 735f165 KronoZ 1mo ago ```
171 735f165 KronoZ 1mo ago
172 735f165 KronoZ 1mo ago Если пусто — в конфиге Clash замените `dns.listen` на `0.0.0.0:53`.
173 735f165 KronoZ 1mo ago
174 735f165 KronoZ 1mo ago **2. Отключите DoH в браузерах:**
175 735f165 KronoZ 1mo ago
176 735f165 KronoZ 1mo ago - Chrome: `chrome://settings/security` → «Использовать безопасный DNS» → **ВЫКЛ**
177 735f165 KronoZ 1mo ago - Firefox: `about:preferences#privacy` → «Enable DNS over HTTPS» → **ВЫКЛ**
178 735f165 KronoZ 1mo ago
179 735f165 KronoZ 1mo ago **3. Сбросьте DNS-кэш:**
180 735f165 KronoZ 1mo ago
181 735f165 KronoZ 1mo ago ```bash
182 735f165 KronoZ 1mo ago sudo dscacheutil -flushcache
183 735f165 KronoZ 1mo ago sudo killall -HUP mDNSResponder
184 735f165 KronoZ 1mo ago ```
185 735f165 KronoZ 1mo ago
186 735f165 KronoZ 1mo ago **4. Проверьте через `dnsleaktest.com` → Extended Test.** Должен быть только IP вашего VPS.
187 735f165 KronoZ 1mo ago
188 735f165 KronoZ 1mo ago ### Интернет пропадает после установки
189 735f165 KronoZ 1mo ago
190 735f165 KronoZ 1mo ago Скорее всего, **Clash не слушает порт 53**, а системный DNS указывает на `127.0.0.1`, где никто не отвечает.
191 735f165 KronoZ 1mo ago
192 735f165 KronoZ 1mo ago **Быстрое восстановление:**
193 735f165 KronoZ 1mo ago
194 735f165 KronoZ 1mo ago ```bash
195 735f165 KronoZ 1mo ago sudo networksetup -setdnsservers Wi-Fi "Empty"
196 735f165 KronoZ 1mo ago sudo dscacheutil -flushcache
197 735f165 KronoZ 1mo ago sudo killall -HUP mDNSResponder
198 735f165 KronoZ 1mo ago ```
199 735f165 KronoZ 1mo ago
200 735f165 KronoZ 1mo ago Затем исправьте `dns.listen` в Clash.
201 735f165 KronoZ 1mo ago
202 735f165 KronoZ 1mo ago ## 📊 Как это работает
203 735f165 KronoZ 1mo ago
204 735f165 KronoZ 1mo ago ```
205 735f165 KronoZ 1mo ago ┌─────────────────────────────────────────────────────────┐
206 735f165 KronoZ 1mo ago │ macOS │
207 735f165 KronoZ 1mo ago │ ┌───────────────────────────────────────────────────┐ │
208 735f165 KronoZ 1mo ago │ │ Системный DNS = 127.0.0.1 │ │
209 735f165 KronoZ 1mo ago │ └──────────────────┬────────────────────────────────┘ │
210 735f165 KronoZ 1mo ago │ │ │
211 735f165 KronoZ 1mo ago │ ▼ │
212 735f165 KronoZ 1mo ago │ ┌───────────────────────────────────────────────────┐ │
213 735f165 KronoZ 1mo ago │ │ Clash TUN (utun) слушает 53 │ │
214 735f165 KronoZ 1mo ago │ │ dns-hijack: any:53 │ │
215 735f165 KronoZ 1mo ago │ └──────────────────┬────────────────────────────────┘ │
216 735f165 KronoZ 1mo ago │ │ │
217 735f165 KronoZ 1mo ago │ ▼ │
218 735f165 KronoZ 1mo ago │ ┌───────────────────────────────────────────────────┐ │
219 735f165 KronoZ 1mo ago │ │ DNS → VLESS-туннель → VPS → CoreDNS │ │
220 735f165 KronoZ 1mo ago │ └───────────────────────────────────────────────────┘ │
221 735f165 KronoZ 1mo ago └─────────────────────────────────────────────────────────┘
222 735f165 KronoZ 1mo ago
223 735f165 KronoZ 1mo ago ┌─────────────────────────────────────────────────────────┐
224 735f165 KronoZ 1mo ago │ LaunchDaemon com.user.dnsleak-guard │
225 735f165 KronoZ 1mo ago │ ├── Каждые 10 сек: проверяет DNS на всех сервисах │
226 735f165 KronoZ 1mo ago │ ├── Если DNS ≠ 127.0.0.1: │
227 735f165 KronoZ 1mo ago │ │ ├── networksetup -setdnsservers │
228 735f165 KronoZ 1mo ago │ │ └── dscacheutil -flushcache + killall mDNSResponder│
229 735f165 KronoZ 1mo ago │ └── Логи в /tmp/dnsleak-guard.log │
230 735f165 KronoZ 1mo ago └─────────────────────────────────────────────────────────┘
231 735f165 KronoZ 1mo ago ```
232 735f165 KronoZ 1mo ago
233 735f165 KronoZ 1mo ago ## 🔐 Безопасность
234 735f165 KronoZ 1mo ago
235 735f165 KronoZ 1mo ago - Работает **от root** — необходимо для `networksetup -setdnsservers`.
236 735f165 KronoZ 1mo ago - Не принимает внешних команд, только меняет DNS на заранее заданный `127.0.0.1`.
237 735f165 KronoZ 1mo ago - Не передаёт данные наружу — вся работа локальная.
238 735f165 KronoZ 1mo ago - Логи содержат только имена сервисов и их DNS — никакой чувствительной информации.
239 735f165 KronoZ 1mo ago
240 735f165 KronoZ 1mo ago ## 📝 Лицензия
241 735f165 KronoZ 1mo ago
242 735f165 KronoZ 1mo ago MIT.
243 735f165 KronoZ 1mo ago
244 735f165 KronoZ 1mo ago ## 🤝 Вклад
245 735f165 KronoZ 1mo ago
246 735f165 KronoZ 1mo ago Pull request'ы приветствуются. Особенно интересны:
247 735f165 KronoZ 1mo ago
248 735f165 KronoZ 1mo ago - Уведомления через Telegram / macOS Notification Center при сбросе DNS.
249 735f165 KronoZ 1mo ago - Ротация логов.
250 735f165 KronoZ 1mo ago - Совместимость с другими клиентами (ClashX Pro, sing-box, Stash).