Broadcom PCI 802.11g Wi-Fi et FreeBSD

Olivier Regnier

- Titre : Broadcom PCI 802.11g Wi-Fi et FreeBSD

- Auteur : Olivier Regnier

- Parution : 20 septembre 2007

- Licence : Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright ® 2007 Olivier Regnier. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.

Voir également :

- Première publication: 01/03/2008 - Installation d'OpenBSD

- Dernière mise à jour: 01/12/2007 - Créer un CD-ROM d'installation OpenBSD 4.1 amorçable.

- Dernière mise à jour: 15/10/2007 - Un shell coloré sous OpenBSD.

- Dernière mise à jour: 12/11/2007 - Ecrire ma propre page de manuel sous OpenBSD.

- Dernière mise à jour: 08/10/2007 - Installer pas à pas FreeBSD 6.2.

- Dernière mise à jour: 02/10/2007 - Créer un DVD-ROM d'installation FreeBSD 6.2 amorçable.

- Dernière mise à jour: 20/09/2007 - Broadcom PCI 802.11g Wifi et FreeBSD.

- Dernière mise à jour: 15/09/2007 - Plugins pour Mozilla Firefox sous FreeBSD.

Sommaire

- I. Présentation du schéma de l'installation

- II. Comment puis-je obtenir les informations de ma carte réseau et récupérer son pilote ?

- III. Que dois-je faire avec le pilote Microsoft ?

- IV. Comment dois-je installer le module sous FreeBSD ?

- V. Quelle est l'utilité d'avoir chargé le module ?

- VI. Comment dois-je configurer mon routeur ?

- VII. Dois-je configurer mon interface réseau ?

- VIII. Quels algorithmes de cryptage dois-je choisir ?

- IX. Comment savoir si je suis connecté à Internet ?

- X. Remerciements

I - Présentation du schéma de l'installation

+----------+         +---------+    +--------------------------+             +---------------------+
| INTERNET |  )) ((  | FREEBOX |----| ROUTEUR/FIREWALL NETGEAR |--| )) (( |--| FreeBSD 6.1-RELEASE |
+----------+         +---------+    +--------------------------+             +---------------------+
IP: 192.168.1.1                        IP: 192.168.1.3

Mon réseau personnel se compose de deux ordinateurs, une station de travail, un portable Acer Aspire 3000 avec une carte réseau Broadcom 802.11g Wi-Fi Certified sous FreeBSD, appelée ROMEO, à l'adresse IP 192.168.1.3 et un PC (non représenté sur le schéma) sous Windows XP Professionnel, appelé HECTOR, à l'adresse IP 192.168.1.2.

Ainsi qu'un routeur/pare-feu Netgear WPNT834, ADSL2+ sans fil RangeMax MiMO 108Mbp/s qui supporte les cryptages, WEP, WPA-PSK (TKIP), WPA2-PSK (AES) et WPA-PSK (TKIP) + WPA2-PSK (AES), à l'adresse IP 192.168.1.1 et une Freebox.

II - Comment puis-je obtenir les informations de ma carte réseau et récupérer son pilote ?

Je vais procéder en trois étapes, la première consiste à savoir si le noyau a détecté la carte réseau :

# dmesg | more

Pour faire défiler les informations, j'utilise les touches fléchées et après un court instant, j'obtiens ceci :

pci0: <network> at device 11.0 (no driver attached)

Est-ce la bonne carte ? Pour le savoir, étape n° 2, j'utilise la commande :

# pciconf -lv | more

Après une petite recherche, j'obtiens ceci :

none2@pci0:11:0:    class=0x028000 card=0x03121468 chip=0x431814e4 rev=0x02 hdr=0x00
vendor    = 'Broadcom Corporation'
class     = network

pci0 correspond effectivement à ma carte Broadcom, je vais donc pouvoir, en troisième étape, me procurer mon pilote. FreeBSD ne propose pas de pilotes, mais il existe une solution : utiliser les pilotes Microsoft qui utilisent le protocole NDIS, disponibles sur le CD-ROM Aspire 3000/5000 Series System CD Rev 1.0 - Disk 1, dans le répertoire Drivers/802BG et je récupère les fichiers bcmwl5.inf et bcmwl5.sys.

III - Que dois-je faire avec le pilote Microsoft ?

À ce stade, mon pilote ne peut pas fonctionner sous FreeBSD sans avoir au préalable subi une petite transformation. Effectivement, je dois le convertir sous la forme d'un module.

Je vais créer un répertoire appelé ndis et y copier les fichiers situés, sur ma clé USB :

# mkdir /root/ndis && cp /mnt/usb/inf* sys* /root/ndis

Pour convertir mon fichier .inf, je vais utiliser un script, ndisgen afin de le transformer en un fichier ASCII, car par défaut, il est au format Unicode. La conversion requiert le programme iconv ainsi que, perl-5.8.8 et libiconv-1.9.2_2 que je vais maintenant récupérer et installer :

# pkg_add iconv-2.0_3.tbz

Je vais convertir mon pilote avec ndisgen :

# ndisgen

et suivre les étapes ci-dessous :

- sélectionner le choix n° 3 Convert driver ;

- saisir le chemin du fichier .inf, > /root/ndis/bcmwl5.inf ;

- appuyer sur la touche [Entrée] à la vue de ce message, « This .INF file appears to be Unicode » ;

- saisir le chemin du fichier .sys, > /root/ndis/bcmwl5.sys ;

- appuyer sur la touche [Entrée] à la vue de ce message : « This .SYS file appears to be in Windows(r) PE format » ;

- appuyer sur [Entrée] pour commencer la conversion ;

- appuyer sur la touche [Entrée] à la vue de ce message : « Conversion was successful » ;

- si vous avez un pilote supplémentaire, veuillez le saisir sinon, appuyez sur la touche [Entrée] pour continuer ;

- appuyer sur la touche [Entrée] à la vue de ce message : « List of files converted firmware files » ;

- appuyer sur la touche [Entrée] à la vue de ce message : « Press enter to compile the stub module and generate the driver module now », pour générer votre module.

Fin des opérations, j'obtiens les messages suivants :

Generating Makefile... done.
Building kernel module... done.
Cleaning up... done.

The file bcmwl5_sys.ko has been successfully generated.

Je vais appuyer une nouvelle fois sur la touche Entrée pour revenir au menu général et quitter le script ndisgen en choisissant le choix n° 4, Exit.

IV - Comment dois-je installer le module sous FreeBSD ?

Il existe deux possibilités, utiliser la commande kldload pour le charger immédiatement, par exemple :

# kldload ndis/bcmwl5_sys.ko
et vérifier que le module est chargé:
# kldstat

Je dois théoriquement obtenir cet affichage :

Id  Refs  Address     Size    Name
1    11  0xc0400000  691928  kernel
2     1  0xc0a92000  58554   acpi.ko
3     1  0xc3411000  62000   bcmwl5_sys.ko
4     1  0xc3473000  b000    if_ndis.ko
5     2  0xc347e000  13000   ndis.ko

soit, automatiser le démarrage du module à l'aide du fichier loader.conf avec les lignes suivantes :

ndis_load="YES"
if_ndis_load="YES"
bcmwl5_sys_load="YES"
bcmwl5_sys_name="/root/ndis/bcmwl5_sys.ko"

Il faut bien entendu, redémarrer FreeBSD, après quelques secondes, je me loggue et j'exécute la commande kldstat et j'obtiens un affichage identique à celui cité ci-dessus.

V - Quelle est l'utilité d'avoir chargé le module ?

Le module permet de charger l'interface réseau que l'on peut visualiser et/ou modifier ses paramètres avec la commande :

% ifconfig

J'obtiens l'affichage suivant :

lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 16384
inet6 ::1 prefixlen 128
inet6 fe80::1%lo0 prefixlen 64 scopeid 0x2
inet 127.0.0.1 netmask 0xff000000
ndis0: flags=8802<BROADCAST,SIMPLEX,MULTICAST> mtu 1500
ether 00:0e:9b:d3:b5:7e
media: IEEE 802.11 Wireless Ethernet autoselect
status: no carrier
ssid "" channel 1
authmode OPEN privacy OFF txpowmax 100 protmode CTS

L'interfacelo0 appelée loopback et ndis0, mon interface.

VI - Comment dois-je configurer mon routeur ?

Je configure mon routeur avec le navigateur web en saisissant dans la barre d'adresse son adresse IP en l'occurrence : 192.168.1.1. Je m'identifie en indiquant mon login et mot de passe qui par défaut sont : admin et password. Par mesure de précaution, je vais modifier mon login et mot de passe en cherchant l'option adéquate.

Je vais définir le nom de mon réseau, SSID acronyme de (Service Set IDentifier) en choisissant l'option prévue à cet effet. Le nom du SSID sera VX-DG8E-ZLOA et je valide. Par la même occasion, je vais désactiver ([ ] Enable SSID Broadcast) la diffusion du nom SSID pour éviter d'éveiller la curiosité de mes voisins et je valide.

Je dois maintenant activer le cryptage de mon réseau afin d'assurer la confidentialité de mes données avec un algorithme de chiffrage. À ce jour, il existe, le WEP, acronyme de (Wired Equivalent Privacy) et WPA, acronyme de (Wi-Fi Protected Access). Si votre matériel le permet, utilisez de préférence, le WPA et en dernier recours, le WEP, pour des raisons de sécurité évidentes. Pour le moment, je vais laisser cette option sur none et je valide.

Une option intéressante, le filtrage des adresses MAC. Saisir une à une les adresses IP de vos ordinateurs. Ainsi seuls les appareils (reconnus sur le réseau par leur adresse MAC) pourront accéder au réseau. Malheureusement, le filtrage ne fonctionne pas avec la version actuelle du firmware, 1.0.41. Je vais désactiver cette option en attendant une nouvelle mise à jour.

Je vais maintenant configurer le poste client, mon portable pour qu'il puisse se connecter à Internet.

VII - Dois-je configurer mon interface réseau ?

Oui et pour cela, il faut télécharger le programme, wpa_supplicant. Il permet de s'authentifier à un accès sécurisé par WPA et WEP.

Je vais récupérer wpa_supplicant-0.3.8_2, libdnet-1.10_1 et procéder à l'installation :

# pkg_add wpa_supplicant-0.3.8_2.tbz

Je dois charger quelques modules via le fichier loader.conf en y insérant les lignes suivantes :

wlan_wep_load="YES"
wlan_tkip_load="YES"
wlan_ccmp_load="YES"
wlan_xauth_load="YES"
wlan_acl_load="YES"

Je vais redémarrer FreeBSD avec la commande reboot, me logguer de nouveau et vérifier avec la commande kldstat que tous les modules sont chargés.

# kldstat

J'obtiens ceci :

Id  Refs  Address     Size    Name
1    21  0xc0400000  696c30  kernel
2     2  0xc0a97000  ca80    if_ndis.ko
3     3  0xc0aa4000  1753c   ndis.ko
4     1  0xc0abc000  64330   bcmwl5_sys.ko
5     1  0xc0b21000  2d48    wlan_wep.ko
6     1  0xc0b24000  6da4    wlan_ccmp.ko
7     1  0xc0b2b000  4040    wlan_tkip.ko
8     1  0xc0b30000  1b88    wlan_xauth.ko
9     1  0xc0b32000  2cf4    wlan_acl.ko
10    1  0xc0b35000  58554   acpi.ko

Une fois wpa_supplicant installé, je vais créer son fichier de configuration :

# touch /etc/wpa_supplicant.conf

et je vais ajouter la ligne suivante au fichier rc.conf :

ifconfig_ndis0="WPA DHCP"

Maintenant, je vais tester les différentes méthodes de cryptage.

VIII - Quels algorithmes de cryptage dois-je choisir ?

WEP

Arrivé sur l'interface de configuration de mon routeur, je choisis la page qui permet de modifier la méthode de cryptage WEP.

* Configuration à clé WEP (côté routeur) :

Je saisis ma passphrase, dl0r8q9p7r et je clique sur le bouton [Generate].

Attention sous Mozilla Firefox version 1.5.0.7, le bouton [Generate] ne fonctionne pas. Il faut donc utiliser Internet Explorer.

Security Options
(*) WEP

Security Encryption (WEP)
Authentication Type:   [Automatic]

Security Encryption (WEP) Key
Passphrase: dl0r8q9p7r  [Generate]
Key1: (*) E313B5E7FA
Key2: ( ) FAC2C1B14D
Key3: ( ) A2D49B641F
Key4: ( ) 57673F0968

* Configuration à clé WEP (côté client) :

Fichier à modifier : /etc/wpa_supplicant.conf

ctrl_interface=/var/run/wpa_supplicant
ctrl_interface_group=wheel

eapol_version=1

ap_scan=2

network={
ssid="VX-DG8E-ZLOA"
key_mgmt=NONE
wep_key0=E313B5E7FA
wep_tx_keydx=0
}

Je sauvegarde mon fichier et je teste la configuration :

/etc/rc.d/netif start

WEP

* Configuration à clé WEP partagée (côté routeur) :

Security Options
(*) WEP

Security Encryption (WEP)
Authentication Type:   [Shared Key]

Security Encryption (WEP) Key
Passphrase: dl0r8q9p7r  [Generate]
Key1: (*) E313B5E7FA
Key2: ( ) FAC2C1B14D
Key3: ( ) A2D49B641F
Key4: ( ) 57673F0968

* Configuration à clé WEP partagée (côté client) :

Fichier à modifier : /etc/wpa_supplicant.conf

ctrl_interface=/var/run/wpa_supplicant
ctrl_interface_group=wheel

eapol_version=1

ap_scan=2

network={
ssid="VX-DG8E-ZLOA"
key_mgmt=NONE
auth_alg=SHARED
wep_key0=E313B5E7FA
wep_key1=FAC2C1B14D
wep_key2=A2D49B641F
wep_key3=57673F0968
wep_tx_keydx=0
}

Je sauvegarde mon fichier et je teste la configuration :

/etc/rc.d/netif restart

WPA

De retour sur l'interface de configuration de mon routeur, je choisis la page qui permet de modifier la méthode de cryptage WPA. Je saisis ma passphrase et je valide.

* Configuration à clé WPA-PSK (TKIP), (côté routeur) :

Security Options
(*) WPA-PSK (TKIP)

Security Encryption (WPA-PSK)
Passphrase:                   [**********    ] (8 ~ 63 characters)

* Configuration à clé WPA-PSK (TKIP), (côté client) :

Je vais arrêter le programme wpa_supplicant et supprimer son fichier de configuration :

/etc/rc.d/netif stop && rm /etc/wpa_supplicant.conf

Je vais générer le fichier wpa_supplicant.conf automatiquement avec le SSID et la clé psk :

wpa_passphrase "VX-DG8E-ZLOA" "E313B5E7FA" > /etc/wpa_supplicant.conf

Voici le contenu du fichier :

network={
ssid="VX-DG8E-ZLOA"
#psk="E313B5E7FA"
psk=7bce519ec5f8f783ec989e7c431509fd292e4f9680c510b44745a7fbbe737f4f
}

Je vais le modifier comme suit :

ctrl_interface=/var/run/wpa_supplicant
ctrl_interface_group=wheel

eapol_version=1

ap_scan=2

network={
ssid="VX-DG8E-ZLOA"
proto=WPA
key_mgmt=WPA-PSK
auth_alg=OPEN
pairwise=TKIP
group=TKIP
psk=7bce519ec5f8f783ec989e7c431509fd292e4f9680c510b44745a7fbbe737f4f
}

Je sauvegarde le fichier et je teste la configuration :

/etc/rc.d/netif start

WPA2

À nouveau sur l'interface de configuration de mon routeur, je choisis la page qui permet de modifier la méthode de cryptage WPA. Je saisis ma passphrase et je valide.

* Configuration à clé WPA2-PSK (AES), (côté routeur) :

Security Options
(*) WPA2-PSK (AES)

Security Encryption (WPA-PSK)
Passphrase:                   [**********    ] (8 ~ 63 characters)

* Configuration à clé WPA2-PSK (AES), (côté client) :

Fichier à modifier : /etc/wpa_supplicant.conf

ctrl_interface=/var/run/wpa_supplicant
ctrl_interface_group=wheel

eapol_version=1

ap_scan=2

network={
ssid="VX-DG8E-ZLOA"
proto=RSN
key_mgmt=WPA-PSK
auth_alg=OPEN
pairwise=CCMP
group=CCMP
psk=7bce519ec5f8f783ec989e7c431509fd292e4f9680c510b44745a7fbbe737f4f
}

Je sauvegarde le fichier et je teste la configuration :

/etc/rc.d/netif restart

WPA + WPA2

De retour sur l'interface de configuration de mon routeur, je choisis la page qui permet de modifier la méthode de cryptage WPA. Je saisis ma passphrase et je valide.

* Configuration à clé WPA-PSK (TKIP) + WPA2-PSK (AES), (côté routeur) :

Security Options
(*) WPA-PSK (TKIP) + WPA2-PSK (AES)

Security Encryption (WPA-PSK)
Passphrase:                   [**********    ] (8 ~ 63 characters)

* Configuration à clé WPA-PSK (TKIP) + WPA2-PSK (AES), (côté client) :

Fichier à modifier : /etc/wpa_supplicant.conf

ctrl_interface=/var/run/wpa_supplicant
ctrl_interface_group=wheel

eapol_version=1

ap_scan=2

network={
ssid="VX-DG8E-ZLOA"
proto=WPA RSN
key_mgmt=WPA-PSK
auth_alg=OPEN
pairwise=TKIP CCMP
group=TKIP CCMP
psk=7bce519ec5f8f783ec989e7c431509fd292e4f9680c510b44745a7fbbe737f4f
}

Je sauvegarde le fichier et je teste la configuration :

/etc/rc.d/netif restart

IX - Comment savoir si je suis connecté à Internet ?

Au moment de tester la configuration, j'utilise toujours les mêmes commandes :

/etc/rc.d/netif start|stop|restart

Suivant la méthode de cryptage utilisée, j'obtiens un affichage similaire à celui-ci :

Starting wpa_supplicant.
DHCPREQUEST on ndis0 to 255.255.255.255 port 67
DHCPREQUEST on ndis0 to 255.255.255.255 port 67
DHCPACK from 192.168.1.1
bound to 192.168.1.3 -- renewal in 43200 seconds.
ndis0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500
inet6 fe80::20e:9bff:fed3:b57e%ndis0 prefixlen 64 scopeid 0x2
inet 192.168.1.3 netmask 0xffffff00 broadcast 192.168.1.255
ether 00:0e:9b:d3:b5:7e
media: IEEE 802.11 Wireless Ethernet autoselect (OFDM/54Mbps)
status: associated
ssid VX-DG8E-ZLOA channel 7 bssid 00:14:6c:f1:4c:8a
authmode WPA2/802.11i privacy ON deftxkey UNDEF txpowmax 100 protmode CTS

Je suis bien connecté au réseau avec le SSID VX-DG8E-ZLOA et comme adresse IP 192.168.1.3 attribuée par le routeur. Puis-je sortir vers l'extérieur ? Pour cela, je vais pinguer par exemple le site de FreeBSD:

# ping freebsd.org

J'obtiens ceci :

PING google.com (64.233.167.99): 56 data bytes
64 bytes from 64.233.167.99: icmp_seq=0 ttl=242 time=137.575 ms
64 bytes from 64.233.167.99: icmp_seq=1 ttl=242 time=140.393 ms
64 bytes from 64.233.167.99: icmp_seq=2 ttl=242 time=139.910 ms
64 bytes from 64.233.167.99: icmp_seq=3 ttl=242 time=140.665 ms

J'en conclus que je suis bien connecté à Internet.

X - Remerciements

Je tiens à remercier Julp et Ovh pour la relecture attentive de cet article.