VPN Client OpenWrt » Historique » Version 10
Version 9 (Julien Vaubourg, 29/08/2020 23:01) → Version 10/16 (Julien Vaubourg, 29/08/2020 23:22)
h1. VPN Client OpenWrt
h2. Introduction
Le routeur doit être assez puissant pour supporter les opérations de chiffrement de Wireguard (eg. TP-Link Archer C7).
Il doit avoir été préalablement flashé en OpenWrt.
Doc testée avec OpenWrt 19.07.3.
h2. Exemple de configuration
On suppose que votre service Wireguard a été configuré comme suit côté Tetaneutral :
* Réseau IPv6: <pre>2001:db8:dead:be00::/56</pre>
* Adresse IPv4: <pre>203.0.113.42/32</pre>
* Clé privée Wireguard: <pre>XF4wYSh/Ox9CoPl/YvFECu1DH6FQy7fLNUnur4sv9nM=</pre>
h2. Variables et commandes à copier-coller
Se connecter en SSH au routeur pour obtenir un terminal sur OpenWrt.
Variables *à personnaliser* puis copier-coller dans le terminal du OpenWrt :
<pre>
WG_ADH_NET6="2001:db8:dead:be00::"
WG_ADH_ADDR4="203.0.113.42"
WG_ADH_PRIV_KEY="XF4wYSh/Ox9CoPl/YvFECu1DH6FQy7fLNUnur4sv9nM="
</pre>
Variables et commandes à copier-coller ensuite *telles quelles* dans le terminal du OpenWrt (sauf expert·e) :
<pre>
# Install wireguard
opkg update
opkg install wireguard luci-proto-wireguard
# Global TTNN parameters
WG_SRV_ADDR="h10.tetaneutral.net"
WG_SRV_PORT="51820"
WG_SRV_PUB_KEY="DsIeOCRs/5uYdi8rLiBzRNmN4zUzKCQRqY3Sbl8NS0A="
WG_ADH_ADDR6_LAN="${WG_ADH_NET6}1/64"
WG_ADH_ADDR4_WAN="${WG_ADH_ADDR4}/32"
WG_LOCAL_IF="wg0"
# Configure firewall
uci rename firewall.@zone[0]="lan"
uci rename firewall.@zone[1]="wan"
uci rename firewall.@forwarding[0]="lan_wan"
uci del_list firewall.wan.network="${WG_LOCAL_IF}"
uci add_list firewall.wan.network="${WG_LOCAL_IF}"
uci commit firewall
/etc/init.d/firewall restart
# Configure network
uci -q delete network.${WG_LOCAL_IF}
uci set network.${WG_LOCAL_IF}="interface"
uci set network.${WG_LOCAL_IF}.proto="wireguard"
uci set network.${WG_LOCAL_IF}.private_key="${WG_ADH_PRIV_KEY}"
uci del network.lan.ip6assign
uci add_list network.lan.ip6addr="${WG_ADH_ADDR6_LAN}"
uci add_list network.${WG_LOCAL_IF}.addresses="${WG_ADH_ADDR4_WAN}"
# Add TTNN VPN peer
uci -q delete network.wgserver
uci set network.wgserver="wireguard_${WG_LOCAL_IF}"
uci set network.wgserver.public_key="${WG_SRV_PUB_KEY}"
uci set network.wgserver.endpoint_host="${WG_SRV_ADDR}"
uci set network.wgserver.endpoint_port="${WG_SRV_PORT}"
uci set network.wgserver.route_allowed_ips="1"
uci set network.wgserver.persistent_keepalive="25"
uci add_list network.wgserver.allowed_ips="::/0"
uci add_list network.wgserver.allowed_ips="0.0.0.0/0"
# Preserve default route
uci set network.wg0.metric="10"
uci set network.wan6.metric="100"
uci set network.wan.metric="100"
uci commit network
# Add a hook to fix the clock before starting the VPN
cat <<EOF> /etc/hotplug.d/iface/30-ntpclient-before-vpn
#!/bin/sh
[ "\${INTERFACE}" = ${WG_LOCAL_IF} -a "\${ACTION}" = ifup ] || exit 0
default_gw=\$(ip route | grep 'default via' | awk '{ print \$3 }')
ip route del default via "\${default_gw}"
ip route add default via "\${default_gw}" metric 0
ntpd -nqp 0.openwrt.pool.ntp.org 1.openwrt.pool.ntp.org 2.openwrt.pool.ntp.org 3.openwrt.pool.ntp.org
ip route del default via "\${default_gw}"
ip route add default via "\${default_gw}" metric 100
exit 0
EOF
# Restart the network and so mount the VPN
/etc/init.d/network restart
</pre>
h2. Tests
Se connecter en DHCP avec un Linux sur l'un des ports LAN du routeur.
Sur l'interface filaire du PC on devrait obtenir quelque chose qui ressemble à :
<pre>
# ip address
inet6 2001:db8:dead:be02:3e47:edd:f3cb:2e04/64 scope global dynamic mngtmpaddr
inet 192.168.1.201/24 brd 192.168.1.255 scope global dynamic enp0s25
# ip -6 route
default via fe80::4afe:7cde:fa1e:310b dev enp0s25 proto ra metric 1024 expires 1724sec hoplimit 64 pref medium
# ip -4 route
default via 192.168.1.1 dev enp0s25
</pre>
Les IP retournées par curl devraient ressembler à :
<pre>
# curl ip6.yunohost.org
2001:db8:dead:be02:3e47:edd:f3cb:2e04
# curl ip.yunohost.org
203.0.113.42
</pre>
h2. Notes sur IPv6
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).
Si vous souhaitez utiliser le range IPv6 pour faire des sous-réseaux, libre à vous d'ajouter des routes, routes en utilisant ses sous-réseaux, par exemple avec les /64 restants :
<pre>
* 2001:db8:dead:be00::/56 -- range complet
* 2001:db8:dead:be00::/64 -- sous-réseau utilisé pour l'interco du WAN (pourrait être lui-même réduit)
* 2001:db8:dead:be01::/64 -- sous-réseau libre
[...]
* 2001:db8:dead:beff::/64 -- sous-réseau libre
</pre>
h2. Débits
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...
Tests de débit avec un TP-Link Archer C7 :
* [Sans VPN] Down: 60 Mbps / Up: 40 Mbps
* [Avec VPN] Down: 25 Mbps / Up: 16 Mbps
h2. Introduction
Le routeur doit être assez puissant pour supporter les opérations de chiffrement de Wireguard (eg. TP-Link Archer C7).
Il doit avoir été préalablement flashé en OpenWrt.
Doc testée avec OpenWrt 19.07.3.
h2. Exemple de configuration
On suppose que votre service Wireguard a été configuré comme suit côté Tetaneutral :
* Réseau IPv6: <pre>2001:db8:dead:be00::/56</pre>
* Adresse IPv4: <pre>203.0.113.42/32</pre>
* Clé privée Wireguard: <pre>XF4wYSh/Ox9CoPl/YvFECu1DH6FQy7fLNUnur4sv9nM=</pre>
h2. Variables et commandes à copier-coller
Se connecter en SSH au routeur pour obtenir un terminal sur OpenWrt.
Variables *à personnaliser* puis copier-coller dans le terminal du OpenWrt :
<pre>
WG_ADH_NET6="2001:db8:dead:be00::"
WG_ADH_ADDR4="203.0.113.42"
WG_ADH_PRIV_KEY="XF4wYSh/Ox9CoPl/YvFECu1DH6FQy7fLNUnur4sv9nM="
</pre>
Variables et commandes à copier-coller ensuite *telles quelles* dans le terminal du OpenWrt (sauf expert·e) :
<pre>
# Install wireguard
opkg update
opkg install wireguard luci-proto-wireguard
# Global TTNN parameters
WG_SRV_ADDR="h10.tetaneutral.net"
WG_SRV_PORT="51820"
WG_SRV_PUB_KEY="DsIeOCRs/5uYdi8rLiBzRNmN4zUzKCQRqY3Sbl8NS0A="
WG_ADH_ADDR6_LAN="${WG_ADH_NET6}1/64"
WG_ADH_ADDR4_WAN="${WG_ADH_ADDR4}/32"
WG_LOCAL_IF="wg0"
# Configure firewall
uci rename firewall.@zone[0]="lan"
uci rename firewall.@zone[1]="wan"
uci rename firewall.@forwarding[0]="lan_wan"
uci del_list firewall.wan.network="${WG_LOCAL_IF}"
uci add_list firewall.wan.network="${WG_LOCAL_IF}"
uci commit firewall
/etc/init.d/firewall restart
# Configure network
uci -q delete network.${WG_LOCAL_IF}
uci set network.${WG_LOCAL_IF}="interface"
uci set network.${WG_LOCAL_IF}.proto="wireguard"
uci set network.${WG_LOCAL_IF}.private_key="${WG_ADH_PRIV_KEY}"
uci del network.lan.ip6assign
uci add_list network.lan.ip6addr="${WG_ADH_ADDR6_LAN}"
uci add_list network.${WG_LOCAL_IF}.addresses="${WG_ADH_ADDR4_WAN}"
# Add TTNN VPN peer
uci -q delete network.wgserver
uci set network.wgserver="wireguard_${WG_LOCAL_IF}"
uci set network.wgserver.public_key="${WG_SRV_PUB_KEY}"
uci set network.wgserver.endpoint_host="${WG_SRV_ADDR}"
uci set network.wgserver.endpoint_port="${WG_SRV_PORT}"
uci set network.wgserver.route_allowed_ips="1"
uci set network.wgserver.persistent_keepalive="25"
uci add_list network.wgserver.allowed_ips="::/0"
uci add_list network.wgserver.allowed_ips="0.0.0.0/0"
# Preserve default route
uci set network.wg0.metric="10"
uci set network.wan6.metric="100"
uci set network.wan.metric="100"
uci commit network
# Add a hook to fix the clock before starting the VPN
cat <<EOF> /etc/hotplug.d/iface/30-ntpclient-before-vpn
#!/bin/sh
[ "\${INTERFACE}" = ${WG_LOCAL_IF} -a "\${ACTION}" = ifup ] || exit 0
default_gw=\$(ip route | grep 'default via' | awk '{ print \$3 }')
ip route del default via "\${default_gw}"
ip route add default via "\${default_gw}" metric 0
ntpd -nqp 0.openwrt.pool.ntp.org 1.openwrt.pool.ntp.org 2.openwrt.pool.ntp.org 3.openwrt.pool.ntp.org
ip route del default via "\${default_gw}"
ip route add default via "\${default_gw}" metric 100
exit 0
EOF
# Restart the network and so mount the VPN
/etc/init.d/network restart
</pre>
h2. Tests
Se connecter en DHCP avec un Linux sur l'un des ports LAN du routeur.
Sur l'interface filaire du PC on devrait obtenir quelque chose qui ressemble à :
<pre>
# ip address
inet6 2001:db8:dead:be02:3e47:edd:f3cb:2e04/64 scope global dynamic mngtmpaddr
inet 192.168.1.201/24 brd 192.168.1.255 scope global dynamic enp0s25
# ip -6 route
default via fe80::4afe:7cde:fa1e:310b dev enp0s25 proto ra metric 1024 expires 1724sec hoplimit 64 pref medium
# ip -4 route
default via 192.168.1.1 dev enp0s25
</pre>
Les IP retournées par curl devraient ressembler à :
<pre>
# curl ip6.yunohost.org
2001:db8:dead:be02:3e47:edd:f3cb:2e04
# curl ip.yunohost.org
203.0.113.42
</pre>
h2. Notes sur IPv6
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).
Si vous souhaitez utiliser le range IPv6 pour faire des sous-réseaux, libre à vous d'ajouter des routes, routes en utilisant ses sous-réseaux, par exemple avec les /64 restants :
<pre>
* 2001:db8:dead:be00::/56 -- range complet
* 2001:db8:dead:be00::/64 -- sous-réseau utilisé pour l'interco du WAN (pourrait être lui-même réduit)
* 2001:db8:dead:be01::/64 -- sous-réseau libre
[...]
* 2001:db8:dead:beff::/64 -- sous-réseau libre
</pre>
h2. Débits
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...
Tests de débit avec un TP-Link Archer C7 :
* [Sans VPN] Down: 60 Mbps / Up: 40 Mbps
* [Avec VPN] Down: 25 Mbps / Up: 16 Mbps