163 lines
No EOL
5.3 KiB
Markdown
163 lines
No EOL
5.3 KiB
Markdown
# 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=<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 |