ReLoad

Thierry Jaouen ~ WikiBlog
"Rien à foutre d'être lu, tant que je peux me relire."

Outils pour utilisateurs

Outils du site


blog:2012:07:20:wifi_tl-wn821n_debian

Wifi avec TL-WN821N

Une clé Wifi qui fonctionne sous Debian, et aussi en “access point” …

La voici: TP-Link - TL-WN821NC ~~READMORE~~

Liens:

branché

# lsusb
Bus 006 Device 011: ID 0cf3:7015 Atheros Communications, Inc. TP-Link TL-WN821N v3 802.11n [Atheros AR7010+AR9287]
....
[ 2473.455114] usb 6-1.2.1.4: new high-speed USB device number 10 using ehci_hcd
[ 2473.563752] usb 6-1.2.1.4: New USB device found, idVendor=0cf3, idProduct=7015
[ 2473.563754] usb 6-1.2.1.4: New USB device strings: Mfr=16, Product=32, SerialNumber=48
[ 2473.563756] usb 6-1.2.1.4: Product: USB WLAN
[ 2473.563757] usb 6-1.2.1.4: Manufacturer: ATHEROS
[ 2473.563758] usb 6-1.2.1.4: SerialNumber: 12345
[ 2473.572303] cfg80211: Calling CRDA to update world regulatory domain
[ 2473.580727] usb 6-1.2.1.4: ath9k_htc: Firmware - htc_7010.fw not found
[ 2473.580732] ath9k_htc: probe of 6-1.2.1.4:1.0 failed with error -22
[ 2473.580742] usbcore: registered new interface driver ath9k_htc

“htc_7010.fw not found”

On a un début de réponse là: http://wiki.debian.org/ath9k_htc

# aptitude versions firmware-atheros
p   0.28+squeeze1                                                  stable                                      500 
p   0.35~bpo60+1                                                   squeeze-backports                           100 

Comme g un noyau 3.2 et que les backports sont disponibles:

# aptitude -t squeeze-backports install firmware-atheros

Je rebranche :

[ 3674.292471] usb 6-1.2.1.4: USB disconnect, device number 10
[ 3818.224944] usb 6-1.2.1.4: new high-speed USB device number 11 using ehci_hcd
[ 3818.333691] usb 6-1.2.1.4: New USB device found, idVendor=0cf3, idProduct=7015
[ 3818.333696] usb 6-1.2.1.4: New USB device strings: Mfr=16, Product=32, SerialNumber=48
[ 3818.333699] usb 6-1.2.1.4: Product: USB WLAN
[ 3818.333701] usb 6-1.2.1.4: Manufacturer: ATHEROS
[ 3818.333703] usb 6-1.2.1.4: SerialNumber: 12345
[ 3818.446215] usb 6-1.2.1.4: ath9k_htc: Transferred FW: htc_7010.fw, size: 72992
[ 3818.507430] ath9k_htc 6-1.2.1.4:1.0: ath9k_htc: HTC initialized with 45 credits
[ 3818.634017] ath9k_htc 6-1.2.1.4:1.0: ath9k_htc: FW Version: 1.3
[ 3818.634020] ath: EEPROM regdomain: 0x809c
[ 3818.634022] ath: EEPROM indicates we should expect a country code
[ 3818.634025] ath: doing EEPROM country->regdmn map search
[ 3818.634027] ath: country maps to regdmn code: 0x52
[ 3818.634029] ath: Country alpha2 being used: CN
[ 3818.634031] ath: Regpair used: 0x52
[ 3818.636811] ieee80211 phy0: Atheros AR9287 Rev:2
[ 3818.637287] Registered led device: ath9k_htc-phy0
[ 3818.637291] usb 6-1.2.1.4: ath9k_htc: USB layer initialized

tools

# aptitude install wireless-tools
# /sbin/iwconfig 
...
wlan0     IEEE 802.11bgn  ESSID:off/any  
          Mode:Managed  Access Point: Not-Associated   Tx-Power=0 dBm   
          Retry  long limit:7   RTS thr:off   Fragment thr:off
          Encryption key:off
          Power Management:off
...

Si iwconfig ne retourne pas d'informations associé à l'interface wifi (qui peut avoir un autre nom), alors il y a un problème.

wep

Non merci.

wap

# aptitude install wpasupplicant

Préparer un fichier de conf dans /etc/wpa_supplicant/wpa_supplicant.conf et contenant (adapter) :

eapol_version=1    
ap_scan=1    
fast_reauth=1    

network={    
  ssid="<LE_SSID>"    
  scan_ssid=1    
  proto=WPA    
  key_mgmt=WPA-PSK    
  psk="<CLE_PARTAGE>"    
  priority=5    
}

Modifier /etc/network/interfaces afin d'avoir :

# --- Wifi ---
# Test

allow-hotplug wlan0
iface wlan0 inet dhcp
  wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf

# ------------

On peut monter l'interface: (attention, ca va couper!)

# ifup wlan0
...
DHCPDISCOVER on wlan0 to 255.255.255.255 port 67 interval 8
DHCPOFFER from 192.168.86.2
DHCPREQUEST on wlan0 to 255.255.255.255 port 67
DHCPREQUEST on wlan0 to 255.255.255.255 port 67
DHCPACK from 192.168.86.2
bound to 192.168.86.195 -- renewal in 4560 seconds.

Vérifions la connectivité wifi:

# iwconfig wlan0
wlan0     IEEE 802.11bgn  ESSID:"FREEBOX_V7"  
          Mode:Managed  Frequency:2.462 GHz  Access Point: 00:24:D4:xx:xx:xx   
          Bit Rate=78 Mb/s   Tx-Power=20 dBm   
          Retry  long limit:7   RTS thr:off   Fragment thr:off
          Encryption key:off
          Power Management:off
          Link Quality=47/70  Signal level=-63 dBm  
          Rx invalid nwid:0  Rx invalid crypt:0  Rx invalid frag:0
          Tx excessive retries:0  Invalid misc:2   Missed beacon:0

Et voila.

Si on maintient un usage avec “dhcp”, alors il est bien d'installer aussi le package resolvconf qui mettra à jour le fichier /etc/resolv.conf en fonction des reponses des serveurs “dhcp”.

On peut aussi mettre une ip fixe… as usual.

access point

Liens:

Comme j'ai une clé USB, je vais faire en sorte que l'ensemble fonctionne que si la clé est branché.

De toutes les façons, un daemon dhcpd ou hostapd sans interface wlan, ça fonctionne mal.

Donc, ça va être un peu different de ce que j'ai pu glané sur le Net.

reseau wifi

On va poser un subnet, par exemple:

subnet: 10.10.10.192/26
gateway: 10.10.10.193

La machine hébergeant l'access-point est aussi la gateway…

serveur dhcp

Il faudra fournir des IP, donc on a besoin d'un serveur dhcp:

# aptitude install dhcp3-server

Mais on ne va l'utiliser en daemon, on va l'associé à l'interface wlan.

Voici la conf, dans /etc/dhcp/dhcpd-wlan0.conf :

ddns-update-style none;

option domain-name "wifi.local.thierry-jaouen.fr";
option domain-name-servers ns.local.thierry-jaouen.fr, 8.8.8.8, 8.8.4.4;

default-lease-time 600;
max-lease-time 7200;

log-facility local7;

subnet 10.10.10.192 netmask 255.255.255.192 {
      range 10.10.10.208 10.10.10.254;
      option domain-name "wifi.local.thierry-jaouen.fr";
      option domain-name-servers 8.8.8.8, 8.8.4.4;
      option routers 10.10.10.193;
}

C'est surtout la section “subnet” l'important.

Donc:

  • les IP vont être alloué entre 208 et 254 sans le subnet 10.10.10.192/26.
  • on donne les DNS de google et la gateway est l'“access point” lui-même.

Dés que l'interface “wlan” sera monté, on démarrera le daemon ainsi:

/usr/sbin/dhcpd -4 -q -pf /var/run/dhcpd-wlan0.pid -cf /etc/dhcp/dhcpd-wlan0.conf wlan0

Et on l’arrêtera ainsi:

/bin/kill -SIGTERM $( cat /var/run/dhcpd-wlan0.pid )

installer ap

# aptitude install hostapd

Voici la conf que j'ai mis la dedans: /etc/hostapd# cat hostapd-wlan0.conf

interface=wlan0
driver=nl80211
hw_mode=g
ssid=<SSID>
channel=11
ctrl_interface=/var/run/hostapd-wlan0
ctrl_interface_group=root
macaddr_acl=0
auth_algs=1
ignore_broadcast_ssid=0
wpa=2
wpa_key_mgmt=WPA-PSK
wpa_pairwise=TKIP
rsn_pairwise=CCMP
wpa_passphrase=<SECRET>
wpa_ptk_rekey=600

Il faut fournir un “<SSID>” et un “<SECRET>” (d'au moins 8 caractères).

En résumé: Wifi mode G , wpa2 a secret partagé…

On démarrera ce daemon ainsi:

/usr/sbin/hostapd -B -P /var/run/hostapd-wlan0.pid /etc/hostapd/hostapd-wlan0.conf

Pour l'arrêté , on fera ainsi:

/bin/kill -SIGTERM $( cat /var/run/hostapd-wlan0.pid )

interfaces

Et enfin, on configure l'interface wlan dans /etc/network/interfaces en mettant:

allow-hotplug wlan0
iface wlan0 inet static
      address 10.10.10.193
      netmask 255.255.255.192
      up /usr/sbin/dhcpd -4 -q -pf /var/run/dhcpd-$IFACE.pid -cf /etc/dhcp/dhcpd-$IFACE.conf $IFACE
      up /usr/sbin/hostapd -B -P /var/run/hostapd-$IFACE.pid /etc/hostapd/hostapd-$IFACE.conf 
      down /bin/kill -SIGTERM $( cat /var/run/hostapd-$IFACE.pid ) 
      down /bin/kill -SIGTERM $( cat /var/run/dhcpd-$IFACE.pid )

Donc, c'est la gateway et on lui attribue , de force, l'IP de la gateway.

On a remplacé “wlan0” par “$IFACE” , qui sera substitué au automatiquement par le nom de l'interface, en l’occurrence: wlan0

A ce stade, lorsqu'on branche la clé, le serveur dhcpd et hostapd se lance aussi sur l'interface wlan0.

On devrait pouvoir s'associé en Wifi (avec le SSID et le SECRET qui va bien) .

On devrait obtenir une IP.

Mais on ne peut pas encore surfer: voir la suite.

NAT

La topologie du réseau est simple:

  • eth0 : l'interface dans mon LAN, avec en sortie vers le Net, une FreeBox.
  • wlan0 : l'interface wifi.

forward

Autoriser le forward entre les interfaces:

Editer un fichier par exemple: /etc/sysctl.d/local.conf , et ajouter dedans:

# Les requetes ARP ne traversent pas
net.ipv4.conf.all.arp_ignore=1
# Activer forward
net.ipv4.ip_forward=1

Appliquer immediatement (et ça le sera aussi a chaque reboot):

# sysctl -p /etc/sysctl.d/local.conf

Dans la foulé, il faut aussi mettre des règles iptables…

ferm

Comme a mon habitude, j'utilise ferm , une surcouche d'Iptables, pour composer les règles.

# modprobe ip_tables

Ajouter aussi dans /etc/modules :

ip_tables

Et eventuellement aussi:

ip_conntrack_ftp
ip_nat_ftp
# ip_conntrack_irc
ip_nat_pptp
ip_conntrack_pptp
# aptitude install ferm

Editer le fichier de conf, /etc/ferm/ferm.conf , et mettre un truc pas trop facho.

@def $LAN_IF=eth0;
@def $LAN_IP=192.168.1.10;

@def $WLAN_IF=wlan0;
@def $WLAN_NETWORK=10.10.10.192/26;

# ce n'est pas un firewall:
chain ( INPUT OUTPUT FORWARD ) policy ACCEPT;

# pour faire simple:
table nat chain POSTROUTING of $LAN_IF saddr $WLAN_NETWORK SNAT to $LAN_IP;

# mais comme on est en wifi,
# et qu'on veut pas spécialement ce faire piraté son LAN...

# si on n'est pas dans le bon subnet, on drop:
chain FORWARD if $WLAN_IF saddr ! $WLAN_NETWORK DROP;

# si on veut atteindre un subnet local, on DROP:
# sauf pour ping ma freebox (gateway vers le net)
chain FORWARD if $WLAN_IF {
  daddr 192.168.1.254 proto icmp icmp-type echo-request ACCEPT;
  daddr ( 192.168.0.0/16 172.16.0.0/12 10.0.0.0/8 ) DROP;
}

# si on veut causer avec la gateway, on drop, sauf le ping (c'est cool):
chain INPUT if $WLAN_IF {
  proto icmp icmp-type echo-request ACCEPT;
  DROP;
}

Appliquer immédiatement:

# ferm -i ferm.conf

(Confirmer que tout va bien en tapant: “yes” )

Et voila.

Le forward est autorisé et lorsqu'on sort (POSTROUTING) de l'interface reseau, l'IP source est transformé (SNAT) en l'IP de l'interface du “LAN”. ( “MASQUERADE” est plus adapté sur une interface qui n'a pas d'IP fixe ).

Et puis on ajoute deux ou trois bricoles pour le cas où le reseau wifi serait totalement ouvert ! Qu'il aillent sur le Net, mais pas dans mon reseau :-)

Voila.

blog/2012/07/20/wifi_tl-wn821n_debian.txt · Dernière modification : 2012/08/02 11:58 de thierry