# Hydra-Veil — June Major Update ## Expanded Killswitch `hydraveil-killswitch.sh` was added to the installer: a wrapper around `nftables` that blocks all traffic not routed through the tunnel. It defaults to `tun0`, but supports a configurable interface IP that the operator will send when creating the profile. The IP is currently hardcoded; it will be removed in the next commit. ## One Connection at a Time First in, first out. When a new connection is established, the previous one receives a signal (`SIGUSR1`) and closes cleanly before the new one takes over. ## Unexpected Shutdowns If the terminal is closed or the machine is powered off, the process receives `SIGHUP` and performs a full disconnect: stops `sing-box`, clears state, and releases the network. No orphan processes. ## Fewer Network Requests Unnecessary calls made when establishing and closing connections have been removed. --- ## Repositories | Repo | Role | |---|---| | `core` | Business logic, controllers, models | | `cli` | Command-line interface | | `essentials` | Network modules (Tor, WireGuard, proxies) | | `installer` | Installation scripts and killswitch | --- --- # Hydra-Veil — Gran Actualización de Junio ## Killswitch ampliado Se añadió `hydraveil-killswitch.sh` al installer: un wrapper sobre `nftables` que bloquea todo el tráfico que no pase por el túnel. Por defecto usa `tun0`, pero soporta una IP de interfaz configurable que el operador enviará al crear el perfil. Por ahora la IP está hardcodeada; se eliminará en el próximo commit. ## Una conexión a la vez Primero en entrar, primero en salir. Cuando se establece una nueva conexión, la anterior recibe una señal (`SIGUSR1`) y se cierra limpiamente antes de que la nueva tome el control. ## Cierres inesperados Si se cierra la terminal o se apaga el equipo, el proceso recibe `SIGHUP` y ejecuta la desconexión completa: para `sing-box`, limpia el estado y libera la red. Sin procesos huérfanos. ## Menos solicitudes de red Se eliminaron llamadas innecesarias que se hacían al establecer y cerrar conexiones. --- ## Repositorios | Repo | Rol | |---|---| | `core` | Lógica de negocio, controladores, modelos | | `cli` | Interfaz de línea de comandos | | `essentials` | Módulos de red (Tor, WireGuard, proxies) | | `installer` | Scripts de instalación y killswitch | --- --- ## Uso rápido — Desde Core (innecesario, usar CLI) ## 1. Create billing code / Crear billing code ```python python3 -c " from core.services.WebServiceApiService import WebServiceApiService subscription = WebServiceApiService.post_subscription(2, operator_id=) print('billing code:', subscription.billing_code) " ``` > Copy the printed `billing_code` — you'll need it in the connect step. > Copiá el `billing_code` impreso, lo vas a necesitar en el paso de conexión. --- consultar estado de invoive python3 -c " from core.services.WebServiceApiService import WebServiceApiService invoice = WebServiceApiService.get_invoice('BILLING_CODE_HERE') print('status:', invoice.status) " ## 2. Patch subscription / Parchear suscripción ```bash sudo docker compose exec laravel php artisan tinker --execute=" \$sub = \App\Models\Subscription::orderBy('id', 'desc')->first(); \$sub->expires_at = '2027-12-31 23:59:59'; \$sub->duration = 720; \$sub->payment_reference = 'bypass_' . uniqid(); \$sub->save(); echo 'OK' . PHP_EOL; " ``` --- ## 3. Connect / Conectar ### VLESS ```python python3 -c " from core.services.WebServiceApiService import WebServiceApiService from core.controllers.encrypted_proxy.VlessController import VlessController from core.observers.EncryptedProxyObserver import EncryptedProxyObserver observer = EncryptedProxyObserver() observer.subscribe('connected', lambda e: print('connected:', e.subject)) observer.subscribe('error', lambda e: print('error:', e.subject)) observer.subscribe('disconnected', lambda e: print('disconnected:', e.subject)) session = WebServiceApiService.post_operator_proxy('MZKD-QWWI-1TS9-KHMD', 3, 'vless') print('session:', session) controller = VlessController(1080) controller.enable(session.links[0], session.username, observer) " ``` ### Hysteria2 ```python python3 -c " from core.services.WebServiceApiService import WebServiceApiService from core.controllers.encrypted_proxy.HysteriaController import HysteriaController from core.observers.EncryptedProxyObserver import EncryptedProxyObserver observer = EncryptedProxyObserver() observer.subscribe('connected', lambda e: print('connected:', e.subject)) observer.subscribe('error', lambda e: print('error:', e.subject)) observer.subscribe('disconnected', lambda e: print('disconnected:', e.subject)) session = WebServiceApiService.post_operator_proxy('MZKD-QWWI-1TS9-KHMD', 3, 'hysteria2') print('session:', session) controller = HysteriaController(1080) controller.enable(session.username, session.password, session.operator_hysteria2_host, observer) " ``` --- ## 4. Disconnect / Desconectar ```python python3 -c " from core.controllers.encrypted_proxy.HysteriaController import HysteriaController from core.observers.EncryptedProxyObserver import EncryptedProxyObserver observer = EncryptedProxyObserver() observer.subscribe('disconnected', lambda e: print('disconnected')) controller = HysteriaController(1080) controller.disable(observer) " ``` sudo ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf