<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="it">
	<id>https://wiki.golem.linux.it/index.php?action=history&amp;feed=atom&amp;title=Appunti_OpenVPN</id>
	<title>Appunti OpenVPN - Cronologia</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.golem.linux.it/index.php?action=history&amp;feed=atom&amp;title=Appunti_OpenVPN"/>
	<link rel="alternate" type="text/html" href="https://wiki.golem.linux.it/index.php?title=Appunti_OpenVPN&amp;action=history"/>
	<updated>2026-04-24T16:20:01Z</updated>
	<subtitle>Cronologia della pagina su questo sito</subtitle>
	<generator>MediaWiki 1.35.5</generator>
	<entry>
		<id>https://wiki.golem.linux.it/index.php?title=Appunti_OpenVPN&amp;diff=9933&amp;oldid=prev</id>
		<title>Martinligabue: /* Accesso dall'esterno */ sottocategoria</title>
		<link rel="alternate" type="text/html" href="https://wiki.golem.linux.it/index.php?title=Appunti_OpenVPN&amp;diff=9933&amp;oldid=prev"/>
		<updated>2026-04-05T22:43:59Z</updated>

		<summary type="html">&lt;p&gt;&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;Accesso dall&amp;#039;esterno: &lt;/span&gt; sottocategoria&lt;/span&gt;&lt;/p&gt;
&lt;table class=&quot;diff diff-contentalign-left diff-editfont-monospace&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;it&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Versione meno recente&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Versione delle 22:43, 5 apr 2026&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l202&quot; &gt;Riga 202:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Riga 202:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;In questo modo si varia anche la porta. Può essere utile per evitare conflitti con server già presenti sulla macchina che si va ad interrogare.&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;In questo modo si varia anche la porta. Può essere utile per evitare conflitti con server già presenti sulla macchina che si va ad interrogare.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;Category&lt;/del&gt;:&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;Howto&lt;/del&gt;]]&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;Categoria&lt;/ins&gt;:&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;Networking&lt;/ins&gt;]]&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Martinligabue</name></author>
	</entry>
	<entry>
		<id>https://wiki.golem.linux.it/index.php?title=Appunti_OpenVPN&amp;diff=9789&amp;oldid=prev</id>
		<title>Giomba: Spostata documentazione non più manutenuta dalla pagina sulla VPN</title>
		<link rel="alternate" type="text/html" href="https://wiki.golem.linux.it/index.php?title=Appunti_OpenVPN&amp;diff=9789&amp;oldid=prev"/>
		<updated>2026-03-07T22:48:08Z</updated>

		<summary type="html">&lt;p&gt;Spostata documentazione non più manutenuta dalla pagina sulla VPN&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Nuova pagina&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{Note&lt;br /&gt;
|type=warning&lt;br /&gt;
|text=Questa pagina è un'istantanea della pagina non più mantenuta sulla VPN.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Sul server, installiamo ''openvpn'' e anche ''easy-rsa'' (che ci servirà per generare le chiavi). Su Debian:&lt;br /&gt;
 apt-get install openvpn easy-rsa&lt;br /&gt;
&lt;br /&gt;
=== Configurazione server ===&lt;br /&gt;
Sul server deve essere creata una propria CA (''Certificate Authority''), che deve firmare tutti i certificati che andremo a utilizzare nella VPN. Per fare questo useremo la collezione di utili script ''easy-rsa''. Per semplificarci il lavoro, lavoreremo nella directory ''/etc/openvpn'', e ci copieremo anche gli script ''easy-rsa''.&lt;br /&gt;
&lt;br /&gt;
 cp /usr/share/easy-rsa/* /etc/openvpn&lt;br /&gt;
&lt;br /&gt;
Digressione inutile: io avrei messo ''/usr/share/easy-rsa/'' nel PATH, ma quelli di OpenVPN dicono di copiare gli script per evitare problemi di compatibilità (es. oggi creo la mia fantastica VPN con ''easy-rsa'' versione ''$oggi'', domani aggiorno ''easy-rsa'' a versione ''$domani'', e dopodomani voglio aggiungere un nuovo client alla mia VPN ma non posso farlo perché agli script nuovi non piace la vecchia CA). Insomma, agli script non piacciono i certificati, a me non piace questo modo di fare, a tutti non piace qualcosa, poggio e buca fa pari, animo in pace, quindi facciamolo e basta.&lt;br /&gt;
&lt;br /&gt;
==== Variabili d'ambiente ====&lt;br /&gt;
Modifichiamo le righe dello script ''vars''.&lt;br /&gt;
I valori inseriti qui saranno utilizzati di default per la generazione dei certificati, quindi, quando li genereremo, ci basterà premere ''Invio'' per far prima.&lt;br /&gt;
&lt;br /&gt;
 # These are the default values for fields&lt;br /&gt;
 # which will be placed in the certificate.&lt;br /&gt;
 export KEY_COUNTRY=&amp;quot;IT&amp;quot;&lt;br /&gt;
 export KEY_PROVINCE=&amp;quot;FI&amp;quot;&lt;br /&gt;
 export KEY_CITY=&amp;quot;Empoli&amp;quot;&lt;br /&gt;
 export KEY_ORG=&amp;quot;GOLEM - Gruppo Operativo Linux Empoli&amp;quot;&lt;br /&gt;
 export KEY_EMAIL=&amp;quot;golem@mailinator.com&amp;quot;&lt;br /&gt;
 export KEY_OU=&amp;quot;VPN Task Force&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 ...&lt;br /&gt;
 &lt;br /&gt;
 export KEY_SIZE=2048&lt;br /&gt;
&lt;br /&gt;
Popoliamo l'ambiente eseguendo lo script:&lt;br /&gt;
 # . ./vars&lt;br /&gt;
&lt;br /&gt;
==== Creazione CA ====&lt;br /&gt;
 # ./clean-all&lt;br /&gt;
 # ./build-ca&lt;br /&gt;
&lt;br /&gt;
'''ATTENZIONE:''' questi comandi distruggono l'eventuale CA che già abbiamo creato, quindi usiamoli solo la prima volta, a meno che non siamo masochisti e vogliamo ripartire da zero, buttar via tutto e impedire ai client (che già abbiamo) di collegarsi alla VPN. Una catastrofe insomma.&lt;br /&gt;
&lt;br /&gt;
'''Nota:''' ''clean-all'' crea anche una nuova directory ''keys'', dove sono salvate tutte le chiavi che abbiamo generato, e che genereremo da ora in avanti. Ci servirà più avanti.&lt;br /&gt;
&lt;br /&gt;
==== Generazione parametri Diffie-Hellman ====&lt;br /&gt;
 # ./build-dh&lt;br /&gt;
&lt;br /&gt;
Ci vorrà un po', in base alla KEY_SIZE che abbiamo specificato in ''vars''.&lt;br /&gt;
Questo genererà un file ''dh2048.pem'' (o 1024, dipende dalla dimensione) nella directory ''keys''. Ci servirà più avanti.&lt;br /&gt;
&lt;br /&gt;
==== Generazione chiave server ====&lt;br /&gt;
 # ./build-key-server golem.linux.it&lt;br /&gt;
dove ''golem.linux.it'' è l'hostname del nostro server. Non è necessario usare l'hostname vero, ma ci aiuta a tenere le cose ordinate. Possiamo avere tutte le chiavi che vogliamo, ma ce ne basta una (eventualmente anche per più VPN). Ci servirà più avanti.&lt;br /&gt;
&lt;br /&gt;
==== File di configurazione server.conf ====&lt;br /&gt;
Copiamo il modello fornito da OpenVPN:&lt;br /&gt;
&lt;br /&gt;
 # zcat /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz &amp;gt; /etc/openvpn/server.conf&lt;br /&gt;
&lt;br /&gt;
Modifichiamolo:&lt;br /&gt;
&lt;br /&gt;
 port 7777                                                # porta su cui è in ascolto OpenVPN&lt;br /&gt;
 proto udp                                                # usare il protocollo UDP&lt;br /&gt;
 dev tun                                                  # VPN routed&lt;br /&gt;
 ca /etc/openvpn/keys/ca.crt                              # certificato CA&lt;br /&gt;
 cert /etc/openvpn/keys/server.crt                        # chiave pubblica server&lt;br /&gt;
 key /etc/openvpn/keys/server.key                         # chiave privata server&lt;br /&gt;
 dh /etc/openvpn/keys/dh2048.pem                          # parametri Diffie-Hellman&lt;br /&gt;
 server 10.60.73.0 255.255.255.0                          # indirizzi IP della rete&lt;br /&gt;
 ;ifconfig-pool-persist ipp.txt                           # ricorda gli indirizzi IP assegnati ai client?&lt;br /&gt;
 client-config-dir /etc/openvpn/staticclients             # directory configurazioni specifiche dei client&lt;br /&gt;
 client-to-client                                         # permetti ai client di parlarsi tra loro&lt;br /&gt;
 user nobody                                              # rilascia i privilegi una volta finito&lt;br /&gt;
 group nogroup&lt;br /&gt;
 topology subnet                                          # tutti i client nella sottorete (no point-to-point)&lt;br /&gt;
 comp-lzo                                                 # attiva la compressione lzo&lt;br /&gt;
&lt;br /&gt;
Osservazioni:&lt;br /&gt;
* ''proto'': utilizziamo il protocollo UDP, perché TCP su TCP può [http://sites.inka.de/bigred/devel/tcp-tcp.html portare al collasso] della rete&lt;br /&gt;
* nella rete ''10.60.73.0/24'', il server prende automaticamente il primo indirizzo disponibile, cioè 10.60.73.1&lt;br /&gt;
* ''ifconfig-pool-persist'': abilitato di default, memorizza nel file ''ipp.txt'' le associazioni client/indirizzo. Se dobbiamo poter raggiungere le macchine nella rete, queste dovranno avere un IP fisso, quindi in teoria questa cosa ci piace, ma in pratica no perché vogliamo mettere gli indirizzi a mano secondo una logica sensata, quindi commentiamo questa riga.&lt;br /&gt;
* ''client-config-dir'': in questa directory andremo a inserire le configurazioni specifiche dei client (es. l'IP statico)&lt;br /&gt;
* ''client-to-client'': lo mettiamo perché vogliamo che i client possano dialogare tra loro direttamente, senza dover ammattire col firewall&lt;br /&gt;
* ''user'' e ''group'': OpenVPN gira come ''root'', e quando ha instaurato le connessioni e ha finito di fare il suo lavoro, è bene che rilasci i privilegi e continui a girare come utente semplice.&lt;br /&gt;
* ''topology'': indica il tipo di rete. Facciamo '''attenzione''' a aggiungerlo manualmente, perché altrimenti, per ragioni di retrocompatibilità, viene utilizzata la modalità point-to-point&lt;br /&gt;
&lt;br /&gt;
==== Avvio del server ====&lt;br /&gt;
Proviamo:&lt;br /&gt;
 # openvpn server.conf&lt;br /&gt;
&lt;br /&gt;
Per avviare il servizio o abilitarlo permanentemente:&lt;br /&gt;
 # systemctl [start|stop|restart|reload|enable] openvpn@server.conf&lt;br /&gt;
&lt;br /&gt;
dove ''server.conf'' viene cercato nella directory ''/etc/openvpn''.&lt;br /&gt;
&lt;br /&gt;
Vediamo che adesso abbiamo una nuova interfaccia di rete virtuale denominata ''tun0'' con indirizzo IP ''10.60.73.1''. Questa è la scheda che è attaccata al nostro lungo &amp;quot;filo&amp;quot; immaginario.&lt;br /&gt;
 # ip addr&lt;br /&gt;
&lt;br /&gt;
=== Aggiungere un client ===&lt;br /&gt;
==== Generazione chiave client ====&lt;br /&gt;
Sempre '''sul server''':&lt;br /&gt;
&lt;br /&gt;
 # ./build-key client-numero-uno&lt;br /&gt;
&lt;br /&gt;
Oss: utilizziamo un nome significativo. Come prima, consiglio di usare l'hostname.&lt;br /&gt;
&lt;br /&gt;
Oss: probabilmente vogliamo utilizzare lo stesso ambiente ''vars'' di prima.&lt;br /&gt;
&lt;br /&gt;
Oss: verrà generata la coppia di chiavi pubblica/privata ''client-numero-uno.cert''/''client-numero-uno.key'' nella directory ''keys''.&lt;br /&gt;
&lt;br /&gt;
Copiamo le chiavi ''client-numero-uno.*'' e anche '''ca.crt''' sul client (es. ''scp'') e mettiamole in ''/etc/openvpn/golem.linux.it/''.&lt;br /&gt;
&lt;br /&gt;
==== Installazione OpenVPN ====&lt;br /&gt;
'''Sul client''':&lt;br /&gt;
&lt;br /&gt;
 # apt-get install openvpn      # Debian&lt;br /&gt;
 # pacman -S openvpn            # Arch&lt;br /&gt;
&lt;br /&gt;
==== File di configurazione client.conf ====&lt;br /&gt;
Copiamo il modello del file di configurazione del client in un posto sensato, tipo in ''/etc/openvpn/'' o ''/etc/openvpn/client/''.&lt;br /&gt;
&lt;br /&gt;
Es su Arch Linux:&lt;br /&gt;
 # cp /usr/share/openvpn/examples/client.conf /etc/openvpn/client/&lt;br /&gt;
&lt;br /&gt;
Percorso su Debian:&lt;br /&gt;
 /usr/share/doc/openvpn/examples/sample-config-files/client.conf&lt;br /&gt;
&lt;br /&gt;
Modifichiamolo. Per brevità ometto cose tipo ''proto udp'', ''tun'' e via discorrendo, che devono ovviamente corrispondere anche lato server.&lt;br /&gt;
&lt;br /&gt;
 remote golem.linux.it 7777&lt;br /&gt;
 user nobody&lt;br /&gt;
 group nobody&lt;br /&gt;
 ca /etc/openvpn/golem.linux.it/ca.crt&lt;br /&gt;
 cert /etc/openvpn/golem.linux.it/client-numero-uno.crt&lt;br /&gt;
 key /etc/openvpn/golem.linux.it/client-numero-uno.key&lt;br /&gt;
 keepalive 30 120                                         # riattiva le connessioni chiuse&lt;br /&gt;
 comp-lzo&lt;br /&gt;
&lt;br /&gt;
 # Nel template Debian si commenta la configurazione di questo certificato (opzionale).&lt;br /&gt;
 ;tls-auth ta.key 1&lt;br /&gt;
&lt;br /&gt;
Osservazioni:&lt;br /&gt;
* ''remote'': hostname e porta del server OpenVPN&lt;br /&gt;
* ''keepalive X Y'': ogni X secondi, controlla la connessione con il server, e se questa risulta assente per più di Y secondi consecutivi, si riconnette&lt;br /&gt;
* ''group'': su Debian deve essere specificato &amp;lt;code&amp;gt;nogroup&amp;lt;/code&amp;gt; anziché &amp;lt;code&amp;gt;nobody&amp;lt;/code&amp;gt;&lt;br /&gt;
'''Attenzione''' alle eventuali modalità di compressione e/o di cifratura (qui è attiva la compressione lzo), che devono corrispondere a quelle sul server. È facile che si abbiano impostazioni leggermente diverse a seconda del sistema che si usa (Debian, Arch, ...)&lt;br /&gt;
&lt;br /&gt;
==== Assegnare IP fisso al client ====&lt;br /&gt;
Torniamo '''sul server''' e nella directory ''/etc/openvpn/staticclients'' (scelta prima nel ''server.conf'') aggiungiamo un file per ogni client a cui si vuole assegnare un indirizzo statico.&lt;br /&gt;
Il file deve chiamarsi come l'hostname del client (l'hostname che avete dichiarato nel certificato! Se è diverso dall'hostname vero, siete masochisti, e poi non dite che non avevo avvertito).&lt;br /&gt;
All'interno inserire una direttiva ''ifconfig-push''.&lt;br /&gt;
&lt;br /&gt;
Esempio, file ''/etc/openvpn/staticclients/client-numero-uno'':&lt;br /&gt;
 ifconfig-push 10.60.73.77 255.255.255.0&lt;br /&gt;
&lt;br /&gt;
dove ''10.60.73.184.77'' è l'IP che vogliamo assegnare al client che si presenta col certificato di ''client-numero-uno'' e ''255.255.255.0'' è la sua maschera di rete.&lt;br /&gt;
&lt;br /&gt;
==== Avvio del client ====&lt;br /&gt;
Proviamo (uguale al server):&lt;br /&gt;
 # openvpn client.conf&lt;br /&gt;
&lt;br /&gt;
Per avviare il servizio o abilitarlo permanentemente:&lt;br /&gt;
&lt;br /&gt;
* su Debian&lt;br /&gt;
 # systemctl [start|stop|restart|reload|enable] openvpn@client.conf&lt;br /&gt;
&lt;br /&gt;
dove ''client.conf'' viene cercato nella directory ''/etc/openvpn''&lt;br /&gt;
&lt;br /&gt;
* su Arch&lt;br /&gt;
 # systemctl [start|stop|restart|reload|enable] openvpn-client@client.conf&lt;br /&gt;
&lt;br /&gt;
dove ''client.conf'' viene cercato nella directory ''/etc/openvpn/client''&lt;br /&gt;
&lt;br /&gt;
=== Revoca di un certificato ===&lt;br /&gt;
Per revocare l'accesso a un client, è sufficiente revocare la sua chiave attraverso il comando:&lt;br /&gt;
 # ./revoke-full client-numero-1&lt;br /&gt;
&lt;br /&gt;
'''Nota bene''': questo comando termina con ''Errore 23''; secondo la [https://openvpn.net/index.php/open-source/documentation/howto.html#revoke documentazione ufficiale di OpenVPN], è tutto normale, in quanto, dopo aver revocato il certificato, lo script ricontrolla la sua firma, che a questo punto risulta non più valida.&lt;br /&gt;
&lt;br /&gt;
Un altro modo per vedere se il certificato è stato revocato consiste nel listare il contenuto del file ''keys/index.txt'' e controllare che appaia una ''R'' (e un nuovo timestamp) accanto al certificato che si intendeva revocare.&lt;br /&gt;
&lt;br /&gt;
=== Verifiche finali ===&lt;br /&gt;
Controlliamo di avere una nuova interfaccia di rete virtuale ''tun0'' con l'indirizzo IP desiderato:&lt;br /&gt;
 # ip addr&lt;br /&gt;
&lt;br /&gt;
Proviamo il ping:&lt;br /&gt;
 # ping 10.60.73.1&lt;br /&gt;
&lt;br /&gt;
== Accesso dall'esterno ==&lt;br /&gt;
Può essere interessante accedere ai servizi offerti da uno degli host interni alla VPN, ma senza accedere alla VPN. Ad esempio collegarsi ad un sistema di monitoraggio webcam remoto utilizzando la rete 3G del cellulare.&lt;br /&gt;
&lt;br /&gt;
Per fare questo si può sfruttare l'IP pubblico del server VPN: impartendo alcune istruzioni iptables si va a monitorare una determinata porta (ad esempio 1234) e si indirizzano le richieste verso l'host interno alla VPN (che, per esempio, ha IP 10.60.73.12)&lt;br /&gt;
&lt;br /&gt;
 iptables -t nat -A PREROUTING -p tcp --dport 1234 -j DNAT --to-destination 10.60.73.12:1234&lt;br /&gt;
 iptables -t nat  -A POSTROUTING -j MASQUERADE&lt;br /&gt;
 sysctl net.ipv4.ip_forward=1 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
L'opzione &amp;lt;code&amp;gt;dport&amp;lt;/code&amp;gt; può essere variata a piacere se si vuole reindirizzare richieste da una porta verso un'altra:&lt;br /&gt;
&lt;br /&gt;
 iptables -t nat -A PREROUTING -p tcp --dport 1234 -j DNAT --to-destination 10.60.73.12:12&lt;br /&gt;
&lt;br /&gt;
In questo modo si varia anche la porta. Può essere utile per evitare conflitti con server già presenti sulla macchina che si va ad interrogare.&lt;br /&gt;
&lt;br /&gt;
[[Category:Howto]]&lt;/div&gt;</summary>
		<author><name>Giomba</name></author>
	</entry>
</feed>