Ciao, hobroviani! Vi è mai capitato di desiderare di spostarvi virtualmente in un'altra città, paese o continente? A me capita abbastanza spesso, quindi la possibilità di avere un server VPN che posso avviare ovunque, in pochi secondi, era molto importante. In questo articolo voglio parlarvi del mio progetto, che ho pensato quando cercavo una soluzione pronta, in questo caso un'immagine Docker, che permettesse di avviare rapidamente un server OpenVPN, con un minimo di configurazioni e un livello di sicurezza accettabile.
Antefatti
La possibilità di avviare il servizio su qualsiasi macchina: sia un server fisico, un server privato virtuale o, addirittura, uno spazio container all’interno di un altro sistema di gestione dei container, era di vitale importanza. La mia attenzione si è subito concentrata su Docker. Innanzitutto, questo servizio sta guadagnando popolarità, e quindi sempre più fornitori offrono soluzioni pronte con il suo pre-installato; in secondo luogo — c'è un repository centralizzato di immagini, da cui è possibile scaricare e avviare il servizio con un solo comando nel terminale. Pensavo che un progetto simile dovesse già esistere, e ho cercato incessantemente. Ma la maggior parte dei progetti che trovavo erano o troppo complessi (era necessario creare un container per la memorizzazione permanente dei dati e avviare più volte il container con l'applicazione con parametri diversi), o senza documentazione valida, oppure totalmente abbandonati. Non trovando nulla di accettabile, ho iniziato a lavorare al mio progetto. Davanti a me c’erano notti insonni passate a studiare la documentazione, scrivere codice e fare debugging, ma alla fine il mio servizio ha visto la luce e ha brillato con tutti i colori del pannello LED monocromatico del router. Quindi, vi presento — . Ho persino creato un logo (sopra, prima del taglio), ma non giudicatelo troppo severamente, in quanto non sono un designer (ancora). Quando ho realizzato questo progetto, ho messo al primo posto la velocità di distribuzione, il minimo di configurazioni e un livello di sicurezza accettabile. Attraverso prove ed errori ho trovato un equilibrio ottimale tra questi criteri; tuttavia, in alcuni casi ho dovuto sacrificare la velocità di distribuzione per motivi di sicurezza, mentre per il minimo di configurazioni ho dovuto rinunciare alla portabilità: nell'attuale configurazione, un container creato su un server non può essere trasferito e avviato su un altro. Ad esempio, tutti i certificati client e server vengono generati all'avvio del servizio e questo richiede circa 2 secondi. Tuttavia, la generazione del file Diffie-Hellman ha dovuto essere spostata nel tempo di build: viene creato durante la costruzione dell'immagine Docker e può richiedere fino a 10 minuti. Mi piacerebbe molto ottenere un audit della sicurezza di una soluzione simile dalla rispettabile comunità.
Avvio
Per avviare il servizio abbiamo bisogno di alcune cose:
- Server: fisico o virtuale. Teoricamente, è possibile avviare in modalità Docker-in-Docker, ma non ho effettuato test su larga scala di questa opzione;
- Docker stesso. Molti provider di hosting offrono soluzioni pronte con Docker "a bordo";
- Indirizzo IP pubblico.
Se tutti i requisiti sono a posto, ci resta solo da eseguire il seguente comando nella console del server:
docker run --cap-add=NET_ADMIN
-it -p 1194:1194/udp -p 80:8080/tcp
-e HOST_ADDR=$(curl -s https://api.ipify.org)
alekslitvinenk/openvpnIl lettore attento avrà notato che l'indirizzo IP del server viene determinato automaticamente tramite ipify.org. Se per qualche motivo ciò non funziona, è possibile specificare l'indirizzo manualmente. Se tutti i passaggi precedenti sono stati eseguiti correttamente, dovremmo vedere nella console qualcosa di simile:
Sun Jun 9 08:56:11 2019 Sequenza di Inizializzazione Completata
Sun Jun 9 08:56:12 2019 Il file Client.ovpn è stato generato
Sun Jun 9 08:56:12 2019 Server di configurazione avviato, scarica la tua configurazione client.ovpn su http://example.com/
Sun Jun 9 08:56:12 2019 NOTA: Dopo aver scaricato la tua configurazione client, il server HTTP verrà spento!Siamo vicini all'obiettivo: ora dobbiamo copiare (nel vostro caso sarà l'indirizzo del vostro server) e incollarlo nella barra degli indirizzi del browser. Dopo aver premuto Invio, il file client.ovpn verrà scaricato, e il server http scomparirà. Se questa soluzione solleva dei dubbi, è possibile utilizzare il seguente trucco: eseguire il comando precedente ed aggiungere i flag zp e la password. Ora, se incollate il link generato nella finestra del browser, otterrete un archivio zip con la password. Quando avrete il file di configurazione del client, potrete utilizzare qualsiasi client appropriato. Io utilizzo Tunnelblick per Mac.
Video tutorial
Questo video tutorial contiene istruzioni dettagliate su come implementare il servizio su DigitalOcean.

EDIT1:
- Ho corretto errori nella pubblicazione,
- Rispondendo ai commenti, ho deciso di portare queste informazioni qui: il flag —privileged è necessario per lavorare con iptables
EDIT2:
- Ho migliorato il comando di avvio dell'immagine: ora non richiede il flag —privileged
- Ho aggiunto un link a una guida video in russo:
Fonte: habr.com
