
Un proxy inverso leggero e ad alte prestazioni per l'attraversamento NAT, scritto in Rust. Un'alternativa a frp e ngrok.

Un proxy inverso sicuro, stabile e ad alte prestazioni per l'attraversamento NAT, scritto in Rust.
rathole, come frp e ngrok, può aiutare a esporre su Internet un servizio su un dispositivo dietro NAT, tramite un server con IP pubblico.
Un rathole completo si può ottenere dalla pagina delle release. Oppure compilare dal sorgente per altre piattaforme e per minimizzare il binario. È disponibile anche un'immagine Docker.
L'uso di rathole è molto simile a frp. Se hai esperienza con quest'ultimo, la configurazione è molto facile. L'unica differenza è che la configurazione di un servizio è divisa tra client e server, e un token è obbligatorio.
Per usare rathole, hai bisogno di un server con IP pubblico e di un dispositivo dietro NAT, dove si trovano alcuni servizi da esporre su Internet.
Supponendo di avere un NAS a casa dietro NAT e di voler esporre il suo servizio SSH su Internet:
Crea server.toml con il seguente contenuto e adattalo alle tue esigenze.
# server.toml
[server]
bind_addr = "0.0.0.0:2333" # `2333` specifica la porta su cui rathole ascolta i client
[server.services.my_nas_ssh]
token = "use_a_secret_that_only_you_know" # Token usato per autenticare il client per il servizio. Modificalo con un valore a piacere.
bind_addr = "0.0.0.0:5202" # `5202` specifica la porta che espone `my_nas_ssh` su Internet
Quindi esegui:
./rathole server.toml
Crea client.toml con il seguente contenuto e adattalo alle tue esigenze.
# client.toml
[client]
remote_addr = "myserver.com:2333" # L'indirizzo del server. La porta deve essere uguale a quella in `server.bind_addr`
[client.services.my_nas_ssh]
token = "use_a_secret_that_only_you_know" # Deve essere uguale a quella del server per superare la validazione
local_addr = "127.0.0.1:22" # L'indirizzo del servizio da inoltrare
Quindi esegui:
./rathole client.toml
myserver.com sulla porta 2333, e tutto il traffico verso myserver.com:5202 sarà inoltrato alla porta 22 del client.Così puoi ssh myserver.com:5202 per SSH al tuo NAS.
Per eseguire rathole come servizio in background su Linux, guarda gli esempi systemd.
rathole può determinare automaticamente se eseguire in modalità server o client in base al contenuto del file di configurazione, se è presente solo uno dei blocchi [server] e [client], come nell'esempio in Avvio rapido.
Ma i blocchi [client] e [server] possono anche essere inseriti in un unico file. In tal caso, sul lato server esegui rathole --server config.toml e sul lato client esegui rathole --client config.toml per indicare esplicitamente a rathole la modalità di esecuzione.
Prima di passare alla specifica completa della configurazione, si consiglia di dare un'occhiata agli esempi di configurazione per farsi un'idea del formato.
Vedi Trasporto per maggiori dettagli sulla crittografia e il blocco transport.
Ecco la specifica completa della configurazione:
[client]
remote_addr = "example.com:2333" # Necessario. L'indirizzo del server
default_token = "default_token_if_not_specify" # Opzionale. Il token predefinito per i servizi, se non ne definiscono uno proprio
heartbeat_timeout = 40 # Opzionale. Imposta a 0 per disabilitare il test heartbeat a livello applicativo. Il valore deve essere maggiore di `server.heartbeat_interval`. Default: 40 secondi
retry_interval = 1 # Opzionale. L'intervallo tra i tentativi di connessione al server. Default: 1 secondo
[client.transport] # L'intero blocco è opzionale. Specifica quale trasporto usare
type = "tcp" # Opzionale. Valori possibili: ["tcp", "tls", "noise"]. Default: "tcp"
[client.transport.tcp] # Opzionale. Ha effetto anche su `noise` e `tls`
proxy = "socks5://user:[email protected]:1080" # Opzionale. Il proxy per connettersi al server. Supporta `http` e `socks5`.
nodelay = true # Opzionale. Determina se abilitare TCP_NODELAY, se applicabile, per migliorare la latenza riducendo la larghezza di banda. Default: true
keepalive_secs = 20 # Opzionale. Specifica `tcp_keepalive_time` in `tcp(7)`, se applicabile. Default: 20 secondi
keepalive_interval = 8 # Opzionale. Specifica `tcp_keepalive_intvl` in `tcp(7)`, se applicabile. Default: 8 secondi
[client.transport.tls] # Necessario se `type` è "tls"
trusted_root = "ca.pem" # Necessario. Il certificato della CA che ha firmato il certificato del server
hostname = "example.com" # Opzionale. Il nome host che il client usa per validare il certificato. Se non impostato, utilizza `client.remote_addr`
[client.transport.noise] # Protocollo Noise. Vedi `docs/transport.md` per ulteriori spiegazioni
pattern = "Noise_NK_25519_ChaChaPoly_BLAKE2s" # Opzionale. Il valore predefinito come mostrato
local_private_key = "key_encoded_in_base64" # Opzionale
remote_public_key = "key_encoded_in_base64" # Opzionale