Hotspot wifi

From Le Wiki de debian-fr.xyz
Jump to navigation Jump to search

Sur cette page vous trouverez un script Bash qui vous permettra :

  • de tester rapidement si votre interface sans fil est compatible avec le mode "Master" (via le logiciel hostapd) sous GNU/Linux. (Complétez le tableau en bas de page!)
  • de mettre en place rapidement un point d'accès sans fil d'appoint.


Le matériel requis

Un ordinateur (portable ou fixe) équipé :

  • de votre distribution Debian favorite,
  • d'une interface réseau filaire,
  • et d'une interface réseau sans fil (interne ou usb) supportée par le noyau Linux.


Utilisation du script

1. Copiez/collez le script dans un fichier "hotspot2014.sh" (par exemple) que vous enregistrez dans votre répertoire personnel

2. Ajustez les variables : WLAN (si besoin), SSID, CHANNEL, PASSPHRASE (au minimum)

3. Donnez-lui les droits d'éxécution. Dans un shell : chmod +x hotspot2014.sh

4. Ce script doit être lancé avec les droits superutilisateur (root) su ./hotspot2014.sh


Le script propose deux modes de fonctionnement :

  • le mode "dnsmasq/iptables" : un serveur DNS et DHCP local est créé, les paquets réseau transitent entre les deux interfaces réseau via les règles du pare-feu. Avantage : permet de logguer le trafic DHCP et DNS (très instructif!) et de filtrer les flux réseau.

Note : par défaut seuls les ports 80 (HTTP) et 443 (HTTPS) sont autorisés par le point d'accès. Si besoin d'autoriser d'autres protocoles, ajouter les règles iptables à la suite.

Pour avoir ce mode de fonctionnement il suffit de commenter la ligne #BRIDGE="bridge=$MY_BRIDGE" (ce qui est fait par défaut)

ou

  • le mode "bridge" (pont réseau) entre l'interface filaire et l'interface sans fil. Aucun filtrage de paquets, pas de logging DHCP et DNS.

Pour avoir ce mode de fonctionnement il suffit de décommenter la ligne BRIDGE="bridge=$MY_BRIDGE"


Une dernière chose :

  • Cela fonctionne pour vous? N'hésitez pas à remplir le tableau de compatibilité en fin de page. Merci!
  • Cela ne fonctionne pas? N'hésitez pas à ré-essayer avec :
 * un noyau plus récent (celui des dépôts backports par exemple)
 * une version plus récente de hostapd (ne devrait pas poser trop de problèmes à compiler soi-même)


Notes

  • Le script est pour le moment commenté dans la langue de Shakespeare mais pourra être traduit si besoin!
  • N'hésitez pas à le corriger si vous trouvez un bug!


  1 #!/bin/bash
  2 #
  3 # hotspot2014.sh
  4 #
  5 # Wireless Access Point (SoftAP)
  6 #
  7 # by AgentSteel for Debian-fr.org
  8 # 24/Apr/2014
  9 #
 10 # USE AT YOUR OWN RISK!
 11 #
 12 # Tested on Debian Wheezy (7.0)
 13 #
 14 # Two modes of operation :
 15 #  - with a network bridge (see BRIDGE variable) for transparent connection sharing (no DNS logging...)
 16 #   or
 17 #  - with dnsmasq and iptables for packet forwarding between network interfaces (DNS logging)
 18 #
 19 # Run this script as root.
 20 # This script will likely stop currently running network connections.
 21 # You may also need to disable your local firewall.
 22 #
 23 # Required : dhclient, hostapd, firmware-realtek (non-free)
 24 # Optional : bridge-utils, dnsmasq
 25 
 26 # Adjust your settings here
 27 WLAN="wlan0"
 28 
 29 # the IP address of your SoftAP interface (if using dnsmasq)
 30 # and the corresponding IP range for your SoftAP clients (if using dnsmasq)
 31 WLAN_IP="192.168.9.50"
 32 DHCP_RANGE="192.168.9.51,192.168.9.60"
 33 
 34 # your SoftAP SSID, channel and passphrase
 35 SSID="alfa_test"
 36 CHANNEL=3
 37 PASSPHRASE="changeme99"
 38 
 39 # Set your desired bridge interface name here
 40 MY_BRIDGE="ap-br0"
 41 # and the other network interface for bridge
 42 IF_BRIDGE="eth0"
 43 
 44 # Uncomment to use bridging, or comment to use dnsmasq/iptables
 45 #BRIDGE="bridge=$MY_BRIDGE"
 46 
 47 # (input) network interface when using dnsmasq/iptables
 48 IF_IN="eth0"
 49 
 50 # Set to "-d" for hostapd debugging output
 51 # or "-B" (background mode) for default operation
 52 HOSTAPD_OPT="-B"
 53 
 54 # global exit code for script (0 = no error)
 55 ret=0
 56 
 57 # function : check for required software
 58 function checklist()
 59 {
 60  local ret=0
 61  # check if running as root
 62  [[ $EUID -ne 0 ]] && { echo "You must be root to run this script!"; ret=1; }
 63  if [[ -n "$BRIDGE" ]]; then
 64   # when using a bridge, ensure brctl is found
 65   hash brctl >/dev/null 2>&1 || { echo "brctl not found, please install bridge-utils package."; ret=1; }
 66  else
 67   # not using a bridge, we need dnsmasq and iptables
 68   hash dnsmasq >/dev/null 2>&1 || { echo "dnsmasq not found, please install dnsmasq package."; ret=1; }
 69   hash iptables >/dev/null 2>&1 || { echo "iptables not found, please install iptables package."; ret=1; }
 70  fi
 71  hash hostapd >/dev/null 2>&1 || { echo "hostapd not found, please install hostapd package."; ret=1; }
 72  return $ret
 73 }
 74 
 75 # function : cleanup the mess when exiting
 76 function cleanup()
 77 {
 78  # clean up a bit (the dirty way!)
 79  sysctl net.ipv4.ip_forward=0
 80  iptables-restore <iptables.save && echo "iptables rules restored."
 81  killall hostapd >/dev/null 2>&1 && echo "hostapd killed."
 82  [[ -f "$TMP_CONF" ]] && rm "$TMP_CONF"
 83  killall dnsmasq >/dev/null 2>&1 && echo "dnsmasq killed."
 84  killall dhclient >/dev/null 2>&1 && echo "dhclient killed."
 85  ifconfig "$MY_BRIDGE" down >/dev/null 2>&1
 86  sleep 2
 87  brctl delif "$MY_BRIDGE" "$IF_BRIDGE" >/dev/null 2>&1
 88  brctl delif "$MY_BRIDGE" "$WLAN" >/dev/null 2>&1
 89  brctl delbr "$MY_BRIDGE" >/dev/null 2>&1 && echo "bridge $MY_BRIDGE destroyed."
 90 }
 91 
 92 # Main program
 93 
 94 # check for requirements, abort eventually
 95 checklist || exit 1
 96 
 97 # trap for cleanup
 98 trap cleanup SIGINT SIGTERM
 99 
100 # First, disable any network management software
101 echo -n ">>> Trying to disable any network management software... "
102 service network-manager stop >/dev/null 2>&1
103 service wicd stop >/dev/null 2>&1
104 echo "OK."
105 
106 # If not using a bridge, start dnsmasq (dns and dhcp) server
107 if [[ -z "$BRIDGE" ]]; then
108  killall dnsmasq >/dev/null 2>&1
109  # TODO : additional hosts file
110  dnsmasq --interface "$WLAN" --dhcp-range="$DHCP_RANGE" --log-queries || { echo "dnsmasq failed to start!"; exit 1; }
111  # assign IP to the wireless interface
112  ifconfig "$WLAN" "$WLAN_IP"
113 
114  # now you could start a webserver to share some files (eg. gatling lightweight www server)
115  # and allow your SoftAP clients to go to http://$WLAN_IP/
116 
117  # save current firewall rules
118  iptables-save >iptables.save && echo ">>> Current firewall configuration saved."
119  # reset firewall rules
120  iptables -F; iptables -X; iptables -P INPUT DROP; iptables -P OUTPUT ACCEPT; iptables -P FORWARD DROP
121  # allow loopback
122  iptables -A INPUT -i lo -j ACCEPT; iptables -A OUTPUT -o lo -j ACCEPT
123  # allow already established connections on eth0 (useful for SSH)
124  iptables -A INPUT -i $IF_IN -m state --state RELATED,ESTABLISHED -j ACCEPT
125  # Allow ping on $IF_IN
126  iptables -A INPUT -i $IF_IN -p icmp -m icmp --icmp-type 8 -j ACCEPT
127  # allow SSH in, on $IF_IN only
128  #iptables -A INPUT -i $IF_IN -p tcp -m tcp --dport 22 -j ACCEPT
129  # allow HTTP in, on $IF_IN only (hotspot's web server)
130  #iptables -A INPUT -i $IF_IN -p tcp -m tcp --dport 80 -j ACCEPT
131  # allow DNS in, on $WLAN
132  iptables -A INPUT -i $WLAN -p udp -m udp --dport 53 -j ACCEPT
133  # allow DHCP in, on $WLAN
134  iptables -A INPUT -i $WLAN -p udp -m udp --dport 67 -j ACCEPT
135  # packet forwarding
136  sysctl net.ipv4.ip_forward=1
137  iptables -t nat -A POSTROUTING -o $IF_IN -j MASQUERADE
138  iptables -A FORWARD -i $IF_IN -o $WLAN -m state --state RELATED,ESTABLISHED -j ACCEPT
139  # allow HTTP and HTTPS to be forwarded
140  iptables -A FORWARD -i $WLAN -o $IF_IN -p tcp -m tcp --dport 80 -j ACCEPT
141  iptables -A FORWARD -i $WLAN -o $IF_IN -p tcp -m tcp --dport 443 -j ACCEPT
142  #iptables -A FORWARD -i $WLAN -o $IF_IN -p tcp -m tcp --dport 8080 -j ACCEPT
143  # uncomment below to allow SSH to be forwarded
144  #iptables -A FORWARD -i $WLAN -o $IF_IN -p tcp -m tcp --dport 22 -j ACCEPT
145 
146  # (everything else will be forbidden)
147 
148 else
149  # we create a new network bridge to share network (and internet) access
150  brctl addbr "$MY_BRIDGE"
151  brctl addif "$MY_BRIDGE" "$IF_BRIDGE"
152  # $WLAN interface will be added later to the bridge
153 fi
154 
155 # create a temporary file with our hostapd conf
156 # (adapted from Realtek's examples)
157 # (see proprietary driver package from Realtek's website)
158 TMP_CONF=$(mktemp)
159 if [[ -z "$TMP_CONF" ]]; then
160  echo "Error creating hostapd temporary configuration file!"
161  ret=1
162 else
163  # read-only for root
164  chmod 600 "$TMP_CONF"
165  cat >"$TMP_CONF" <<EOF
166 # hostapd configuration starts here
167 ctrl_interface=/var/run/hostapd
168 ctrl_interface_group=0
169 interface=$WLAN
170 $BRIDGE
171 ssid=$SSID
172 channel=$CHANNEL
173 beacon_int=100
174 # (hardware limit for some wireless chipsets)
175 max_num_sta=8
176 hw_mode=g
177 # we use 802.11n (wifi N)
178 ieee80211n=1
179 wme_enabled=1
180 ht_capab=[SHORT-GI-20][SHORT-GI-40][HT40+]
181 # We use WPA2 of course
182 wpa=2
183 wpa_passphrase=$PASSPHRASE
184 wpa_key_mgmt=WPA-PSK
185 # Note: TKIP not supported with RTL8188RU chip!
186 wpa_pairwise=CCMP
187 wpa_group_rekey=86400
188 # other settings
189 logger_syslog=-1
190 logger_syslog_level=2
191 logger_stdout=-1
192 logger_stdout_level=2
193 #dump_file=/tmp/hostapd.dump
194 dtim_period=2
195 rts_threshold=2347
196 fragm_threshold=2346
197 macaddr_acl=0
198 auth_algs=3
199 ignore_broadcast_ssid=0
200 wmm_enabled=1
201 wmm_ac_bk_cwmin=4
202 wmm_ac_bk_cwmax=10
203 wmm_ac_bk_aifs=7
204 wmm_ac_bk_txop_limit=0
205 wmm_ac_bk_acm=0
206 wmm_ac_be_aifs=3
207 wmm_ac_be_cwmin=4
208 wmm_ac_be_cwmax=10
209 wmm_ac_be_txop_limit=0
210 wmm_ac_be_acm=0
211 wmm_ac_vi_aifs=2
212 wmm_ac_vi_cwmin=3
213 wmm_ac_vi_cwmax=4
214 wmm_ac_vi_txop_limit=94
215 wmm_ac_vi_acm=0
216 wmm_ac_vo_aifs=2
217 wmm_ac_vo_cwmin=2
218 wmm_ac_vo_cwmax=3
219 wmm_ac_vo_txop_limit=47
220 wmm_ac_vo_acm=0
221 eapol_key_index_workaround=0
222 eap_server=0
223 own_ip_addr=127.0.0.1
224 EOF
225 
226  echo ">>> Starting hostapd."
227  # start hostapd
228  if ! hostapd $HOSTAPD_OPT "$TMP_CONF"; then
229   echo "hostapd failed to start."
230   ret=1
231  else
232   # finally get an IP address for the bridge, only when using a bridge (assume we have a dhcp server in our LAN)
233   [[ -n "$BRIDGE" ]] && dhclient "$MY_BRIDGE" && echo ">>> Network bridge $MY_BRIDGE is up."
234   # TODO : handle dhclient failure
235   [[ -z "$BRIDGE" ]] && echo ">>> Using dnsmasq and iptables."
236 
237   iwconfig $WLAN
238   echo ">>> SoftAP is up and running!            SSID = $SSID"
239   echo ">>> Hit ctrl-c to stop."
240   # display syslog to see what happens
241   tail -f /var/log/syslog
242  fi
243 fi
244 
245 cleanup
246 echo -e "\n>>> SoftAP terminated!"
247 exit $ret


Tableau de compatibilité des adaptateurs sans fil

Concerne uniquement le fonctionnement en mode "Master" (appelé aussi "Access Point", point d'accès) avec Hostapd!

Merci de renseigner tous les champs!

Adaptateurs testés
Marque Modèle exact (préciser interne ou usb) Constructeur PCI ID (lspci -n ou lsusb) Puce Module noyau (lsmod) Version Debian Version noyau Linux Firmware non libre (précisez) Votre pseudo sur Debian-fr Remarques (Stabilité, préciser si modifications des paramètres de configuration de hostapd...)
Ralink RT5390 (interne) Ralink 1814:539f RT5390 rt2800pci Debian 7 3.2 firmware-ralink AgentSteel Très stable.
TP-Link TL-WN722N (usb) Atheros 0cf3:9271 AR9271 ath9k_htc Debian 7 3.2 firmware-atheros AgentSteel Très stable.
TP-Link TL-WN823N (usb) Realtek 0bda:8178 RTL8192CU rtl8192cu Debian 7 3.2 firmware-realtek AgentSteel Pas stable, déconnexions trop fréquentes. A tester avec les pilotes propriétaires Realtek)
Alfa Networks AWUS036NHR v1 (usb) Realtek 0bda:817f RTL8188RU rtl8192cu Debian 7 3.2 firmware-realtek AgentSteel Quelques déconnexions, à voir sur la durée. A tester avec les pilotes propriétaires Realtek)
Belkin F5D7050 v3 (usb) Ralink 050d:705a RT2571W rt73usb Debian 7 3.2 firmware-ralink AgentSteel Très stable. Wifi G seulement, donc mettre ieee80211n=0 dans hostapd
Intel WiFi Link 5100 AGN (interne) Intel 8086:4232 subsys 8086:1201 (lspci -nn -v) WG82541 iwlwifi Debian 7 3.2 firmware-iwlwifi AgentSteel Mode AP non supporté? A tester avec config logicielle différente.


Liens utiles

  • Wireless.kernel.org Le wiki officiel du sans fil pour le noyau Linux (anglais)
  • WikiDevi Wiki dédié au recensement de matériel sans fil (anglais)