| 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). |