Projet

Général

Profil

Partage ADSL OpenVPN » Historique » Version 6

Baptiste Jonglez, 31/05/2014 04:06

1 6 Baptiste Jonglez
h1. Partage ADSL OpenVPN avec bloc d'IP routé.
2 1 Jocelyn Dealande
3 6 Baptiste Jonglez
Le but est d'utiliser OpenVPN pour du *partage de connexion ADSL*. La collecte ADSL n'est pas maitrisée mais étant celle d'un opérateur tiers et quelconque. Les options et le fonctionnement sont très similaires à la configuration point-à-point. Sauf que tout démarre avec un script d'init et qu'il y a en plus la question du routage du bloc d'adresses. IP.
4 1 Jocelyn Dealande
5 6 Baptiste Jonglez
Le but est d'ammener des adresses IP publiques, via le VPN jusque chez les utilisateurs finaux (barbus du schémas). Là où par défaut, ils ne pourraient que se mettre derrière la *box et recevoir des adresses privées. Ce montage permet également de "neutraliser" un accès internet qui l'est peu…
6 1 Jocelyn Dealande
7 6 Baptiste Jonglez
Comme un schéma vaut mieux qu'un pavé…
8 1 Jocelyn Dealande
9 2 Jocelyn Dealande
p=. !vpn_partage.png!
10 1 Jocelyn Dealande
11 1 Jocelyn Dealande
12 1 Jocelyn Dealande
13 3 Jocelyn Dealande
Ce que ne couvre pas cette documentation.
14 6 Baptiste Jonglez
* la manière dont le routeur term_distante effectue le routage du bloc vers internet.
15 6 Baptiste Jonglez
* la manière dont le trafic est collecté sur le réseau local du côté eth1 de term_locale.
16 6 Baptiste Jonglez
* la manière dont sont distribuée les adresses du bloc aux machines sur le réseau local (DHCP, statique…)
17 1 Jocelyn Dealande
18 6 Baptiste Jonglez
h2. Préparation
19 1 Jocelyn Dealande
20 6 Baptiste Jonglez
On utilise ici le fonctionnement Debian d'OpenVPN : chaque /etc/openvpn/<nom_tunnel>.conf est une instance d'openvpn différente qui sera démarrée par le script d'init (voir /etc/default/openvpn). Ici notre instance s'appelle _trifouillis_.
21 1 Jocelyn Dealande
22 6 Baptiste Jonglez
On génère une clé symétrique et on la copie dans _/etc/openvpn/trifouillis/vpn-trifouillis.key_ sur _term_locale_ et _term_distante_.
23 1 Jocelyn Dealande
24 1 Jocelyn Dealande
<pre>
25 1 Jocelyn Dealande
openvpn --genkey --secret trifouillis.key
26 1 Jocelyn Dealande
</pre>
27 1 Jocelyn Dealande
28 6 Baptiste Jonglez
h2. Interfaces réseau virtuelles
29 1 Jocelyn Dealande
30 6 Baptiste Jonglez
Il faut créer, via OpenVPN des interfaces virtuelles (tap). On peut faire ça proprement dans le fichier _/etc/network/interfaces_ en ajoutant le contenu suivant (côté _term_locale_) :
31 1 Jocelyn Dealande
32 1 Jocelyn Dealande
<pre>
33 1 Jocelyn Dealande
auto tap0
34 1 Jocelyn Dealande
iface tap0 inet static
35 1 Jocelyn Dealande
	pre-up /usr/sbin/openvpn --mktun --dev-type tap --dev tap0
36 1 Jocelyn Dealande
	post-down /usr/sbin/openvpn --rmtun --dev-type tap --dev tap0
37 1 Jocelyn Dealande
	address 9.9.9.9
38 1 Jocelyn Dealande
	netmask 255.255.255.254
39 1 Jocelyn Dealande
</pre>
40 1 Jocelyn Dealande
41 6 Baptiste Jonglez
C'est identique côté serveur (_term_distante_), on change juste 9.9.9.9 en 9.9.9.8
42 1 Jocelyn Dealande
43 6 Baptiste Jonglez
Puis de chaque côté, un petit
44 1 Jocelyn Dealande
45 1 Jocelyn Dealande
<pre>
46 1 Jocelyn Dealande
ifup tap0
47 1 Jocelyn Dealande
</pre>
48 1 Jocelyn Dealande
49 1 Jocelyn Dealande
h2. Configuration d'OpenVPN
50 1 Jocelyn Dealande
51 1 Jocelyn Dealande
h3. Configuration OpenVPN client (machine term_locale)
52 1 Jocelyn Dealande
53 6 Baptiste Jonglez
_/etc/openvpn/trifouillis.conf_ : 
54 1 Jocelyn Dealande
<pre>
55 1 Jocelyn Dealande
dev             tap0
56 1 Jocelyn Dealande
dev-type        tap
57 1 Jocelyn Dealande
comp-lzo        yes
58 1 Jocelyn Dealande
cipher          none
59 1 Jocelyn Dealande
proto           udp
60 1 Jocelyn Dealande
verb            3
61 1 Jocelyn Dealande
62 1 Jocelyn Dealande
daemon
63 1 Jocelyn Dealande
log-append      /var/log/openvpn-trifouillis.log
64 1 Jocelyn Dealande
65 1 Jocelyn Dealande
remote          5.5.5.5 9999
66 1 Jocelyn Dealande
secret          /etc/openvpn/trifouillis/vpn-trifouillis.key
67 1 Jocelyn Dealande
68 1 Jocelyn Dealande
up              /etc/openvpn/trifouillis/vpn.up.sh
69 1 Jocelyn Dealande
down            /etc/openvpn/trifouillis/vpn.down.sh
70 1 Jocelyn Dealande
71 1 Jocelyn Dealande
keepalive       10 30
72 1 Jocelyn Dealande
73 1 Jocelyn Dealande
persist-tun
74 1 Jocelyn Dealande
75 6 Baptiste Jonglez
# nobind permet de prendre un port aléatoire à chaque démarrage d'openVPN évitera
76 6 Baptiste Jonglez
# les bugs liés aux NAT lorsque certaines box changent d'IP publique...
77 1 Jocelyn Dealande
78 1 Jocelyn Dealande
nobind
79 1 Jocelyn Dealande
</pre>
80 1 Jocelyn Dealande
81 1 Jocelyn Dealande
h3. Configuration OpenVPN serveur (machine term_distante)
82 1 Jocelyn Dealande
83 6 Baptiste Jonglez
_/etc/openvpn/trifouillis.conf_ : 
84 1 Jocelyn Dealande
<pre>
85 1 Jocelyn Dealande
dev             tap0
86 1 Jocelyn Dealande
dev-type        tap
87 1 Jocelyn Dealande
comp-lzo        yes
88 1 Jocelyn Dealande
cipher          none
89 1 Jocelyn Dealande
proto           udp
90 1 Jocelyn Dealande
verb            3
91 1 Jocelyn Dealande
92 1 Jocelyn Dealande
daemon
93 1 Jocelyn Dealande
log-append      /var/log/openvpn-trifouillis.log
94 1 Jocelyn Dealande
95 1 Jocelyn Dealande
port            9999
96 1 Jocelyn Dealande
secret          /etc/openvpn/trifouillis/vpn-trifouillis.key
97 1 Jocelyn Dealande
98 1 Jocelyn Dealande
keepalive       10 30
99 1 Jocelyn Dealande
100 1 Jocelyn Dealande
persist-tun
101 1 Jocelyn Dealande
</pre>
102 1 Jocelyn Dealande
103 1 Jocelyn Dealande
h2. Routage
104 1 Jocelyn Dealande
105 1 Jocelyn Dealande
h3. Sur le serveur (machine term_distante)
106 1 Jocelyn Dealande
107 6 Baptiste Jonglez
Sort du cadre de cette documentation. Simplement le bloc (_1.2.3.1/28_ dans notre exemple) doit être routé vers _term_distante_.
108 1 Jocelyn Dealande
109 1 Jocelyn Dealande
h3. Sur le client (machine term_locale)
110 1 Jocelyn Dealande
111 6 Baptiste Jonglez
L'idée ici est la suivante : 
112 6 Baptiste Jonglez
# Les paquets provenant de l'interface tap OpenVPN et correspondant au bloc _1.2.3.1/28_ doivent-être routés vers l'interface eth1.
113 1 Jocelyn Dealande
# Les paquets provenant d'eth1 et avec une adresse source dans _1.2.3.1/28_
114 1 Jocelyn Dealande
115 6 Baptiste Jonglez
Le 1. est trivial, le 2. correspond à du *source-routing*. Il faut tout d'abord vérifier que le source-routing est disponible dans le kernel. Cela correspond aux options du kernel Linux suivantes : 
116 1 Jocelyn Dealande
117 1 Jocelyn Dealande
* IP_ADVANCED_ROUTER 
118 1 Jocelyn Dealande
* IP_MULTIPLE_TABLES 
119 1 Jocelyn Dealande
* IPV6_MULTIPLE_TABLES
120 1 Jocelyn Dealande
* IPV6_SUBTREES
121 1 Jocelyn Dealande
122 6 Baptiste Jonglez
À vérifier dans /boot/config-$(uname -r) ou /proc/config.gz une Debian Wheezy récente est ok.
123 1 Jocelyn Dealande
124 6 Baptiste Jonglez
Les règles de routage sont ensuite mises en places/retirées au démarrage/arrêt d'OpenVPN (cf partie précédente, options _up_ et _down_). Le contenu des scripts est le suivant : 
125 1 Jocelyn Dealande
126 1 Jocelyn Dealande
_/etc/openvpn/trifouillis/vpn.up.sh_
127 1 Jocelyn Dealande
128 1 Jocelyn Dealande
<pre>
129 1 Jocelyn Dealande
#!/bin/sh
130 1 Jocelyn Dealande
131 6 Baptiste Jonglez
## On gère via une table perso (250) uniquement les IP du bloc /28 et l'IP du endpoint VPN local.
132 6 Baptiste Jonglez
## Les autres passent par la table default du système
133 1 Jocelyn Dealande
134 1 Jocelyn Dealande
# source-routing des IPs du bloc
135 1 Jocelyn Dealande
ip rule add prio 200 from 1.2.3.0/28 lookup 250
136 1 Jocelyn Dealande
# endpoint local (tap0)
137 1 Jocelyn Dealande
ip rule add prio 200 from 9.9.9.9 lookup 250
138 1 Jocelyn Dealande
139 1 Jocelyn Dealande
140 1 Jocelyn Dealande
## Fonctionnement de la table 250
141 1 Jocelyn Dealande
142 6 Baptiste Jonglez
# Ce qui est à destination des IPs du bloc va sur eth0
143 1 Jocelyn Dealande
# (internet -> bloc)
144 1 Jocelyn Dealande
ip route add 1.2.3.0/28 dev eth1 table 250
145 1 Jocelyn Dealande
146 1 Jocelyn Dealande
# Ce qui vient du bloc vers internet va dans le tunnel
147 1 Jocelyn Dealande
# (bloc -> internet)
148 1 Jocelyn Dealande
ip route add default via 9.9.9.8 dev tap0 table 250
149 1 Jocelyn Dealande
150 1 Jocelyn Dealande
</pre>
151 1 Jocelyn Dealande
152 1 Jocelyn Dealande
_/etc/openvpn/trifouillis/vpn.down.sh_
153 1 Jocelyn Dealande
154 1 Jocelyn Dealande
<pre>
155 1 Jocelyn Dealande
#!/bin/sh
156 1 Jocelyn Dealande
157 6 Baptiste Jonglez
# On supprime toutes les règles de routage du *.up.sh
158 1 Jocelyn Dealande
ip rule del prio 200 from 1.2.3.0/28 lookup 250
159 1 Jocelyn Dealande
ip rule del prio 200 from 9.9.9.9 lookup 250
160 1 Jocelyn Dealande
ip route del default via 9.9.9.8 dev taprhi table 250
161 1 Jocelyn Dealande
ip route del 1.2.3.0/28 dev eth0 table 250
162 1 Jocelyn Dealande
</pre>
163 1 Jocelyn Dealande
164 3 Jocelyn Dealande
h2. OpenVPN, lis-mes scripts !
165 3 Jocelyn Dealande
166 6 Baptiste Jonglez
Il convient d'ajuster une variable pour autoriser OpenVPN à utiliser nos scripts d'up/down.
167 3 Jocelyn Dealande
168 3 Jocelyn Dealande
_/etc/default/openvpn_
169 3 Jocelyn Dealande
170 3 Jocelyn Dealande
<pre>
171 6 Baptiste Jonglez
172 3 Jocelyn Dealande
OPTARGS="--script-security 2"
173 6 Baptiste Jonglez
174 3 Jocelyn Dealande
</pre>
175 3 Jocelyn Dealande
176 1 Jocelyn Dealande
h2. On lance
177 1 Jocelyn Dealande
178 6 Baptiste Jonglez
De chaque côté pour que la magie opère :
179 1 Jocelyn Dealande
180 1 Jocelyn Dealande
<pre>
181 1 Jocelyn Dealande
/etc/init.d/openvpn restart
182 1 Jocelyn Dealande
</pre>
183 1 Jocelyn Dealande
184 1 Jocelyn Dealande
185 6 Baptiste Jonglez
h2. …et on débugue
186 3 Jocelyn Dealande
187 1 Jocelyn Dealande
Quelques commandes pour tester/debuguer (sur term_locale)
188 1 Jocelyn Dealande
189 1 Jocelyn Dealande
Interface tap existe ?
190 1 Jocelyn Dealande
<pre>
191 1 Jocelyn Dealande
ifconfig tap
192 1 Jocelyn Dealande
</pre>
193 1 Jocelyn Dealande
194 6 Baptiste Jonglez
Tunnel monté et fonctionnel (depuis local_endpoint) ?
195 1 Jocelyn Dealande
<pre>
196 1 Jocelyn Dealande
ping 9.9.9.8
197 1 Jocelyn Dealande
</pre>
198 1 Jocelyn Dealande
199 1 Jocelyn Dealande
Source-routing du blocpasse bien par le tunnel ?
200 1 Jocelyn Dealande
<pre>
201 1 Jocelyn Dealande
ip route get 8.8.8.8 from  
202 1 Jocelyn Dealande
203 6 Baptiste Jonglez
# Réponse attendue :
204 1 Jocelyn Dealande
8.8.8.8 from  via  dev tap0
205 1 Jocelyn Dealande
</pre>
206 1 Jocelyn Dealande
207 6 Baptiste Jonglez
Ping fonctionne depuis le réseau routé à travers le VPN ?
208 1 Jocelyn Dealande
209 1 Jocelyn Dealande
<pre>
210 1 Jocelyn Dealande
ping -I 1.2.3.1/28 www.ffdn.org
211 1 Jocelyn Dealande
</pre>
212 1 Jocelyn Dealande
213 1 Jocelyn Dealande
Visualiser les paquets passant dans le tunnel, dans _/etc/openvpn/trifouillis.conf_
214 3 Jocelyn Dealande
215 1 Jocelyn Dealande
<pre>
216 6 Baptiste Jonglez
217 3 Jocelyn Dealande
verb        5
218 6 Baptiste Jonglez
219 3 Jocelyn Dealande
</pre>
220 3 Jocelyn Dealande
221 3 Jocelyn Dealande
222 6 Baptiste Jonglez
Afficher les règles de routage de la table 250
223 1 Jocelyn Dealande
<pre>
224 1 Jocelyn Dealande
ip route show table 250
225 1 Jocelyn Dealande
</pre>
226 1 Jocelyn Dealande
227 6 Baptiste Jonglez
Afficher les règles de consultation des tables :
228 1 Jocelyn Dealande
<pre>
229 1 Jocelyn Dealande
ip rule show
230 1 Jocelyn Dealande
</pre>
231 1 Jocelyn Dealande
232 1 Jocelyn Dealande
233 6 Baptiste Jonglez
h2. Pour aller plus loin…
234 3 Jocelyn Dealande
235 6 Baptiste Jonglez
h3. Et IPv6 dans tout ça ?
236 1 Jocelyn Dealande
237 1 Jocelyn Dealande
Le tunnel est de niveau 2, ce qui signifie qu'il peut faire passer aussi bien IPv4 qu'IPv6 dedans. Il faut simplement adapter le routage : 
238 1 Jocelyn Dealande
239 6 Baptiste Jonglez
* Ajouter des règles _ip route_ et _ip rule_ similaires à celles pour les blocs IPv4 dans les scripts *.up.sh et *.down.sh
240 1 Jocelyn Dealande
* Configurer l'interface tap0 en IPv6. Exemple d'etc/network/interfaces : 
241 1 Jocelyn Dealande
<pre>
242 1 Jocelyn Dealande
iface tap0 inet6 static
243 1 Jocelyn Dealande
        address 2607:f0d0:2001:000a:0000:0000:0000:0010
244 1 Jocelyn Dealande
        netmask 64
245 1 Jocelyn Dealande
        gateway 2607:f0d0:2001:000a:0000:0000:0000:0001
246 1 Jocelyn Dealande
</pre>
247 1 Jocelyn Dealande
248 3 Jocelyn Dealande
h2. Voir aussi
249 3 Jocelyn Dealande
250 3 Jocelyn Dealande
 * [[OpenVPN]]
251 3 Jocelyn Dealande
 * [[Bufferbloat#QoS]]
252 6 Baptiste Jonglez
 * [[Benchmark_VPN]]
253 3 Jocelyn Dealande
 * "LARTC simple source policy routing":http://lartc.org/howto/lartc.rpdb.html