feat: add security system with system-wide proxy, DNS protection and encryption

- System-wide proxy: automatic Windows proxy configuration for all apps
- DNS leak protection: force all DNS queries through VPN
- Config encryption: AES-256-GCM encryption for all config files
- File protection: strict access permissions for config directory
- Leak detection: built-in security check system
- Kill Switch: temporarily disabled (will be improved in next version)

Security features:
✓ Automatic system proxy setup
✓ DNS leak protection (optional)
✓ AES-256-GCM config encryption
✓ File and directory protection
✓ Security leak checker
⚠ Kill Switch disabled (caused internet blocking issues)

Emergency recovery scripts included:
- ОТКЛЮЧИТЬ_KILLSWITCH.bat
- EMERGENCY_FIX_INTERNET.bat
- ЕСЛИ_СЛОМАЛСЯ_ИНТЕРНЕТ.txt

Documentation:
- Markdown/SECURITY_GUIDE.md - full security guide
- БЕЗОПАСНОСТЬ_БЫСТРЫЙ_СТАРТ.md - quick start guide
- CHANGELOG_SECURITY.md - detailed changelog
This commit is contained in:
2026-04-12 19:01:24 +06:00
parent 20d24a3639
commit b809e84220
18 changed files with 2063 additions and 31 deletions

View File

@@ -17,6 +17,7 @@ import (
"vpn-client/internal/config"
"vpn-client/internal/logger"
"vpn-client/internal/proxy"
"vpn-client/internal/security"
)
// XrayConfig представляет конфигурацию Xray
@@ -503,30 +504,51 @@ func Connect(configName string, logsDir string) error {
fmt.Printf("✓ Подключено к '%s' через %s\n", configName, coreName)
fmt.Printf("SOCKS5 прокси: 127.0.0.1:10808\n")
// Предлагаем настроить системный прокси
// Автоматически настраиваем системный прокси
fmt.Println("\n" + strings.Repeat("─", 60))
fmt.Println("Настроить системный прокси Windows?")
fmt.Println("Это позволит всем приложениям использовать VPN.")
fmt.Print("(y/n): ")
fmt.Println("Настройка системного прокси для работы VPN по всему ПК...")
var response string
fmt.Scanln(&response)
if err := proxy.EnableSystemProxy("127.0.0.1:10808"); err != nil {
fmt.Printf("⚠ Не удалось настроить системный прокси: %v\n", err)
fmt.Println("Вы можете настроить его вручную в настройках Windows")
} else {
fmt.Println("✓ Системный прокси настроен - VPN работает для всех приложений")
}
// Включаем защитные механизмы (БЕЗ Kill Switch!)
fmt.Println("\nНастройка защитных механизмов...")
secManager := security.NewSecurityManager(config.ConfigDir, "default-password")
if strings.ToLower(response) == "y" || strings.ToLower(response) == "д" {
if err := proxy.EnableSystemProxy("127.0.0.1:10808"); err != nil {
fmt.Printf("⚠ Не удалось настроить системный прокси: %v\n", err)
fmt.Println("Вы можете настроить его вручную в настройках Windows")
secConfig, _ := secManager.LoadSecurityConfig()
// KILL SWITCH ПОЛНОСТЬЮ ОТКЛЮЧЕН!
// Включаем только защиту DNS если она включена
if secConfig != nil && secConfig.DNSProtectionEnabled {
dnsProtection := security.NewDNSProtection()
if err := dnsProtection.Enable(secConfig.VPNDNSServers); err != nil {
fmt.Printf("⚠ Предупреждение: не удалось включить защиту DNS: %v\n", err)
} else {
fmt.Println("✓ Системный прокси настроен")
fmt.Println("✓ Защита DNS включена")
}
} else {
fmt.Println("\nДля использования VPN настройте прокси вручную:")
fmt.Println(" 1. Откройте Настройки Windows → Сеть и Интернет → Прокси")
fmt.Println(" 2. Включите 'Использовать прокси-сервер'")
fmt.Println(" 3. Адрес: 127.0.0.1, Порт: 10808")
fmt.Println("\nИли настройте SOCKS5 прокси в браузере:")
fmt.Println(" Firefox: Настройки → Основные → Параметры сети")
fmt.Println(" Chrome: Настройки → Система → Открыть настройки прокси")
fmt.Println(" Защита DNS отключена")
}
// Защищаем директорию конфигураций
if err := secManager.ProtectConfigDirectory(); err != nil {
fmt.Printf("⚠ Предупреждение: не удалось защитить директорию конфигураций: %v\n", err)
}
// Проверяем утечки
fmt.Println("\nПроверка безопасности...")
leaks, err := secManager.CheckForLeaks()
if err == nil && len(leaks) == 0 {
fmt.Println("✓ Утечек не обнаружено - соединение безопасно")
} else if len(leaks) > 0 {
fmt.Println("⚠ Обнаружены потенциальные утечки:")
for _, leak := range leaks {
fmt.Printf(" - %s\n", leak)
}
}
fmt.Printf("\nЛоги трафика:\n")
@@ -537,6 +559,37 @@ func Connect(configName string, logsDir string) error {
return nil
}
// extractServerIP извлекает IP адрес сервера из VLESS URL
func extractServerIP(vlessURL string) string {
urlStr := strings.TrimPrefix(vlessURL, "vless://")
if idx := strings.Index(urlStr, "#"); idx != -1 {
urlStr = urlStr[:idx]
}
if idx := strings.Index(urlStr, "?"); idx != -1 {
urlStr = urlStr[:idx]
}
parts := strings.Split(urlStr, "@")
if len(parts) != 2 {
return ""
}
serverPort := parts[1]
var server string
if strings.Contains(serverPort, "[") {
endIdx := strings.Index(serverPort, "]")
server = serverPort[1:endIdx]
} else {
lastColon := strings.LastIndex(serverPort, ":")
server = serverPort[:lastColon]
}
return server
}
// PingServer проверяет доступность VLESS сервера
func PingServer(vlessURL string, timeout time.Duration) (bool, float64, error) {
// Парсим URL для получения адреса сервера