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:
@@ -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 для получения адреса сервера
|
||||
|
||||
Reference in New Issue
Block a user