Point d’accès WiFi à base de RaspberryPI

Cuba

Objet :

Configurer une carte RaspberryPI comme relais WiFi pour créer un accès isolé du réseau local. Ex : salle de cours, accès invités…

Prérequis :

Avoir une carte avec la configuration de base.

Méthode d’installation :

Renseigner le fichier de configuration config_var.sh :

WIFI_INTERFACE= »wlan0″
BR_INTERFACE= »br0″
WIRE_INTERFACE= »eth0″
AP_INTERFACE= »ap »

WIFI_COUNTRY= »FR »
WIFI_SSID= »leSSIDquiVaBien »
WIFI_PSK= »leCodeQuiVaBien »

GATEWAY= »10.44.4.1/24″
DNS= »192.168.0.254 1.1.1.1″

AP_SSID= »RaspiLocal »
AP_PSK= »LeCodeLocal »
AP_COUNTRY= »FR »
AP_CHANNEL=11

Exécuter le script config_net_ap_wire.sh :

!/bin/bash
#https://raspberrypi.stackexchange.com/questions/108592/use-systemd-networkd-for-general-networking
#
#https://raspberrypi.stackexchange.com/questions/89803/access-point-as-wifi-router-repeater-optional-with-bridge
#
#À valider
#

CMD_DIR=$(dirname $0)
source ${CMD_DIR}/config_var.sh

#deinstall classic networking

apt –autoremove purge ifupdown dhcpcd5 isc-dhcp-client isc-dhcp-common rsyslog
apt-mark hold ifupdown dhcpcd5 isc-dhcp-client isc-dhcp-common rsyslog raspberrypi-net-mods openresolv
rm -r /etc/network /etc/dhcp

#setup/enable systemd-resolved and systemd-networkd

apt –autoremove purge avahi-daemon
apt-mark hold avahi-daemon libnss-mdns
apt install libnss-resolve
ln -sf /run/systemd/resolve/stub-resolv.conf /etc/resolv.conf
systemctl enable systemd-networkd.service systemd-resolved.service

sed -i ‘s/#DNSSEC=.$/DNSSEC=no/’ /etc/systemd/resolved.conf

cat > /etc/wpa_supplicant/wpa_supplicant-${WIFI_INTERFACE}.conf <<EOF
country=${WIFI_COUNTRY}
ctrl_interface=DIR=/run/wpa_supplicant GROUP=netdev
update_config=1
p2p_disabled=1

network={
ssid= »${WIFI_SSID} »
psk= »${WIFI_PSK} »
}
EOF

chmod 600 /etc/wpa_supplicant/wpa_supplicant-${WIFI_INTERFACE}.conf
systemctl disable wpa_supplicant.service
systemctl enable wpa_supplicant@${WIFI_INTERFACE}.service
rfkill unblock wlan

apt install hostapd

cat > /etc/hostapd/hostapd.conf <<EOF
driver=nl80211
ssid=${AP_SSID}
country_code=${AP_COUNTRY}
hw_mode=g
channel=${AP_CHANNEL}
auth_algs=1
wpa=2
wpa_passphrase=${AP_PSK}
wpa_key_mgmt=WPA-PSK
wpa_pairwise=TKIP
rsn_pairwise=CCMP
bridge=${BR_INTERFACE}
EOF

chmod 600 /etc/hostapd/hostapd.conf

#accesspoint@

echo # Texte à copier … :

cat <<EOF

[Unit]
Description=accesspoint with hostapd (interface-specific version)
Wants=wpa_supplicant@%i.service

[Service]
ExecStartPre=/sbin/iw dev %i interface add ${AP_INTERFACE}@%i type __ap
ExecStart=/usr/sbin/hostapd -i ${AP_INTERFACE}@%i /etc/hostapd/hostapd.conf
ExecStopPost=-/sbin/iw dev ${AP_INTERFACE}@%i del

[Install]
WantedBy=sys-subsystem-net-devices-%i.device
EOF

read -p « Copier le contenu précédent pour le coller dans la commande suivante … »

systemctl edit –force –full accesspoint@.service

read -p  » Valider … »

systemctl enable accesspoint@${WIFI_INTERFACE}.service
rfkill unblock wlan

cat >/etc/wpa_supplicant/wpa_supplicant-${WIFI_INTERFACE}.conf <<EOF
country=${WIFI_COUNTRY}
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
p2p_disabled=1

network={
ssid= »${WIFI_SSID} »
psk= »${WIFI_PSK} »
#key_mgmt= »WPA-PSK » # see ref (4)
}
EOF

chmod 600 /etc/wpa_supplicant/wpa_supplicant-${WIFI_INTERFACE}.conf
systemctl disable wpa_supplicant.service

#wpa_supplicant@

echo # Texte à copier … :
cat <<EOF

[Unit]
BindsTo=accesspoint@%i.service
After=accesspoint@%i.service

[Service]
ExecStartPost=/lib/systemd/systemd-networkd-wait-online –interface=%i –timeout=60 –quiet
ExecStartPost=/bin/ip link set ap@%i up
ExecStopPost=-/bin/ip link set ap@%i up
EOF

read -p « Copier le contenu précédent pour le coller dans la commande suivante … »

systemctl edit wpa_supplicant@${WIFI_INTERFACE}.service

read -p  » Valider … « 

cat > /etc/systemd/network/08-wifi.network <<EOF
[Match]
Name=wl*
[Network]
LLMNR=no
MulticastDNS=yes
DHCP=yes
EOF

cat > /etc/systemd/network/02-${BR_INTERFACE}.netdev <<EOF
[NetDev]
Name=${BR_INTERFACE}
Kind=bridge
EOF

cat > /etc/systemd/network/04-${WIRE_INTERFACE}.network <<EOF
[Match]
Name=${WIRE_INTERFACE}
[Network]
Bridge=${BR_INTERFACE}
EOF

cat > /etc/systemd/network/16-${BR_INTERFACE}_up.network <<EOF
[Match]
Name=${BR_INTERFACE}
[Network]
LLMNR=no
MulticastDNS=yes
IPMasquerade=yes
Address=${GATEWAY}
DHCPServer=yes
[DHCPServer]
DNS=${DNS}
EOF

echo « Tout doit être prêt, il faut redémarrer !!! »