Projet

Général

Profil

OpenVPN » Historique » Version 47

julien Bresciani, 08/03/2021 13:58

1 3 Laurent GUERBY
{{>toc}}
2 3 Laurent GUERBY
3 1 Laurent GUERBY
h1. OpenVPN
4 1 Laurent GUERBY
5 13 Laurent GUERBY
h2. Port sharing
6 12 Laurent GUERBY
7 12 Laurent GUERBY
Apache and nginx
8 12 Laurent GUERBY
http://www.davidwesterfield.net/2012/08/openvpn-sharing-a-tcp-port-with-ssl-on-nginx-and-apache-yeah-its-possible/
9 12 Laurent GUERBY
10 12 Laurent GUERBY
port-share 127.0.0.1 4443
11 12 Laurent GUERBY
12 14 Laurent GUERBY
http://www.greenie.net/ipv6/openvpn.html
13 14 Laurent GUERBY
https://community.openvpn.net/openvpn/wiki/ChangesInOpenvpn23
14 14 Laurent GUERBY
15 35 Laurent GUERBY
https://community.openvpn.net/openvpn/wiki/Gigabit_Networks_Linux
16 35 Laurent GUERBY
17 15 Laurent GUERBY
h2. Certificats
18 15 Laurent GUERBY
19 34 Baptiste Jonglez
Via mherrb : la page de man 'ssl(8)' d'OpenBSD explique bien comment faire un certificat auto-signé qui marchera pour OpenVPN: 
20 15 Laurent GUERBY
http://www.openbsd.org/cgi-bin/man.cgi?query=ssl&apropos=0&sektion=0&manpath=OpenBSD+Current&arch=i386&format=html
21 15 Laurent GUERBY
22 9 Laurent GUERBY
h2. Server
23 1 Laurent GUERBY
24 9 Laurent GUERBY
<pre>
25 9 Laurent GUERBY
# cat /etc/default/openvpn
26 9 Laurent GUERBY
...
27 9 Laurent GUERBY
AUTOSTART="ttnn-tap ttnn-tap6 ttnn-tap-tcp ttnn-tap-tcp6"
28 9 Laurent GUERBY
...
29 9 Laurent GUERBY
# cat /etc/openvpn/ttnn-tap.conf 
30 9 Laurent GUERBY
dev tap0udp
31 9 Laurent GUERBY
port 11195
32 9 Laurent GUERBY
proto udp
33 9 Laurent GUERBY
34 9 Laurent GUERBY
ca ttnn/ca.crt
35 9 Laurent GUERBY
cert ttnn/h1.crt
36 9 Laurent GUERBY
key ttnn/h1.key  # This file should be kept secret
37 9 Laurent GUERBY
dh ttnn/dh1024.pem
38 9 Laurent GUERBY
39 9 Laurent GUERBY
mode server
40 9 Laurent GUERBY
tls-server
41 9 Laurent GUERBY
42 9 Laurent GUERBY
persist-key
43 9 Laurent GUERBY
persist-tun
44 9 Laurent GUERBY
45 9 Laurent GUERBY
client-config-dir ccd
46 9 Laurent GUERBY
47 9 Laurent GUERBY
client-to-client
48 9 Laurent GUERBY
comp-lzo yes
49 9 Laurent GUERBY
keepalive 10 60
50 9 Laurent GUERBY
51 9 Laurent GUERBY
verb 3
52 9 Laurent GUERBY
log-append  log/openvpn-tap.log
53 9 Laurent GUERBY
status status/openvpn-tap.txt
54 9 Laurent GUERBY
55 9 Laurent GUERBY
# cat /etc/openvpn/ttnn-tap6.conf 
56 9 Laurent GUERBY
dev tap6udp
57 9 Laurent GUERBY
port 11196
58 9 Laurent GUERBY
proto udp6
59 9 Laurent GUERBY
60 9 Laurent GUERBY
ca ttnn/ca.crt
61 9 Laurent GUERBY
cert ttnn/h1.crt
62 9 Laurent GUERBY
key ttnn/h1.key  # This file should be kept secret
63 9 Laurent GUERBY
dh ttnn/dh1024.pem
64 9 Laurent GUERBY
65 9 Laurent GUERBY
mode server
66 9 Laurent GUERBY
tls-server
67 9 Laurent GUERBY
68 9 Laurent GUERBY
persist-key
69 9 Laurent GUERBY
persist-tun
70 9 Laurent GUERBY
71 9 Laurent GUERBY
client-config-dir ccd
72 9 Laurent GUERBY
73 9 Laurent GUERBY
client-to-client
74 9 Laurent GUERBY
comp-lzo yes
75 9 Laurent GUERBY
keepalive 10 60
76 9 Laurent GUERBY
77 9 Laurent GUERBY
verb 3
78 9 Laurent GUERBY
log-append  log/openvpn-tap6.log
79 9 Laurent GUERBY
status status/openvpn-tap6.txt
80 9 Laurent GUERBY
81 9 Laurent GUERBY
# cat /etc/openvpn/ttnn-tap-tcp.conf 
82 9 Laurent GUERBY
dev tap0tcp
83 9 Laurent GUERBY
port 443
84 9 Laurent GUERBY
proto tcp-server
85 9 Laurent GUERBY
86 9 Laurent GUERBY
ca ttnn/ca.crt
87 9 Laurent GUERBY
cert ttnn/h1.crt
88 9 Laurent GUERBY
key ttnn/h1.key  # This file should be kept secret
89 9 Laurent GUERBY
dh ttnn/dh1024.pem
90 9 Laurent GUERBY
91 9 Laurent GUERBY
mode server
92 9 Laurent GUERBY
tls-server
93 9 Laurent GUERBY
94 9 Laurent GUERBY
persist-key
95 9 Laurent GUERBY
persist-tun
96 9 Laurent GUERBY
97 9 Laurent GUERBY
client-config-dir ccd
98 9 Laurent GUERBY
99 9 Laurent GUERBY
client-to-client
100 9 Laurent GUERBY
comp-lzo yes
101 9 Laurent GUERBY
keepalive 10 60
102 9 Laurent GUERBY
103 9 Laurent GUERBY
verb 3
104 9 Laurent GUERBY
log-append  log/openvpn-tap-tcp.log
105 9 Laurent GUERBY
status status/openvpn-tap-tcp.txt
106 9 Laurent GUERBY
107 9 Laurent GUERBY
# keys generated with id ip-X-Y-Z-T, files:
108 9 Laurent GUERBY
# ip-91-224-149-165.crt
109 9 Laurent GUERBY
# ip-91-224-149-165.csr
110 9 Laurent GUERBY
# ip-91-224-149-165.key
111 9 Laurent GUERBY
112 9 Laurent GUERBY
# cat /etc/openvpn/ccd/ip-91-224-149-165
113 9 Laurent GUERBY
ifconfig-push 91.224.149.165 255.255.255.0
114 9 Laurent GUERBY
push "route-gateway 91.224.149.254"
115 9 Laurent GUERBY
push "redirect-gateway def1"
116 9 Laurent GUERBY
push "dhcp-option DNS 8.8.8.8"
117 9 Laurent GUERBY
118 9 Laurent GUERBY
# bridge
119 9 Laurent GUERBY
brctl addbr br0
120 9 Laurent GUERBY
brctl addif br0 eth0
121 9 Laurent GUERBY
ip link set br0 up
122 9 Laurent GUERBY
ip link set br0 address 52:54:10:00:00:11 #force MAC to avoid MAC changes
123 9 Laurent GUERBY
124 1 Laurent GUERBY
openvpn --mktun --dev tap0udp
125 1 Laurent GUERBY
openvpn --mktun --dev tap0tcp
126 1 Laurent GUERBY
openvpn --mktun --dev tap6udp
127 1 Laurent GUERBY
128 1 Laurent GUERBY
brctl addif br0 tap0udp
129 1 Laurent GUERBY
ip link set tap0udp up
130 1 Laurent GUERBY
131 1 Laurent GUERBY
brctl addif br0 tap0tcp
132 1 Laurent GUERBY
ip link set tap0tcp up
133 1 Laurent GUERBY
134 1 Laurent GUERBY
brctl addif br0 tap6udp
135 1 Laurent GUERBY
ip link set tap6udp up
136 1 Laurent GUERBY
137 1 Laurent GUERBY
</pre>
138 1 Laurent GUERBY
139 34 Baptiste Jonglez
Pour ignorer les push IP et route du serveur coté client openvpn il suffit de mettre "tls-client" a la place de "client" l'option --client est un raccourci pour --tls-client  --pull et --pull est ce qui accepte les directives serveur.
140 10 Laurent GUERBY
141 10 Laurent GUERBY
h2. Client
142 10 Laurent GUERBY
143 10 Laurent GUERBY
144 10 Laurent GUERBY
<pre>
145 10 Laurent GUERBY
# cat /etc/openvpn/ttnn.conf
146 10 Laurent GUERBY
client
147 10 Laurent GUERBY
dev tap
148 10 Laurent GUERBY
149 10 Laurent GUERBY
### from outside with UDP available
150 10 Laurent GUERBY
#proto udp
151 10 Laurent GUERBY
#remote openvpn.tetaneutral.net 11195
152 10 Laurent GUERBY
153 10 Laurent GUERBY
### from outside with no UDP
154 10 Laurent GUERBY
proto tcp
155 10 Laurent GUERBY
remote openvpn.tetaneutral.net 443
156 10 Laurent GUERBY
# 91.224.149.211 443
157 10 Laurent GUERBY
158 10 Laurent GUERBY
# from outside using IPv6 over UDP
159 10 Laurent GUERBY
#proto udp6
160 10 Laurent GUERBY
#remote openvpn6.tetaneutral.net 11196
161 10 Laurent GUERBY
162 10 Laurent GUERBY
ca ttnn/ca.crt
163 10 Laurent GUERBY
cert ttnn/ip-91-224-149-165.crt
164 10 Laurent GUERBY
key ttnn/ip-91-224-149-165.key
165 10 Laurent GUERBY
166 10 Laurent GUERBY
persist-key
167 10 Laurent GUERBY
persist-tun
168 10 Laurent GUERBY
169 10 Laurent GUERBY
script-security 2
170 10 Laurent GUERBY
171 10 Laurent GUERBY
comp-lzo yes
172 10 Laurent GUERBY
keepalive 10 60
173 10 Laurent GUERBY
174 10 Laurent GUERBY
verb 3
175 10 Laurent GUERBY
log-append log/openvpn.log
176 10 Laurent GUERBY
</pre>
177 10 Laurent GUERBY
178 10 Laurent GUERBY
h2. point a point
179 10 Laurent GUERBY
180 36 Laurent GUERBY
181 36 Laurent GUERBY
Version tun :
182 36 Laurent GUERBY
183 36 Laurent GUERBY
<pre>
184 38 Laurent GUERBY
# Sur le serveur IPv4 publique A.B.C.D
185 36 Laurent GUERBY
openvpn --mktun --dev-type tun --dev tuntst
186 36 Laurent GUERBY
ip link set tuntst up
187 36 Laurent GUERBY
openvpn --dev-type tun --dev tuntst --proto udp --daemon --keepalive 10 120 --secret tst.key --port 1234
188 36 Laurent GUERBY
189 38 Laurent GUERBY
# Sur le client client
190 36 Laurent GUERBY
openvpn --mktun --dev-type tun --dev tuntst
191 36 Laurent GUERBY
ip link set tuntst up
192 39 Laurent GUERBY
openvpn --dev-type tun --dev tuntst --proto udp --daemon --keepalive 10 120 --secret tst.key --lport 0 --remote A.B.C.D 1234
193 36 Laurent GUERBY
</pre>
194 36 Laurent GUERBY
195 38 Laurent GUERBY
Pour le routage IPv6 et le NAT IPv4 sur le serveur :
196 1 Laurent GUERBY
197 1 Laurent GUERBY
<pre>
198 1 Laurent GUERBY
echo 1 > /proc/sys/net/ipv6/conf/all/forwarding
199 38 Laurent GUERBY
ip -6 route add  2a03:7220:808X:YZ01::1/128 dev tuntst
200 38 Laurent GUERBY
201 38 Laurent GUERBY
echo 1 > /proc/sys/net/ipv4/ip_forward
202 38 Laurent GUERBY
ip route add 10.10.10.10/32 dev tuntst
203 38 Laurent GUERBY
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
204 1 Laurent GUERBY
</pre>
205 1 Laurent GUERBY
206 38 Laurent GUERBY
Then on the client
207 38 Laurent GUERBY
208 10 Laurent GUERBY
<pre>
209 38 Laurent GUERBY
ip -6 addr add 2a03:7220:808X:YZ01::1/128 dev tuntst
210 38 Laurent GUERBY
ip -6 route add default tuntst
211 38 Laurent GUERBY
ip addr add 10.10.10.10/32 dev tuntst
212 38 Laurent GUERBY
# TODO default route
213 10 Laurent GUERBY
</pre>
214 3 Laurent GUERBY
215 34 Baptiste Jonglez
h2. Point-à-point avec routage d'un bloc d'IP.
216 1 Laurent GUERBY
217 1 Laurent GUERBY
[[Partage ADSL OpenVPN]]
218 1 Laurent GUERBY
219 46 julien Bresciani
h2. Performances.
220 47 julien Bresciani
221 46 julien Bresciani
h3. [[Benchmark VPN]].
222 42 julien Bresciani
223 46 julien Bresciani
h3. recherche de débit openvpn, statut en mars 2021.
224 42 julien Bresciani
225 46 julien Bresciani
sur le tunnel tunukr ~120 mbits en continu via tests iperf sur nucnagios.tetaneutral.net à travers le VPN . 500 a 600 mbits/s pour le même test hors du tunnel.
226 46 julien Bresciani
sur le tunnel tunlng ~ 50 mbits en continu via tests iperf sur nucnagios.tetaneutral.net à travers le VPN . 500 a 600 mbits/s pour le même test hors du tunnel.
227 46 julien Bresciani
d autres tests (wget , speedtest-cli) corroborent ces résultats.
228 41 julien Bresciani
229 43 julien Bresciani
230 46 julien Bresciani
h3. Recherche de débit, hypothese1 : tester le CPU de la machine faisant tourner openvpn.
231 1 Laurent GUERBY
232 46 julien Bresciani
Les tests de CPU montrent que dans notre cas, le lien étant non chiffré, il n y a aucun problème de CPU sur le shuttle de tunukr , un dual celeron @1.6ghz , openvpn prends 50 pourcent d un seul CPU.
233 46 julien Bresciani
Ne pas oublier par contre qu'openvpn2 est monothread. un test pour passer le gouverneur des fréquences CPU en mode performance ne montre aucune variation de débit.
234 44 julien Bresciani
235 43 julien Bresciani
236 46 julien Bresciani
h3. Recherche de débit, hypothese2 : tester la MTU pour fixer la taille des paquets openvpn.
237 1 Laurent GUERBY
238 46 julien Bresciani
Tests effectués sur les liens VPN de tunukr (Toulouse quartier bagatelle) et aussi tunlng (Launaguet) afin de débrider le débit.
239 46 julien Bresciani
Vérifications que le MTU est correct sur le lien fibre supportant openvpn en utilisant la commande : 
240 1 Laurent GUERBY
<pre><code class="text">
241 1 Laurent GUERBY
ping -M do -s 1472 free.fr
242 1 Laurent GUERBY
</code></pre>
243 46 julien Bresciani
La commande envoie un ping avec une demande explicite de non fragmentation du paquet (-M do), 1472 correspond a la taille maxi que l'on peut faire passer sur un lien de MTU 1500 (1472 + 20 octets IPV4 + 8 octets ICMP = 1500).
244 46 julien Bresciani
245 45 julien Bresciani
Si le ping passe vous recevez une réponse classique de la part de la commande, si le ping ne passe pas vous recevrez une réponse de ce style :   
246 1 Laurent GUERBY
<pre><code class="text">
247 1 Laurent GUERBY
local error: message too long, mtu=1492.
248 1 Laurent GUERBY
</code></pre>
249 1 Laurent GUERBY
250 46 julien Bresciani
Cela vous donnera une idée de la MTU de la ligne utilisée et vous permettra d utiliser les options --mssfix  --fragment et toutes les options de MTU d openvpn qui a aussi une directive pour decouvrir le MTU sur le lien : @--mtu-test@.
251 46 julien Bresciani
les résultats des tests de MTU d openvpn sont disponibles après lancement dans les log.
252 1 Laurent GUERBY
253 46 julien Bresciani
Pour les sites tunlng (fibre GPON avec ONT intégré a la box Bouygues  et tunukr (fibre FTTH free P2P avec convertisseur externe a freebox) , nous avons pu valider que la MTU est de 1500 sur les deux sites.
254 1 Laurent GUERBY
dans ce cas aucune manip sur la 
255 1 Laurent GUERBY
256 46 julien Bresciani
h3. Recherche de débit, hypothese3 : lien  "bufferbloated":https://en.wikipedia.org/wiki/Bufferbloat
257 1 Laurent GUERBY
258 46 julien Bresciani
Beaucoup de recherches sur les perfos d'openvpn montrent des soucis a cause des buffers internes d openvpn, la proposition de certains est de les agrandir, d autres est de les supprimer, cela dépend probablement du débit théorique des lignes sur lesquelles on évolue mais surtout de leur latence.
259 1 Laurent GUERBY
260 46 julien Bresciani
Les tests sur tunukr montrent  un passage du débit de 120 mbits/s a 250 300 mbits/s en mettant les buffers d openvpn a zéro. les options d openvpn pour réaliser ceci sont: @--sndbuf 0 --rcvbuf 0@
261 1 Laurent GUERBY
262 46 julien Bresciani
La charge CPU n ayant pas monté, on sent que puisque l'on et en mode non chiffré, on doit pouvoir faire mieux , après avoir bougé de nombreuses options d openvpn dont @--tcp-nodelay --tcp-queue-limit 256@ dont il faudrait étudier les effets plus fins, nous avons testé d agrandir la txqueue de l'interface TUN openvpn.
263 1 Laurent GUERBY
264 1 Laurent GUERBY
La queue de transmission des paquets c est le "qlen" que l'on voit au bout dune commande @ip address@ ou @ip link@
265 46 julien Bresciani
@tunukr: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 100@ la valeur de la queue settée par openvpn est de 100 par défaut.
266 45 julien Bresciani
pour changer la taille de la queue : @ip link set tunukr txqueuelen 1000@.
267 45 julien Bresciani
268 46 julien Bresciani
Cette commande a un effet direct , pas besoin de redémarrer l'interface ou autre (a noter d ailleurs qu openvpn modifie cette valeur lors de son démarrage même si l'interface existe déjà).
269 46 julien Bresciani
apres avoir augmenté le txqueuelen, on arrive a des débits entre 400 et 600mbits/s soit 80 a 100 pourcent de ce qui est dispo en bande passante réelle.
270 45 julien Bresciani
271 46 julien Bresciani
h3. Recherche de débit , conclusion et configuration: 
272 41 julien Bresciani
273 46 julien Bresciani
Nous avons multiplié par 3-4 le débit du tunnel openvpn tunukr via cette manip et multiplié par 10 le débit sur le tunnel tunlng, sans effet de bord sur 48-72h (pas de déconnections, lags, variations brutales de débits).
274 46 julien Bresciani
275 45 julien Bresciani
Les directives d'openvpn les plus importantes pour atteindre ce gain sont : @--sndbuf 0 --rcvbuf 0@ et @--txqueuelen 1000@ qui permet a openvpn d ajuster au démarrage la valeur de la queue de l'interface tun à la volée (setter la queue via la commande IP et ensuite demarrer openvpn sans le @--txqueuelen 1000@ ... openvpn remettra la queue a 100 qui est la valeur par defaut d openvpn).
276 1 Laurent GUERBY
277 46 julien Bresciani
la configuration retenue a l issue de ces tests pour lancer openvpn dans le /etc/rc.local est : 
278 46 julien Bresciani
<pre><code class="c">
279 46 julien Bresciani
openvpn --dev tunukr --dev-type tun --lport 0 --persist-tun --cipher none --auth none --remote 91.224.148.1 65114 --verb 4 --mute 20 --mtu-test --sndbuf 0 --rcvbuf 0 --tcp-nodelay --tcp-queue-limit 256 --txqueuelen 1000 --proto udp --daemon --log-append /root/vpn-65114.log --keepalive 10 60
280 46 julien Bresciani
</code></pre>
281 45 julien Bresciani
282 1 Laurent GUERBY
283 46 julien Bresciani
284 46 julien Bresciani
h2. Proxmox.
285 46 julien Bresciani
286 11 Laurent GUERBY
http://www.nedproductions.biz/wiki/configuring-a-proxmox-ve-2.x-cluster-running-over-an-openvpn-intranet
287 11 Laurent GUERBY
http://blog.developpeur-neurasthenique.fr/auto-hebergement-configurer-un-cluster-proxmox-2-sans-multicast.html
288 11 Laurent GUERBY
289 46 julien Bresciani
h2. Liens.
290 34 Baptiste Jonglez
291 34 Baptiste Jonglez
* https://community.openvpn.net/openvpn/changeset/150fb45047c5482858b32a669de4097e66dec1c7 "Allow 'lport 0' setup for random port binding"
292 1 Laurent GUERBY
* https://vador.fdn.fr/wiki/travaux:vpn_misc:doc#configurer_sa_machine_pour_utiliser_l_offre_vpn_de_fdn
293 1 Laurent GUERBY
* https://wiki.ldn-fai.net/wiki/Tuto_Serveur_OpenVPN