VPN Client OpenWrt » Historique » Version 14
Julien Vaubourg, 30/08/2020 00:21
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 | 13 | Julien Vaubourg | ip -6 route del default via "\${default_gw6}" |
91 | 13 | Julien Vaubourg | ip -6 route add default via "\${default_gw6}" metric 0 |
92 | 13 | Julien Vaubourg | ip -4 route del default via "\${default_gw4}" |
93 | 13 | Julien Vaubourg | ip -4 route add default via "\${default_gw4}" metric 0 |
94 | 1 | Julien Vaubourg | |
95 | 14 | Julien Vaubourg | ntpd -nqp 0.openwrt.pool.ntp.org 1.openwrt.pool.ntp.org 2.openwrt.pool.ntp.org 3.openwrt.pool.ntp.org |
96 | 12 | Julien Vaubourg | |
97 | 13 | Julien Vaubourg | ip -6 route del default via "\${default_gw6}" |
98 | 13 | Julien Vaubourg | ip -6 route add default via "\${default_gw6}" metric 100 |
99 | 13 | Julien Vaubourg | ip -4 route del default via "\${default_gw4}" |
100 | 13 | Julien Vaubourg | ip -4 route add default via "\${default_gw4}" metric 100 |
101 | 8 | Julien Vaubourg | |
102 | 8 | Julien Vaubourg | exit 0 |
103 | 8 | Julien Vaubourg | EOF |
104 | 8 | Julien Vaubourg | |
105 | 1 | Julien Vaubourg | # Restart the network and so mount the VPN |
106 | 1 | Julien Vaubourg | /etc/init.d/network restart |
107 | 1 | Julien Vaubourg | </pre> |
108 | 1 | Julien Vaubourg | |
109 | 1 | Julien Vaubourg | h2. Tests |
110 | 1 | Julien Vaubourg | |
111 | 1 | Julien Vaubourg | Se connecter en DHCP avec un Linux sur l'un des ports LAN du routeur. |
112 | 1 | Julien Vaubourg | |
113 | 1 | Julien Vaubourg | Sur l'interface filaire du PC on devrait obtenir quelque chose qui ressemble à : |
114 | 1 | Julien Vaubourg | |
115 | 1 | Julien Vaubourg | <pre> |
116 | 1 | Julien Vaubourg | # ip address |
117 | 1 | Julien Vaubourg | inet6 2001:db8:dead:be02:3e47:edd:f3cb:2e04/64 scope global dynamic mngtmpaddr |
118 | 1 | Julien Vaubourg | inet 192.168.1.201/24 brd 192.168.1.255 scope global dynamic enp0s25 |
119 | 1 | Julien Vaubourg | |
120 | 1 | Julien Vaubourg | # ip -6 route |
121 | 1 | Julien Vaubourg | default via fe80::4afe:7cde:fa1e:310b dev enp0s25 proto ra metric 1024 expires 1724sec hoplimit 64 pref medium |
122 | 1 | Julien Vaubourg | |
123 | 1 | Julien Vaubourg | # ip -4 route |
124 | 1 | Julien Vaubourg | default via 192.168.1.1 dev enp0s25 |
125 | 1 | Julien Vaubourg | </pre> |
126 | 1 | Julien Vaubourg | |
127 | 1 | Julien Vaubourg | Les IP retournées par curl devraient ressembler à : |
128 | 1 | Julien Vaubourg | |
129 | 1 | Julien Vaubourg | <pre> |
130 | 1 | Julien Vaubourg | # curl ip6.yunohost.org |
131 | 1 | Julien Vaubourg | 2001:db8:dead:be02:3e47:edd:f3cb:2e04 |
132 | 1 | Julien Vaubourg | |
133 | 1 | Julien Vaubourg | # curl ip.yunohost.org |
134 | 1 | Julien Vaubourg | 203.0.113.42 |
135 | 1 | Julien Vaubourg | </pre> |
136 | 1 | Julien Vaubourg | |
137 | 1 | Julien Vaubourg | h2. Notes sur IPv6 |
138 | 6 | Julien Vaubourg | |
139 | 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). |
140 | 10 | Julien Vaubourg | |
141 | 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 : |
142 | 1 | Julien Vaubourg | |
143 | 1 | Julien Vaubourg | <pre> |
144 | 10 | Julien Vaubourg | * 2001:db8:dead:be00::/56 -- range complet |
145 | 6 | Julien Vaubourg | * 2001:db8:dead:be00::/64 -- sous-réseau utilisé pour l'interco du WAN (pourrait être réduit) |
146 | 6 | Julien Vaubourg | * 2001:db8:dead:be01::/64 -- sous-réseau libre |
147 | 1 | Julien Vaubourg | [...] |
148 | 3 | Julien Vaubourg | * 2001:db8:dead:beff::/64 -- sous-réseau libre |
149 | 2 | Julien Vaubourg | </pre> |
150 | 2 | Julien Vaubourg | |
151 | 1 | Julien Vaubourg | h2. Débits |
152 | 4 | Julien Vaubourg | |
153 | 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... |
154 | 4 | Julien Vaubourg | |
155 | 2 | Julien Vaubourg | Tests de débit avec un TP-Link Archer C7 : |
156 | 2 | Julien Vaubourg | |
157 | 2 | Julien Vaubourg | * [Sans VPN] Down: 60 Mbps / Up: 40 Mbps |
158 | 1 | Julien Vaubourg | * [Avec VPN] Down: 25 Mbps / Up: 16 Mbps |