Projet

Général

Profil

VPN Client OpenWrt » Historique » Version 15

Julien Vaubourg, 30/08/2020 00:23

1 1 Julien Vaubourg
h1. VPN Client OpenWrt
2 1 Julien Vaubourg
3 4 Julien Vaubourg
h2. Introduction
4 4 Julien Vaubourg
5 1 Julien Vaubourg
Le routeur doit être assez puissant pour supporter les opérations de chiffrement de Wireguard (eg. TP-Link Archer C7).
6 1 Julien Vaubourg
7 1 Julien Vaubourg
Il doit avoir été préalablement flashé en OpenWrt.
8 1 Julien Vaubourg
9 2 Julien Vaubourg
Doc testée avec OpenWrt 19.07.3.
10 2 Julien Vaubourg
11 1 Julien Vaubourg
h2. Exemple de configuration
12 1 Julien Vaubourg
13 2 Julien Vaubourg
On suppose que votre service Wireguard a été configuré comme suit côté Tetaneutral :
14 1 Julien Vaubourg
15 1 Julien Vaubourg
* Réseau IPv6: <pre>2001:db8:dead:be00::/56</pre>
16 1 Julien Vaubourg
* Adresse IPv4: <pre>203.0.113.42/32</pre>
17 1 Julien Vaubourg
* Clé privée Wireguard: <pre>XF4wYSh/Ox9CoPl/YvFECu1DH6FQy7fLNUnur4sv9nM=</pre>
18 1 Julien Vaubourg
19 1 Julien Vaubourg
h2. Variables et commandes à copier-coller
20 1 Julien Vaubourg
21 1 Julien Vaubourg
Se connecter en SSH au routeur pour obtenir un terminal sur OpenWrt.
22 1 Julien Vaubourg
23 1 Julien Vaubourg
Variables *à personnaliser* puis copier-coller dans le terminal du OpenWrt :
24 1 Julien Vaubourg
25 1 Julien Vaubourg
<pre>
26 1 Julien Vaubourg
WG_ADH_NET6="2001:db8:dead:be00::"
27 1 Julien Vaubourg
WG_ADH_ADDR4="203.0.113.42"
28 1 Julien Vaubourg
WG_ADH_PRIV_KEY="XF4wYSh/Ox9CoPl/YvFECu1DH6FQy7fLNUnur4sv9nM="
29 1 Julien Vaubourg
</pre>
30 1 Julien Vaubourg
31 1 Julien Vaubourg
Variables et commandes à copier-coller ensuite *telles quelles* dans le terminal du OpenWrt (sauf expert·e) :
32 1 Julien Vaubourg
33 1 Julien Vaubourg
<pre>
34 1 Julien Vaubourg
# Install wireguard
35 1 Julien Vaubourg
opkg update
36 1 Julien Vaubourg
opkg install wireguard luci-proto-wireguard
37 1 Julien Vaubourg
38 1 Julien Vaubourg
# Global TTNN parameters
39 1 Julien Vaubourg
WG_SRV_ADDR="h10.tetaneutral.net"
40 1 Julien Vaubourg
WG_SRV_PORT="51820"
41 1 Julien Vaubourg
WG_SRV_PUB_KEY="DsIeOCRs/5uYdi8rLiBzRNmN4zUzKCQRqY3Sbl8NS0A="
42 6 Julien Vaubourg
WG_ADH_ADDR6_LAN="${WG_ADH_NET6}1/64"
43 1 Julien Vaubourg
WG_ADH_ADDR4_WAN="${WG_ADH_ADDR4}/32"
44 1 Julien Vaubourg
WG_LOCAL_IF="wg0"
45 1 Julien Vaubourg
46 1 Julien Vaubourg
# Configure firewall
47 1 Julien Vaubourg
uci rename firewall.@zone[0]="lan"
48 1 Julien Vaubourg
uci rename firewall.@zone[1]="wan"
49 1 Julien Vaubourg
uci rename firewall.@forwarding[0]="lan_wan"
50 1 Julien Vaubourg
uci del_list firewall.wan.network="${WG_LOCAL_IF}"
51 1 Julien Vaubourg
uci add_list firewall.wan.network="${WG_LOCAL_IF}"
52 1 Julien Vaubourg
uci commit firewall
53 1 Julien Vaubourg
/etc/init.d/firewall restart
54 1 Julien Vaubourg
55 1 Julien Vaubourg
# Configure network
56 1 Julien Vaubourg
uci -q delete network.${WG_LOCAL_IF}
57 1 Julien Vaubourg
uci set network.${WG_LOCAL_IF}="interface"
58 1 Julien Vaubourg
uci set network.${WG_LOCAL_IF}.proto="wireguard"
59 1 Julien Vaubourg
uci set network.${WG_LOCAL_IF}.private_key="${WG_ADH_PRIV_KEY}"
60 1 Julien Vaubourg
uci del network.lan.ip6assign
61 1 Julien Vaubourg
uci add_list network.lan.ip6addr="${WG_ADH_ADDR6_LAN}"
62 1 Julien Vaubourg
uci add_list network.${WG_LOCAL_IF}.addresses="${WG_ADH_ADDR4_WAN}"
63 1 Julien Vaubourg
64 1 Julien Vaubourg
# Add TTNN VPN peer
65 1 Julien Vaubourg
uci -q delete network.wgserver
66 1 Julien Vaubourg
uci set network.wgserver="wireguard_${WG_LOCAL_IF}"
67 1 Julien Vaubourg
uci set network.wgserver.public_key="${WG_SRV_PUB_KEY}"
68 1 Julien Vaubourg
uci set network.wgserver.endpoint_host="${WG_SRV_ADDR}"
69 1 Julien Vaubourg
uci set network.wgserver.endpoint_port="${WG_SRV_PORT}"
70 1 Julien Vaubourg
uci set network.wgserver.route_allowed_ips="1"
71 1 Julien Vaubourg
uci set network.wgserver.persistent_keepalive="25"
72 1 Julien Vaubourg
uci add_list network.wgserver.allowed_ips="::/0"
73 1 Julien Vaubourg
uci add_list network.wgserver.allowed_ips="0.0.0.0/0"
74 1 Julien Vaubourg
75 1 Julien Vaubourg
# Preserve default route
76 11 Julien Vaubourg
uci set network.${WG_LOCAL_IF}.metric="10"
77 1 Julien Vaubourg
uci set network.wan6.metric="100"
78 8 Julien Vaubourg
uci set network.wan.metric="100"
79 1 Julien Vaubourg
uci commit network
80 1 Julien Vaubourg
81 9 Julien Vaubourg
# Add a hook to fix the clock before starting the VPN
82 8 Julien Vaubourg
cat <<EOF> /etc/hotplug.d/iface/30-ntpclient-before-vpn
83 8 Julien Vaubourg
#!/bin/sh
84 8 Julien Vaubourg
85 9 Julien Vaubourg
[ "\${INTERFACE}" = ${WG_LOCAL_IF} -a "\${ACTION}" = ifup ] || exit 0
86 8 Julien Vaubourg
87 13 Julien Vaubourg
default_gw6=\$(ip -6 route | grep 'default via' | awk '{ print \$3 }')
88 13 Julien Vaubourg
default_gw4=\$(ip -4 route | grep 'default via' | awk '{ print \$3 }')
89 1 Julien Vaubourg
90 15 Julien Vaubourg
if [ ! -z "\${default_gw6}" ]; then
91 15 Julien Vaubourg
  ip -6 route del default via "\${default_gw6}"
92 15 Julien Vaubourg
  ip -6 route add default via "\${default_gw6}" metric 0
93 15 Julien Vaubourg
fi
94 1 Julien Vaubourg
95 15 Julien Vaubourg
if [ ! -z "\${default_gw4}" ]; then
96 15 Julien Vaubourg
  ip -4 route del default via "\${default_gw4}"
97 15 Julien Vaubourg
  ip -4 route add default via "\${default_gw4}" metric 0
98 15 Julien Vaubourg
fi
99 15 Julien Vaubourg
100 1 Julien Vaubourg
ntpd -nqp 0.openwrt.pool.ntp.org 1.openwrt.pool.ntp.org 2.openwrt.pool.ntp.org 3.openwrt.pool.ntp.org
101 1 Julien Vaubourg
102 15 Julien Vaubourg
if [ ! -z "\${default_gw6}" ]; then
103 15 Julien Vaubourg
  ip -6 route del default via "\${default_gw6}"
104 15 Julien Vaubourg
  ip -6 route add default via "\${default_gw6}" metric 100
105 15 Julien Vaubourg
fi
106 15 Julien Vaubourg
107 15 Julien Vaubourg
if [ ! -z "\${default_gw4}" ]; then
108 15 Julien Vaubourg
  ip -4 route del default via "\${default_gw4}"
109 15 Julien Vaubourg
  ip -4 route add default via "\${default_gw4}" metric 100
110 15 Julien Vaubourg
fi
111 8 Julien Vaubourg
112 8 Julien Vaubourg
exit 0
113 1 Julien Vaubourg
EOF
114 1 Julien Vaubourg
115 1 Julien Vaubourg
# Restart the network and so mount the VPN
116 1 Julien Vaubourg
/etc/init.d/network restart
117 1 Julien Vaubourg
</pre>
118 1 Julien Vaubourg
119 1 Julien Vaubourg
h2. Tests
120 1 Julien Vaubourg
121 1 Julien Vaubourg
Se connecter en DHCP avec un Linux sur l'un des ports LAN du routeur.
122 1 Julien Vaubourg
123 1 Julien Vaubourg
Sur l'interface filaire du PC on devrait obtenir quelque chose qui ressemble à :
124 1 Julien Vaubourg
125 1 Julien Vaubourg
<pre>
126 1 Julien Vaubourg
# ip address
127 1 Julien Vaubourg
inet6 2001:db8:dead:be02:3e47:edd:f3cb:2e04/64 scope global dynamic mngtmpaddr
128 1 Julien Vaubourg
inet 192.168.1.201/24 brd 192.168.1.255 scope global dynamic enp0s25
129 1 Julien Vaubourg
130 1 Julien Vaubourg
# ip -6 route
131 1 Julien Vaubourg
default via fe80::4afe:7cde:fa1e:310b dev enp0s25 proto ra metric 1024 expires 1724sec hoplimit 64 pref medium
132 1 Julien Vaubourg
133 1 Julien Vaubourg
# ip -4 route
134 1 Julien Vaubourg
default via 192.168.1.1 dev enp0s25
135 1 Julien Vaubourg
</pre>
136 1 Julien Vaubourg
137 1 Julien Vaubourg
Les IP retournées par curl devraient ressembler à :
138 1 Julien Vaubourg
139 1 Julien Vaubourg
<pre>
140 1 Julien Vaubourg
# curl ip6.yunohost.org
141 1 Julien Vaubourg
2001:db8:dead:be02:3e47:edd:f3cb:2e04
142 1 Julien Vaubourg
143 1 Julien Vaubourg
# curl ip.yunohost.org
144 1 Julien Vaubourg
203.0.113.42
145 1 Julien Vaubourg
</pre>
146 6 Julien Vaubourg
147 1 Julien Vaubourg
h2. Notes sur IPv6
148 10 Julien Vaubourg
149 1 Julien Vaubourg
Avec cette configuration, le range IPv6 /56 fournit par Tetaneutral est réduit à un /64 pour satisfaire les pré-requis de l'autoconfiguration stateless (attribution des IP en fonction des adresses MAC).
150 1 Julien Vaubourg
151 1 Julien Vaubourg
Si vous souhaitez utiliser le range IPv6 pour faire des sous-réseaux, libre à vous d'ajouter des routes, par exemple avec les /64 restants :
152 10 Julien Vaubourg
153 6 Julien Vaubourg
<pre>
154 6 Julien Vaubourg
* 2001:db8:dead:be00::/56 -- range complet
155 1 Julien Vaubourg
  * 2001:db8:dead:be00::/64 -- sous-réseau utilisé pour l'interco du WAN (pourrait être réduit)
156 3 Julien Vaubourg
  * 2001:db8:dead:be01::/64 -- sous-réseau libre
157 2 Julien Vaubourg
    [...]
158 2 Julien Vaubourg
  * 2001:db8:dead:beff::/64 -- sous-réseau libre
159 1 Julien Vaubourg
</pre>
160 4 Julien Vaubourg
161 2 Julien Vaubourg
h2. Débits
162 4 Julien Vaubourg
163 2 Julien Vaubourg
Les tests de débit (genre avec _speedtest.net_) sont toujours un peu aléatoires, mais il n'est pas étonnant que le VPN écrase un peu les débits. Cependant, le CPU ne semble pas particulièrement sollicité durant le test...
164 2 Julien Vaubourg
165 2 Julien Vaubourg
Tests de débit avec un TP-Link Archer C7 :
166 1 Julien Vaubourg
167 1 Julien Vaubourg
* [Sans VPN] Down: 60 Mbps / Up: 40 Mbps
168 1 Julien Vaubourg
* [Avec VPN] Down: 25 Mbps / Up: 16 Mbps