Projet

Général

Profil

Partage ADSL OpenVPN » Historique » Version 2

Jocelyn Dealande, 02/05/2012 03:33
image centrée

1 1 Jocelyn Dealande
h1. Partage ADSL OpenVPN avec bloc d'IP routé.
2 1 Jocelyn Dealande
3 1 Jocelyn Dealande
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 1 Jocelyn Dealande
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 1 Jocelyn Dealande
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 1 Jocelyn Dealande
Ce quie ne couvre pas cette documentation.
14 1 Jocelyn Dealande
* la manière dont le routeur term_distante effectue le routage du bloc vers internet.
15 1 Jocelyn Dealande
* la manière dont le trafic est collecté sur le réseau local du côté eth1 de term_locale.
16 1 Jocelyn Dealande
* 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 1 Jocelyn Dealande
h2. Préparation
19 1 Jocelyn Dealande
20 1 Jocelyn Dealande
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 1 Jocelyn Dealande
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 1 Jocelyn Dealande
h2. Interfaces réseau virtuelles
29 1 Jocelyn Dealande
30 1 Jocelyn Dealande
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 1 Jocelyn Dealande
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 1 Jocelyn Dealande
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 1 Jocelyn Dealande
_/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 1 Jocelyn Dealande
# nobind permet de prendre un port aléatoire à chaque démarrage d'openVPN évitera
76 1 Jocelyn Dealande
# 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 1 Jocelyn Dealande
_/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
104 1 Jocelyn Dealande
h2. Routage
105 1 Jocelyn Dealande
106 1 Jocelyn Dealande
h3. Sur le serveur (machine term_distante)
107 1 Jocelyn Dealande
108 1 Jocelyn Dealande
Sort du cadre de ce tutoriel. Simplement le bloc (_1.2.3.1/28_ dans notre exemple) doit être routé vers _term_distante_.
109 1 Jocelyn Dealande
110 1 Jocelyn Dealande
h3. Sur le client (machine term_locale)
111 1 Jocelyn Dealande
112 1 Jocelyn Dealande
L'idée ici est la suivante : 
113 1 Jocelyn Dealande
# 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.
114 1 Jocelyn Dealande
# Les paquets provenant d'eth1 et avec une adresse source dans _1.2.3.1/28_
115 1 Jocelyn Dealande
116 1 Jocelyn Dealande
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 : 
117 1 Jocelyn Dealande
118 1 Jocelyn Dealande
* IP_ADVANCED_ROUTER 
119 1 Jocelyn Dealande
* IP_MULTIPLE_TABLES 
120 1 Jocelyn Dealande
* IPV6_MULTIPLE_TABLES
121 1 Jocelyn Dealande
* IPV6_SUBTREES
122 1 Jocelyn Dealande
123 1 Jocelyn Dealande
À vérifier dans /boot/config-$(uname -r) ou /proc/config.gz une Debian Wheezy récente est ok.
124 1 Jocelyn Dealande
125 1 Jocelyn Dealande
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 : 
126 1 Jocelyn Dealande
127 1 Jocelyn Dealande
_/etc/openvpn/trifouillis/vpn.up.sh_
128 1 Jocelyn Dealande
129 1 Jocelyn Dealande
<pre>
130 1 Jocelyn Dealande
#!/bin/sh
131 1 Jocelyn Dealande
132 1 Jocelyn Dealande
## On gère via une table perso (250) uniquement les IP du bloc /28 et l'IP du endpoint VPN local.
133 1 Jocelyn Dealande
## Les autres passent par la table default du système
134 1 Jocelyn Dealande
135 1 Jocelyn Dealande
# source-routing des IPs du bloc
136 1 Jocelyn Dealande
ip rule add prio 200 from 1.2.3.0/28 lookup 250
137 1 Jocelyn Dealande
# endpoint local (tap0)
138 1 Jocelyn Dealande
ip rule add prio 200 from 9.9.9.9 lookup 250
139 1 Jocelyn Dealande
140 1 Jocelyn Dealande
141 1 Jocelyn Dealande
## Fonctionnement de la table 250
142 1 Jocelyn Dealande
143 1 Jocelyn Dealande
# Ce qui est à destination des IPs du bloc va sur eth0
144 1 Jocelyn Dealande
# (internet -> bloc)
145 1 Jocelyn Dealande
ip route add 1.2.3.0/28 dev eth1 table 250
146 1 Jocelyn Dealande
147 1 Jocelyn Dealande
# Ce qui vient du bloc vers internet va dans le tunnel
148 1 Jocelyn Dealande
# (bloc -> internet)
149 1 Jocelyn Dealande
ip route add default via 9.9.9.8 dev tap0 table 250
150 1 Jocelyn Dealande
151 1 Jocelyn Dealande
</pre>
152 1 Jocelyn Dealande
153 1 Jocelyn Dealande
_/etc/openvpn/trifouillis/vpn.down.sh_
154 1 Jocelyn Dealande
155 1 Jocelyn Dealande
<pre>
156 1 Jocelyn Dealande
#!/bin/sh
157 1 Jocelyn Dealande
158 1 Jocelyn Dealande
# On supprime toutes les règles de routage du *.up.sh
159 1 Jocelyn Dealande
ip rule del prio 200 from 1.2.3.0/28 lookup 250
160 1 Jocelyn Dealande
ip rule del prio 200 from 9.9.9.9 lookup 250
161 1 Jocelyn Dealande
ip route del default via 9.9.9.8 dev taprhi table 250
162 1 Jocelyn Dealande
ip route del 1.2.3.0/28 dev eth0 table 250
163 1 Jocelyn Dealande
</pre>
164 1 Jocelyn Dealande
165 1 Jocelyn Dealande
h2. On lance
166 1 Jocelyn Dealande
167 1 Jocelyn Dealande
De chaque côté pour que la magie opère :
168 1 Jocelyn Dealande
169 1 Jocelyn Dealande
<pre>
170 1 Jocelyn Dealande
/etc/init.d/openvpn restart
171 1 Jocelyn Dealande
</pre>
172 1 Jocelyn Dealande
173 1 Jocelyn Dealande
174 1 Jocelyn Dealande
h2. …et on débugue
175 1 Jocelyn Dealande
Quelques commandes pour tester/debuguer (sur term_locale)
176 1 Jocelyn Dealande
177 1 Jocelyn Dealande
Interface tap existe ?
178 1 Jocelyn Dealande
<pre>
179 1 Jocelyn Dealande
ifconfig tap
180 1 Jocelyn Dealande
</pre>
181 1 Jocelyn Dealande
182 1 Jocelyn Dealande
Tunnel monté et fonctionnel (depuis local_endpoint) ?
183 1 Jocelyn Dealande
<pre>
184 1 Jocelyn Dealande
ping 9.9.9.8
185 1 Jocelyn Dealande
</pre>
186 1 Jocelyn Dealande
187 1 Jocelyn Dealande
Source-routing du blocpasse bien par le tunnel ?
188 1 Jocelyn Dealande
<pre>
189 1 Jocelyn Dealande
ip route get 8.8.8.8 from  
190 1 Jocelyn Dealande
191 1 Jocelyn Dealande
# Réponse attendue :
192 1 Jocelyn Dealande
8.8.8.8 from  via  dev tap0
193 1 Jocelyn Dealande
</pre>
194 1 Jocelyn Dealande
195 1 Jocelyn Dealande
Ping fonctionne depuis le réseau routé à travers le VPN ?
196 1 Jocelyn Dealande
197 1 Jocelyn Dealande
<pre>
198 1 Jocelyn Dealande
ping -I 1.2.3.1/28 www.ffdn.org
199 1 Jocelyn Dealande
</pre>
200 1 Jocelyn Dealande
201 1 Jocelyn Dealande
202 1 Jocelyn Dealande
Afficher les règles de routage de la table 250
203 1 Jocelyn Dealande
<pre>
204 1 Jocelyn Dealande
ip route show table 250
205 1 Jocelyn Dealande
</pre>
206 1 Jocelyn Dealande
207 1 Jocelyn Dealande
Afficher les règles de consultation des tables :
208 1 Jocelyn Dealande
<pre>
209 1 Jocelyn Dealande
ip rule show
210 1 Jocelyn Dealande
</pre>
211 1 Jocelyn Dealande
212 1 Jocelyn Dealande
213 1 Jocelyn Dealande
h2.Pour aller plus loin…
214 1 Jocelyn Dealande
215 1 Jocelyn Dealande
h3. Et IPv6 dans tout ça ?
216 1 Jocelyn Dealande
217 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 : 
218 1 Jocelyn Dealande
219 1 Jocelyn Dealande
* Ajouter des règles _ip route_ et _ip rule_ similaires à celles pour les blocs IPv4 dans les scripts *.up.sh et *.down.sh
220 1 Jocelyn Dealande
* Configurer l'interface tap0 en IPv6. Exemple d'etc/network/interfaces : 
221 1 Jocelyn Dealande
<pre>
222 1 Jocelyn Dealande
iface tap0 inet6 static
223 1 Jocelyn Dealande
        address 2607:f0d0:2001:000a:0000:0000:0000:0010
224 1 Jocelyn Dealande
        netmask 64
225 1 Jocelyn Dealande
        gateway 2607:f0d0:2001:000a:0000:0000:0000:0001
226 1 Jocelyn Dealande
</pre>