jeudi 5 décembre 2013

Raspberry pi et Hotspot Wifi avec le DWA-121

Ce billet est consacré à la transformation d'une raspberry pi en hotspot wifi grâce au dongle wifi DWA-121.
J'ai déjà présenté ce dongle et comment l'interfacer avec une raspberry pi dans un précédent billet.
On va reprendre tout ça pour l'utiliser avec le nouveau noyau linux 3.12.0.

J'utilise le terme "hotspot" mais il faudrait plus utiliser le terme "point d'accès" puisque je n'aborderai pas la partie partage de connexion Internet grâce aux iptables. De nombreux tutoriels existent sur le net sur le partage de connexion.

Les outils principaux abordés sur ce billet seront :
  • 8192cu.ko : Driver pour le dongle DWA-121
  • wireless tools (iwconfig, iwlist, ...) : Utilitaires pour la gestion du wifi.
  • hostapd : Utilitaire de création de point d'accès wifi.
  • dhcpd : démon de serveur dhcp permettant l'attribution d'adresses IP aux appareils se connectant à la raspberry pi.



Préambule


Pour commencer, après avoir construit un environnement complet grâce à l'outil buildroot-2013.08.1 (si ce n'est pas le cas, veuillez vous reporter vers le billet précédent), nous allons installer la chaîne de compilation croisée dans le PATH pour pouvoir compiler les outils nécessaires à l'utilisation du dongle wifi.

Pour compiler le package dhcp server sur buildroot, il faut impérativement avoir une chaîne de compilation croisée avec l'option IPv6 coché.




































A la racine de buildroot, on va se rendre dans le dossier d'installation de la chaîne de compilation croisée :

# cd output/host/usr/bin

puis exporter le nouveau PATH :

# export PATH=$PATH:$PWD

Ca va nous permettre d'avoir accès aux binaires de compilation plus facilement.

Le dongle wifi DWA-121 est basé sur un chipset realtek rtl8192cu et les sources drivers constructeurs sont nécessaires à son bon fonctionnement. L'archive est disponible sur le site web de realtek. C'est la version 4.0.2_9000 compatible avec les noyaux linux 2.6.18 à 3.9 (cette dernière information va avoir son importance dans la suite du billet).

désarchiver le fichier en dehors de buildroot.

# unzip RTL8188C_8192C_USB_linux_v4.0.2_9000.20130911.zip
# cd RTL8188C_8192C_USB_linux_v4.0.2_9000.20130911
# ls
ReleaseNotes.pdf            android_ref_codes_JB_4.1  android_reference_codes              document  hardware_wps_pbc  readme.txt      wpa_supplicant_hostapd
WiFi_Direct_User_Interface  android_ref_codes_JB_4.2  android_reference_codes_ICS_nl80211  driver    install.sh        wireless_tools

Les dossiers importants sont :
  • driver : Contenant les sources pour la compilation du driver pour le dongle wifi.
  • wireless_tools : Contenant les sources des utilitaires, nécessaires pour la configuration d'une connexion wifi et autres.
  • wpa_supplicant_hostapd : Contenant les sources des outils pour la création et la configuration d'un point d'accès wifi.

Compilation du driver


On va commencer par la compilation du driver, rendez-vous dans le dossier driver et désarchiver le fichier tarball :

# tar xvzf rtl8188C_8192C_usb_linux_v4.0.2_9000.20130911.tar.gz
# cd rtl8188C_8192C_usb_linux_v4.0.2_9000.20130911
# ls 
Kconfig  Makefile  clean  core  hal  ifcfg-wlan0  include  os_dep  runwpa  wlan0dhcp

Plusieurs fichiers vont être à modifier, à commencer par le makefile.

On va rajouter une règle de compilation pour notre plateforme (raspberry pi) :

CONFIG_PLATFORM_I386_PC = n 
CONFIG_PLATFORM_TI_AM3517 = n
CONFIG_PLATFORM_ANDROID_X86 = n
CONFIG_PLATFORM_JB_X86 = n
CONFIG_PLATFORM_ARM_BCM2708 = y
CONFIG_PLATFORM_ARM_S3C2K4 = n
CONFIG_PLATFORM_ARM_PXA2XX = n

et les différentes informations concernant le prefix de la chaîne de compilation croisée ainsi que le chemin du noyau linux utilisé :

ifeq ($(CONFIG_PLATFORM_ARM_S3C6K4), y)
EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN
ARCH := arm
CROSS_COMPILE := arm-none-linux-gnueabi-
KVER  := 2.6.34.1
KSRC ?= /usr/src/linux-2.6.34.1
endif

ifeq ($(CONFIG_PLATFORM_ARM_BCM2708), y)
EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN
ARCH := arm
CROSS_COMPILE := arm-buildroot-linux-uclibcgnueabi-
KVER  := 3.12.0
KSRC ?= /output/build/linux-rpi-3.12.y
endif

ifeq ($(CONFIG_PLATFORM_RTD2880B), y)
EXTRA_CFLAGS += -DCONFIG_BIG_ENDIAN -DCONFIG_PLATFORM_RTD2880B
ARCH:=
CROSS_COMPILE:=
KVER:=
KSRC:=
endif

Ce n'est pas tout, en préambule, je vous avez dit que le driver était compatible que pour les versions de noyaux comprises entre 2.6.18 et 3.9 alors que nous souhaitons le compiler pour une version de noyau 3.12.

La raison est que les fonctions pour créer des entrées (informations systèmes) dans le dossier proc sont dépréciées depuis la version 3.10 du noyau linux. Ces fonctions (create_proc_entry(), create_proc_read_entry(), etc ...) sont utilisées dans le fichier os_dep/linux/os_intfs.c.

Je vous fournit un patch correctif pour résoudre ce problème. J'ai fait le barbare et supprimer les fonctions de création de ses entrées qui ne sont pas nécessaires.
Le patch comprend aussi les modifications à faire dans le Makefile.

Copier le patch à la racine du dossier contenant les sources du driver et appliquer la commande :

patch -p1 < rtl8192c_proc_remove.patch

Ne pas oublier de changer le chemin de votre noyau 3.12.0 dans le makefile.
Il ne reste plus qu'à lancer la commande de compilation et le driver 8192cu.ko devrait apparaître

# make
[...]
# file 8192cu.ko
8192cu.ko: ELF 32-bit LSB relocatable, ARM, EABI5 version 1 (SYSV), BuildID[sha1]=49a3ca8f2bfd3a6eaea5068f710dc46069e4eb8f, not stripped

Ce driver, ainsi compilé, sera à copier sur le système de fichiers.


Outils wifi


Nous allons maintenant nous rendre dans le dossier wireless_tools contenant les sources des outils wifi.

Décompressez l'archive :

# cd wireless_tools
# tar xvzf wireless_tools.30.rtl.tar.gz
# cd wireless_tools.30.rtl.tar.gz

Nous allons modifier le makefile pour cross-compiler les outils :

##
## Please check the configurion parameters below
##

## Installation directory. By default, go in /usr/local.
## Distributions should probably use /, but they probably know better...
ifndef PREFIX
  PREFIX = /usr/local
endif

## Compiler to use (modify this for cross compile).
CC = arm-buildroot-linux-uclibcgnueabi-gcc
## Other tools you need to modify for cross compile (static lib only).
AR = arm-buildroot-linux-uclibcgnueabi-ar
RANLIB = arm-buildroot-linux-uclibcgnueabi-ranlib

## Uncomment this to build tools using static version of the library.
## Mostly useful for embedded platforms without ldd, or to create
## a local version (non-root).
## Standard distros should comment that option to save space and to
## build libiw.so used by third parties...
BUILD_STATIC = y

Pour compiler les outils, lancer la commande :

# make

Les outils compilés sont :

  • iwconfig : configure une interface réseau sans-fil.
  • iwevent : affiche les événements d'une interface réseau sans-fil.
  • iwgetid : rapporte l'ESSID, NWID ou l'Adresse de l'AP/Cell (Point d'Accès/Cellule) du réseau sans fil.
  • iwlist : affichage d'informations détaillées d'une interface réseau sans-fil.
  • iwpriv : traite les paramètres et attributs spécifiques à chaque pilote.
  • iwspy : fixe une liste d'adresses à surveiller sur une interface réseau sans-fil.

Ces outils compilés sont à copier sur le système de fichiers dans le dossier /usr/bin.


Outil de création de point d'accès : hostapd


Compilation de l'exécutable


Hostapd est l'outil permettant de créer et de configurer un point d'accès wifi. Cet utilitaire est disponible parmi les packages buildroot mais nous n'utiliseront pas cette version pour la simple raison que les chipsets realtek ne sont pas supportés avec cette version standard.
Avec son driver, realtek fournit une version modifiée de Hostapd supportant ses chipset.
Nous allons compiler les sources modifiées puis installer le binaire sur le système de fichiers.

Entrez dans le dossier wpa_supplicant_hostapd puis décompressez l'archive :

# cd wpa_supplicant_hostapd
# tar xvzf wpa_supplicant_hostapd-0.8_rtw_r7475.20130812.tar.gz
# cd wpa_supplicant_hostapd-0.8_rtw_r7475.20130812
# cd hostapd

voici le fichier de configuration standard (fichier defconfig) :

# Example hostapd build time configuration
#
# This file lists the configuration options that are used when building the
# hostapd binary. All lines starting with # are ignored. Configuration option
# lines must be commented out complete, if they are not to be included, i.e.,
# just setting VARIABLE=n is not disabling that variable.
#
# This file is included in Makefile, so variables like CFLAGS and LIBS can also
# be modified from here. In most cass, these lines should use += in order not
# to override previous values of the variables.

# Driver interface for Host AP driver
CONFIG_DRIVER_HOSTAP=y

# Driver interface for wired authenticator
#CONFIG_DRIVER_WIRED=y

# Driver interface for madwifi driver
#CONFIG_DRIVER_MADWIFI=y
#CFLAGS += -I../../madwifi # change to the madwifi source directory

# Driver interface for drivers using the nl80211 kernel interface
#CONFIG_DRIVER_NL80211=y

# Driver interface for FreeBSD net80211 layer (e.g., Atheros driver)
#CONFIG_DRIVER_BSD=y
#CFLAGS += -I/usr/local/include
#LIBS += -L/usr/local/lib
#LIBS_p += -L/usr/local/lib
#LIBS_c += -L/usr/local/lib

# Driver interface for no driver (e.g., RADIUS server only)
#CONFIG_DRIVER_NONE=y

et celui modifié par realtek (fichier .config) :

# Example hostapd build time configuration
#
# This file lists the configuration options that are used when building the
# hostapd binary. All lines starting with # are ignored. Configuration option
# lines must be commented out complete, if they are not to be included, i.e.,
# just setting VARIABLE=n is not disabling that variable.
#
# This file is included in Makefile, so variables like CFLAGS and LIBS can also
# be modified from here. In most cass, these lines should use += in order not
# to override previous values of the variables.

# Driver interface for Host AP driver
#CONFIG_DRIVER_HOSTAP=y
CONFIG_DRIVER_RTW=y

# Driver interface for wired authenticator
#CONFIG_DRIVER_WIRED=y

# Driver interface for madwifi driver
#CONFIG_DRIVER_MADWIFI=y
#CFLAGS += -I../../madwifi # change to the madwifi source directory

# Driver interface for drivers using the nl80211 kernel interface
#CONFIG_DRIVER_NL80211=y

# Driver interface for FreeBSD net80211 layer (e.g., Atheros driver)
#CONFIG_DRIVER_BSD=y
#CONFIG_SUPPORT_RTW_DRIVER=y
#CFLAGS += -I/usr/local/include
#LIBS += -L/usr/local/lib
#LIBS_p += -L/usr/local/lib
#LIBS_c += -L/usr/local/lib

# Driver interface for no driver (e.g., RADIUS server only)
#CONFIG_DRIVER_NONE=y

Il n'y aura qu'un seul driver compilé avec cette version modifié de hostapd. le nom du driver a utiliser dans le fichier de configuration est : rtl871xdrv

Voici le morceau de code du fichier source src/drivers/driver_rtw.c :

const struct wpa_driver_ops wpa_driver_rtw_ops = {
        .name                   = "rtl871xdrv",
        .hapd_init              = rtl871x_driver_init_ops,
        .hapd_deinit            = rtl871x_driver_deinit_ops,
        .hapd_send_eapol        = rtl871x_send_eapol_ops,
        .get_hw_feature_data    = rtl871x_get_hw_feature_data_ops,
        .sta_remove             = rtl871x_sta_remove_ops,
        .set_beacon             = rtl871x_set_beacon_ops,
        .set_key                = rtl871x_set_key_ops,
        .sta_deauth             = rtl871x_sta_deauth_ops,
        .sta_disassoc           = rtl871x_sta_disassoc_ops,
        .set_ap_wps_ie          = rtl871x_set_ap_wps_ie,
        .flush                  = rtl871x_sta_flush_ops,
        .set_rts                = rtl871x_set_rts_threshold,
        .set_frag               = rtl871x_set_frag_threshold,
};

Il n'y a pas besoin de modifier le makefile, entrez juste la commande :

# CC=arm-buildroot-linux-uclibcgnueabi-gcc make
# file hostapd
hostapd: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked (uses shared libs), not stripped

Fichier de configuration


L'utilitaire hostapd s'utilise avec un fichier de configuration (hostapd.conf) à installer sur le système de fichiers dans le dossier /etc/hostapd/

Voici un fichier de configuration exemple permettant de créer un point d'accès avec une sécurité de connexion WPA.

Deux paramètres sont à modifier :
  • ssid : Le nom du réseau qui sera afficher sur les appareils souhaitant se connecter à la raspberry pi
  • wpa_passphrase : La clé réseau pour la connexion

Vous trouverez sur internet de nombreux exemples de fichiers de configuration (conf avec sécurité WEP, WPA2, EAP, etc ...). Il faut toujours que le paramètre driver soit rtl871xdrv

# AP netdevice name (without 'ap' postfix, i.e., wlan0 uses wlan0ap for
# management frames); ath0 for madwifi
interface=wlan0

# Driver interface type (hostap/wired/madwifi/test/none/nl80211/bsd);
# default: hostap). nl80211 is used with all Linux mac80211 drivers.
# Use driver=none if building hostapd as a standalone RADIUS server that does
# not control any wireless/wired driver.
driver=rtl871xdrv

##### IEEE 802.11 related configuration #######################################

# SSID to be used in IEEE 802.11 management frames
ssid=rpi_hotspot

# Operation mode (a = IEEE 802.11a, b = IEEE 802.11b, g = IEEE 802.11g,
# Default: IEEE 802.11b
hw_mode=g

# Channel number (IEEE 802.11)
# (default: 0, i.e., not set)
# Please note that some drivers (e.g., madwifi) do not use this value from
# hostapd and the channel will need to be configuration separately with
# iwconfig.
channel=6

# Station MAC address -based authentication
# Please note that this kind of access control requires a driver that uses
# hostapd to take care of management frame processing and as such, this can be
# used with driver=hostap or driver=nl80211, but not with driver=madwifi.
# 0 = accept unless in deny list
# 1 = deny unless in accept list
# 2 = use external RADIUS server (accept/deny lists are searched first)
macaddr_acl=0

# IEEE 802.11 specifies two authentication algorithms. hostapd can be
# configured to allow both of these or only one. Open system authentication
# should be used with IEEE 802.1X.
# Bit fields of allowed authentication algorithms:
# bit 0 = Open System Authentication
# bit 1 = Shared Key Authentication (requires WEP)
auth_algs=1

# Send empty SSID in beacons and ignore probe request frames that do not
# specify full SSID, i.e., require stations to know SSID.
# default: disabled (0)
# 1 = send empty (length=0) SSID in beacon and ignore probe request for
#     broadcast SSID
# 2 = clear SSID (ASCII 0), but keep the original length (this may be required
#     with some clients that do not support empty SSID) and ignore probe
#     requests for broadcast SSID
ignore_broadcast_ssid=0

##### WPA/IEEE 802.11i configuration ##########################################

# Enable WPA. Setting this variable configures the AP to require WPA (either
# WPA-PSK or WPA-RADIUS/EAP based on other configuration). For WPA-PSK, either
# wpa_psk or wpa_passphrase must be set and wpa_key_mgmt must include WPA-PSK.
# For WPA-RADIUS/EAP, ieee8021x must be set (but without dynamic WEP keys),
# RADIUS authentication server must be configured, and WPA-EAP must be included
# in wpa_key_mgmt.
# This field is a bit field that can be used to enable WPA (IEEE 802.11i/D3.0)
# and/or WPA2 (full IEEE 802.11i/RSN):
# bit0 = WPA
# bit1 = IEEE 802.11i/RSN (WPA2) (dot11RSNAEnabled)
wpa=2

# WPA pre-shared keys for WPA-PSK. This can be either entered as a 256-bit
# secret in hex format (64 hex digits), wpa_psk, or as an ASCII passphrase
# (8..63 characters) that will be converted to PSK. This conversion uses SSID
# so the PSK changes when ASCII passphrase is used and the SSID is changed.
wpa_passphrase=je_suis_un_con

# Set of accepted key management algorithms (WPA-PSK, WPA-EAP, or both). The
# entries are separated with a space. WPA-PSK-SHA256 and WPA-EAP-SHA256 can be
# added to enable SHA256-based stronger algorithms.
wpa_key_mgmt=WPA-PSK

# Set of accepted cipher suites (encryption algorithms) for pairwise keys
# (unicast packets). This is a space separated list of algorithms:
# CCMP = AES in Counter mode with CBC-MAC [RFC 3610, IEEE 802.11i/D7.0]
# TKIP = Temporal Key Integrity Protocol [IEEE 802.11i/D7.0]
# Group cipher suite (encryption algorithm for broadcast and multicast frames)
# is automatically selected based on this configuration. If only CCMP is
# allowed as the pairwise cipher, group cipher will also be CCMP. Otherwise,
# TKIP will be used as the group cipher.
wpa_pairwise=TKIP
# Pairwise cipher for RSN/WPA2 (default: use wpa_pairwise value)
rsn_pairwise=CCMP

Utilisation de l'utilitaire


Pour lancer l'exécutable, il suffit de lancer la commande :

# hostapd -B -P /var/run/hostapd.pid /etc/hostapd/hostapd.conf

Les paramètres :
  • -B : permet de lancer l'exécutable en tant que démon
  • -P : permet de définir le chemin du fichier process_id

Lorsqu'on lance la commande, différentes traces de debugs apparaissent et la LED bleue du dongle clignote signifiant que le démon est opérationnel :

Configuration file: /etc/hostapd/hostapd.conf
drv->ifindex=3
l2_sock_recv==l2[ 3490.422354] _rtw_pwr_wakeup call ips_leave....
_sock_xmit=0x0xd[ 3490.428112] ==>ips_leave cnts:1
91c28
[ 3490.433486] ===>  rtw_ips_pwr_up..............
[ 3490.437992] ===> ips_netdrv_open.........
[ 3490.447772]  ===> FirmwareDownload91C() fw:Rtl819XFwImageArray_TSMC
[ 3490.454572] FirmwareDownload92C accquire FW from embedded image
[ 3490.460541] fw_ver=v88, fw_subver=2, sig=0x88c0
[ 3490.508549] fw download ok!
[ 3490.511382] Set RF Chip ID to RF_6052 and RF type to 1T1R.
[ 3491.009448] IQK:Start!!!
[ 3491.024204] Path A IQK Success!!
[ 3491.035699] Path A IQK Success!!
[ 3491.044340] IQK: final_candidate is 0
[ 3491.048043] IQK: RegE94=102 RegE9C=12 RegEA4=fc RegEAC=2 RegEB4=0 RegEBC=0 RegEC4=0 RegECC=0
 Path A IQ Calibration Success !
[ 3491.180505] pdmpriv->TxPowerTrackControl = 1
[ 3491.190242] rtl8192cu_hal_init in 740ms
[ 3491.217821] <===  rtw_ips_pwr_up.............. in 780ms
[ 3491.223824] ==> ips_leave.....LED(0x00028080)...
[ 3491.228477] set_mode = IW_MODE_MASTER
[ 3491.233752] rtw_hostapd_sta_flush
[ 3491.237428] hw_var_set_opmode()-4234 mode = 3
[ 3491.242936] rtw_sta_flush(wlan0)
[ 3491.246187] issue_deauth to ff:ff:ff:ff:ff:ff
+rtl871x_sta_dea[ 3491.250925] rtw_set_encryption
uth_ops, ff:ff:ff:ff:ff:[ 3491.256106] clear default encryption keys, keyid=0
ff is deauth, reason=2
[ 3491.262960] rtw_set_encryption
rtl871x_set_key_[ 3491.267239] clear default encryption keys, keyid=1
ops
rtl871x_set_key_ops[ 3491.274616] rtw_set_encryption

rtl871x_set_ke[ 3491.278520] clear default encryption keys, keyid=2
y_ops
rtl871x_set_key_[ 3491.285754] rtw_set_encryption
ops
[ 3491.289989] clear default encryption keys, keyid=3
Using interface wlan0 with hwaddr c8:be:19:86:be:51 and ssid 'rpi_hotspot'
rtl871x_set_wps_[ 3491.469863] rtw_set_wps_assoc_resp, len=14
assoc_resp_ie
rtl871x_[ 3491.475890] rtw_set_wps_beacon, len=14
set_wps_beacon_i[ 3491.481049] rtw_set_wps_probe_resp, len=14
e
rtl871x_set_wps_probe_resp_ie
rtl871x_[ 3491.488651] rtw_set_encryption
set_key_ops
[ 3491.493725] rtw_set_encryption, set group_key, CCMP
[ 3491.499166] set_group_key
rtl871x_set_beac[ 3491.503652] rtw_set_beacon, len=83
on_ops
[ 3491.508302] rtw_check_beacon_data, len=69
[ 3491.516077] SetHwReg8192CU, 5126, RCR= 7000228e 
[ 3491.535195] CH=6, BW=0, offset=0
[ 3491.539444] HW_VAR_BASIC_RATE: BrateCfg(0x15d)
[ 3491.553744] update_bmc_sta, mask=0x6000000f, arg=0x81
[ 3491.559941] IPv6: ADDRCONF(NETDEV_CHANGE): wlan0: link becomes ready
rtl871x_set_hidd[ 3491.567560] rtw_set_hidden_ssid(wlan0) ignore_broadcast_ssid:0, rpi_hotspot,11
en_ssid ignore_broadcast_ssid:0, rpi_hotspot,11
rtl871x_set_acl
# [ 3496.233839] rtl8192c_dm_RF_Saving(): RF_Normal

Utilitaire serveur DHCP


Le serveur DHCP (Dynamic Host Configuration Protocol) va permettre à la raspberry pi d'affecter automatiquement une adresse IP et un masque de sous-réseau aux périphériques souhaitant se connecter à celle-ci.

Fonctionnement



  • L’ordinateur équipé de carte réseau, mais dépourvu d’adresse IP, envoie en diffusion Broadcast un datagramme (DHCP DISCOVER) qui s’adresse au port 67 de n’importe quel serveur à l’écoute sur ce port. Ce datagramme comporte entre autres l’adresse physique (MAC) du client.

  • Tout serveur DHCP ayant reçu ce datagramme, s’il est en mesure de proposer une adresse sur le réseau auquel appartient le client, envoie une offre DHCP (DHCP OFFER) à l’attention du client (sur son port 68), identifié par son adresse physique. Cette offre comporte l’adresse IP du serveur, ainsi que l’adresse IP et le masque de sous-réseau qu’il propose au client. Il se peut que plusieurs offres soient adressées au client.

  • Le client retient une des offres reçues (la première qui lui parvient), et diffuse sur le réseau un datagramme de requête DHCP (DHCP REQUEST). Ce datagramme comporte l’adresse IP du serveur et celle qui vient d’être proposée au client. Elle a pour effet de demander au serveur choisi l’assignation de cette adresse, l’envoi éventuel des valeurs des paramètres, et d’informer les autres serveurs qui ont fait une offre qu’elle n’a pas été retenue.

  • Le serveur DHCP élabore un datagramme d'accusé de réception (DHCP ACK pour acknowledgement) qui assigne au client l'adresse IP et son masque de sous-réseau, la durée du bail de cette adresse (dont découlent deux valeurs T1 et T2 qui déterminent le comportement du client en fin de bail), et éventuellement d'autres paramètres (adresse IP de la passerelle par défaut, adresses IP des serveurs DNS et adresses IP des serveurs NBNS, ...).


  • Installation


    Le serveur dhcp est un package de busybox qui est accessible depuis buildroot en cochant la case : Show packages that are also provided by busybox dans le menu Target Packages -->

    # make menuconfig
    




































    Ensuite se rendre dans le sous-menu Networking applications --> et choisir le package isc dhcp et dhcp server.




































    Il suffit de taper la commande make pour compiler l'éxecutable et l'installer sur le système de fichiers :

    # make
    

    Configuration


    Le fichier de configuration se trouve sur le système de fichiers : /etc/dhcp/dhcpd.conf


    Il existe, bien entendu, une tripotée de configurations différentes, en voici un exemple :

    # cat dhcpd.conf 
    
    # Sample configuration file for ISC dhcpd for Debian
    #
    # $Id: dhcpd.conf,v 1.1.1.1 2002/05/21 00:07:44 peloy Exp $
    #
    
    # The ddns-updates-style parameter controls whether or not the server will
    # attempt to do a DNS update when a lease is confirmed. We default to the
    # behavior of the version 2 packages ('none', since DHCP v2 didn't
    # have support for DDNS.)
    ddns-update-style none;
    
    # option definitions common to all supported networks...
    option domain-name "benserv-rpi";
    option domain-name-servers 8.8.8.8, 8.8.4.4;
    
    default-lease-time 3600;
    max-lease-time 7200;
    
    # If this DHCP server is the official DHCP server for the local
    # network, the authoritative directive should be uncommented.
    #authoritative;
    
    # Use this to send dhcp log messages to a different log file (you also
    # have to hack syslog.conf to complete the redirection).
    log-facility local7;
    
    option subnet-mask 255.255.255.0;
    option broadcast-address 192.168.10.255;
    option routers 192.168.10.254;
    
    subnet 192.168.10.0 netmask 255.255.255.0 {
      range 192.168.10.10 192.168.10.100;
    }
    

    Le serveur DHCP assignera au client une adresse IP comprise entre 192.168.10.10 et 192.168.10.100 pour une durée de 3600 secondes. Le client peut spécifier une période de temps spécifique, dans ce cas, le temps d'allocation maximum est de 7200 secondes.

    Le serveur va également informer le client qu'il doit utiliser:

    • un masque de sous réseau à 255.255.255.0
    • une adresse de multi-diffusion à 192.168.10.255
    • une adresse de passerelle à 192.168.10.254
    • des serveurs DNS à 8.8.8.8 et 8.8.4.4


    Script d'initialisation


    Pour automatiser les différentes étapes permettant la mise en oeuvre d'un point d'accès, on va créer un script d'initialisation qui se lancera au démarrage du système. Ce script est à créer dans /etc/init.d.

    On va l'appeler S70wifi pour l'activation du wifi.

    #!/bin/sh
    #
    # Start the wifi....
    #
     
    VENDOR_ID="2001"
    PRODUCT_ID="3308"
    INTERFACE="wlan0"
    result_lsusb=""
     
    case "$1" in
      start)
            result_lsusb=`lsusb -d "${VENDOR_ID}":"${PRODUCT_ID}"`
            if [ "${result_lsusb}" != "" ]; then
                    # activation du driver 8192cu.ko
                    insmod /lib/modules/3.12.0/kernel/drivers/net/wireless/rtl8192cu/8192cu.ko
                    # attribution d'une adresse IP passerelle pour l'interface réseau sans-fil
      /sbin/ip a add 192.168.10.254/24 dev wlan0
                    # activation de l'interface réseau sans-fil
      /sbin/ip link set dev wlan0 up
            fi
            ;;
      stop)
            ;;
      restart|reload)
            "$0" stop
            "$0" start
            ;;
      *)
            echo "Usage: $0 {start|stop|restart}"
            exit 1
    esac
     
    exit $?
    

    Le script de lancement du serveur dhcp est directement installé sur le système de fichier, il suffit simplement de modifier la variable INTERFACES à wlan0

    #!/bin/sh
    #
    # $Id: dhcp3-server.init.d,v 1.4 2003/07/13 19:12:41 mdz Exp $
    #
    
    # On what interfaces should the DHCP server (dhcpd) serve DHCP requests?
    #       Separate multiple interfaces with spaces, e.g. "eth0 eth1".
    INTERFACES="wlan0"
    
    
    # It is not safe to start if we don't have a default configuration...
    #echo "/etc/init.d/dhcp-server not yet configured! - Aborting..."
    #exit 1;
    
    
    
    test -f /usr/sbin/dhcpd || exit 0
    
    
    case "$1" in
     start)
      echo -n "Starting DHCP server: "
      test -d /var/lib/dhcp/ || mkdir -p /var/lib/dhcp/
      test -f /var/lib/dhcp/dhcpd.leases || touch /var/lib/dhcp/dhcpd.leases 
      start-stop-daemon -S -x /usr/sbin/dhcpd -- -cf /etc/dhcp/dhcpd.conf -q $INTERFACES
      echo "."
      ;;
     stop)
      echo -n "Stopping DHCP server: dhcpd3"
      start-stop-daemon -K -x /usr/sbin/dhcpd
      echo "."
      ;;
     restart | force-reload)
      $0 stop
      sleep 2
      $0 start
      if [ "$?" != "0" ]; then
       exit 1
      fi
      ;;
     *)
      echo "Usage: /etc/init.d/dhcp-server {start|stop|restart|force-reload}"
      exit 1 
    esac
    
    exit 0
    

    et finalement le script de lancement de l'utilitaire hostapd avec le script /etc/init.d/S81hostapd :

    #!/bin/sh
    #
    # Start Hostapd....
    #
     
    test -f /usr/bin/hostapd || exit 0
    
    case "$1" in
      start)
     echo -n "Starting hostapd: "
     start-stop-daemon -S -x /usr/bin/hostapd -- -B -P /var/run/hostapd.pid /etc/hostapd/hostapd.conf        
            ;;
      stop)
     echo -n "Stopping hostapd: "
     start-stop-daemon -K -x /usr/bin/hostapd
            ;;
      restart|reload)
            "$0" stop
            "$0" start
            ;;
      *)
            echo "Usage: $0 {start|stop|restart}"
            exit 1
    esac
     
    exit $?
    

    Conclusion


    Vous voila avec un point d'accès complètement fonctionnel, Je me suis servi d'un topic sur le forum de raspberry pi (ici).
    J'avais trouvé les explications un peu trop légères sur comment faire et je souhaitais expliquer, plus en détail, comment obtenir une version de hostpad fonctionnel.

    Amusez-vous bien ...

    Aucun commentaire:

    Enregistrer un commentaire