Instalacja Hostapd

Wymagane do użytkowania karty WiFi jako AccessPoint'a to posiadanie karty wspierającej tego typu tryb pracy. Popularne są karty oparte na chipset'cie Atheros, które w systemi Linux widoczne są jako ath5 lub ath9k (moduły). Do użytkowania trybu AP w karcie wymagane jest jeszcze posiadanie jądra z odpowienimi modułami, tj. nl80211. Obecne, testingowe jądra Debian'a najprawdopodobniej je posiadają. W przypadku ich braku, należy manualnie dokonać kompilacji jądra.

Początkowo, wykonujemy co następuje:

aptitude install hostap

Kolejno edytujemy (tworzymy, jak brak) plik /etc/hostapd.conf

# Ustawienie interfejsu
interface=wlan0
# Wymagany do obsługi AP moduł. Możliwe są inne,
# jak prism czy madwifi (patrz: example z /usr/share/docs/..)
driver=nl80211
# Komunikaty daemona.
logger_syslog=-1
logger_syslog_level=2
logger_stdout=-1
logger_stdout_level=2
dump_file=/tmp/hostapd.dump
ctrl_interface=/var/run/hostapd
ctrl_interface_group=0
# Tryb pracy. Testowane tylko na b i g.
# W przypadku n na ath9k wysypywał się.
hw_mode=g
# Kanał od 0 do 13 (bodajże).
channel=6
# Tryb pracy zabezpieczeń
wpa=1
# Łatwiejszy sposób, możliwe też jest shared key kilkunasto-znakowy.
# Dla passphrase wymagane minimum 8 znaków w tym litery oraz cyfry
wpa_passphrase=magicKey0
# Nazwa widoczna dla innych
ssid=AP

Ażeby sprawdzić poprawność konfiguracji, należy jako root wpisać w konsoli

hostapd -dddd /etc/hostapd.conf

Po chwili ujrzymy kolejno

student:/home/paoolo# hostapd -dddd /etc/hostapd.conf 
Configuration file: /etc/hostapd.conf
ctrl_interface_group=0
Opening raw packet socket for ifindex -1215631258
BSS count 1, BSSID mask ff:ff:ff:ff:ff:ff (0 bits)
SIOCGIWRANGE: WE(compiled)=22 WE(source)=21 enc_capa=0xf
nl80211: Added 802.11b mode based on 802.11g information
Allowed channel: mode=1 chan=1 freq=2412 MHz max_tx_power=20 dBm
Allowed channel: mode=1 chan=2 freq=2417 MHz max_tx_power=20 dBm
Allowed channel: mode=1 chan=3 freq=2422 MHz max_tx_power=20 dBm
Allowed channel: mode=1 chan=4 freq=2427 MHz max_tx_power=20 dBm
Allowed channel: mode=1 chan=5 freq=2432 MHz max_tx_power=20 dBm
Allowed channel: mode=1 chan=6 freq=2437 MHz max_tx_power=20 dBm
Allowed channel: mode=1 chan=7 freq=2442 MHz max_tx_power=20 dBm
Allowed channel: mode=1 chan=8 freq=2447 MHz max_tx_power=20 dBm
Allowed channel: mode=1 chan=9 freq=2452 MHz max_tx_power=20 dBm
Allowed channel: mode=1 chan=10 freq=2457 MHz max_tx_power=20 dBm
Allowed channel: mode=1 chan=11 freq=2462 MHz max_tx_power=20 dBm
Allowed channel: mode=0 chan=1 freq=2412 MHz max_tx_power=20 dBm
Allowed channel: mode=0 chan=2 freq=2417 MHz max_tx_power=20 dBm
Allowed channel: mode=0 chan=3 freq=2422 MHz max_tx_power=20 dBm
Allowed channel: mode=0 chan=4 freq=2427 MHz max_tx_power=20 dBm
Allowed channel: mode=0 chan=5 freq=2432 MHz max_tx_power=20 dBm
Allowed channel: mode=0 chan=6 freq=2437 MHz max_tx_power=20 dBm
Allowed channel: mode=0 chan=7 freq=2442 MHz max_tx_power=20 dBm
Allowed channel: mode=0 chan=8 freq=2447 MHz max_tx_power=20 dBm
Allowed channel: mode=0 chan=9 freq=2452 MHz max_tx_power=20 dBm
Allowed channel: mode=0 chan=10 freq=2457 MHz max_tx_power=20 dBm
Allowed channel: mode=0 chan=11 freq=2462 MHz max_tx_power=20 dBm
RATE[0] rate=10 flags=0x2
RATE[1] rate=20 flags=0x6
RATE[2] rate=55 flags=0x4
RATE[3] rate=110 flags=0x4
Passive scanning not supported
Mode: IEEE 802.11b  Channel: 2  Frequency: 2417 MHz
Flushing old station entries
Deauthenticate all stations
Using interface wlan0 with hwaddr 00:02:e3:48:43:01 and ssid 'AP'
SSID - hexdump_ascii(len=2):
     41 50                                             AP              
PSK (ASCII passphrase) - hexdump_ascii(len=10):
     30 30 30 30 30 30 61 62 61 63                     000000abac      
PSK (from passphrase) - hexdump(len=32): db 0a 93 2d ba 34 ce 46 f4 99 c5 fa a4 fb 38 4f 93 a1 99 37 80 3d 8d bf 30 5f b2 7b 23 7f dc 2a
WPA: group state machine entering state GTK_INIT (VLAN-ID 0)
GMK - hexdump(len=32): [REMOVED]
GTK - hexdump(len=32): [REMOVED]
WPA: group state machine entering state SETKEYSDONE (VLAN-ID 0)
wlan0: Setup of interface done.
MGMT (TX callback) ACK
STA c4:17:fe:46:8c:f5 sent probe request for our SSID
MGMT (TX callback) ACK
mgmt::proberesp cb
^CSignal 2 received - terminating
Flushing old station entries
Deauthenticate all stations

Lub coś podobnego. Komunikaty MGMT i STA świadczą o fakcie próby uzyskania SSID naszego Access Point'a. W przypadku autoryzacji do AP, będą poprzedzone komunikatami WPA, PSK itd.

W razie komunikatów o błędzie konfiguracji (linijka i co stanowi problem) należy dokładnie przestudiować ów komunikat, bo np. w przypadku linijki driver=*** prawdopodobnie będzie to z przyczyny braku odpowiednich modułów w jądrze (co spotykane jest w kernelach dystrybucyjnych poniżej 2.6.32, obecne testingowe posiadają go)

Jeśli jednak hostapd komunikuje o totalnym braku prawidłowego pliku konfiguracyjnego, to prawdopodobnie z powodu formatowania linijek (każda zaczynająca się od # to komentarz, musi być na pierwszym miejscu, zaś jeśli to linijka konfiguracji to na pierwszym miejscu linijki musi zaczynać się ona - hostapd nie pomija białych znaków w takim przypadku, wszelkie tab'y, pojedyncze spacje na początku linijki odpowiedzialnej za konfigurację powodują błąd w parsowaniu pliku.

Kolejno w /etc/init.d/hostapd, linijka wskazująca na config daemona

DAEMON_CONF=/etc/hostapd.conf

Teoretycznie poprawność startu z /etc/init.d/hostapd można wykonać już teraz poprzez

/etc/init.d/hostapd start

W listingu ifconfig powinno być oprócz wlan0 także i mon.wlan0. Zaś iwconfig wlan0 określi jako Master, zaś mon.wlan0 jako Monitor co widać poniżej

wlan0     IEEE 802.11bg  Mode:Master  Frequency:2.417 GHz  Tx-Power=20 dBm   
          Retry  long limit:7   RTS thr:off   Fragment thr:off
          Power Management:off

mon.wlan0  IEEE 802.11bg  Mode:Monitor  Frequency:2.417 GHz  Tx-Power=20 dBm   
          Retry  long limit:7   RTS thr:off   Fragment thr:off
          Power Management:off

Prymitywny skrypcik do obsługi forwardu, DHCP i hostap przy pomocy jednego polecenia (plik: /etc/init.d/ap, po zapisaniu dać chmod +x /etc/init.d/ap)

#!/bin/bash

### BEGIN INIT INFO
# Provides:          ap
# Required-Start:    $local_fs
# Required-Stop:     $local_fs
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Setting Hostapd
### END INIT INFO

[ -x /usr/sbin/hostapd ] || exit 0

. /lib/lsb/init-functions


start() {
#  /etc/init.d/wicd stop
  ifup wlan0
  /etc/init.d/isc-dhcp-server start
  /etc/init.d/iptables forward $1 wlan0 192.168.10.0/24
  /etc/init.d/hostapd start
}

stop() {
  /etc/init.d/hostapd stop
  /etc/init.d/iptables disforward
  /etc/init.d/isc-dhcp-server stop
  ifdown wlan0
#  /etc/init.d/wicd start
}

case "$1" in
  start)
    if [ $# -eq 2 ]; then
      echo "Starting AP... "
      start $2
      echo "done."
    fi
    ;;
  stop)
    echo "Stopping AP... "
    stop
    echo "done."
    ;;
  *)
    echo "Usage {start|stop}"
    exit 0
    ;;
esac

Konfiguracja interfejsu wlan0 w /etc/network/interfaces

iface wlan0 inet static
    address 192.168.10.1
    netmask 255.255.255.0

Konfiguracja dhcp w /etc/dhcp/dhcpd.conf

option domain-name-servers 217.98.63.164;

[...]

subnet 192.168.10.0 netmask 255.255.255.0 {
   range 192.168.10.2 192.168.10.32;
   option routers 192.168.10.1;
}

Prymitywny skrypcik do obsługi iptables (na sztywno pewne sprawy są, plik: /etc/init.d/iptables, po zapisaniu dać chmod +x /etc/init.d/iptables)

#!/bin/sh
### BEGIN INIT INFO
# Provides:          iptable
# Required-Start:    $local_fs
# Required-Stop:     $local_fs
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Setting Iptables
### END INIT INFO

[ -x /sbin/iptables ] || exit 0

. /lib/lsb/init-functions

clean() {
  iptables -F
  iptables -X
  iptables -t nat -X
  iptables -t nat -F
  iptables -t mangle -F
  iptables -t mangle -X
  echo -n "clean up rules.. "
}

disable() {
  iptables -P INPUT ACCEPT
  iptables -P FORWARD ACCEPT
  iptables -P OUTPUT ACCEPT
  echo -n "disable default control.. "
}

enable() {
  iptables -P INPUT DROP
  iptables -P INPUT DROP
  iptables -P OUTPUT ACCEPT
  echo -n "enable default control.. "
}

related() {
  iptables -A INPUT -j ACCEPT -m state --state ESTABLISHED,RELATED
  iptables -A INPUT -i lo -j ACCEPT
  iptables -A OUTPUT -j ACCEPT -m state --state ESTABLISHED,RELATED
  echo -n "allow for established, related.. "
}


start() {
  # czyszczenie po kims
  clean

  # ustawienie domyslnej polityki
  enable

  # utrzymanie polaczen nawiazanych
  related
}

stop() {
  # czyszczenie
  clean

  # wylaczenie firewall
  disable
}

forward() {
  # wlaczenie w kernelu forwardowania
  echo 1 > /proc/sys/net/ipv4/ip_forward
  echo -n "enabling forwarding.. "

  # dostep do dhcp server
  iptables -A INPUT -i wlan0 -p udp --dport 67 -j ACCEPT
  echo -n "enable dhcp.. "

  # udostepniaie internetu w sieci lokalnej
  iptables -A FORWARD -j ACCEPT -m state --state ESTABLISHED,RELATED
  iptables -A FORWARD -i $1 -o $2 -j ACCEPT
  iptables -A FORWARD -i $2 -o $1 -j ACCEPT
  echo -n "crossing iptables from $1 to $2.. "

  iptables -t nat -A POSTROUTING -s $3 -j MASQUERADE
  iptables -A FORWARD -s $3 -j ACCEPT
  iptables -A INPUT -s $3 -j ACCEPT
  echo -n "setting NAT for $3.. "
}

disforward() {
  # wylaczenie forward
  echo 0 > /proc/sys/net/ipv4/ip_forward

  # czyszczenie
  clean

  # przywrocenie
  related
}

case "$1" in
  enable)
    echo -n "Enable firewall... "
    enable
    echo "done."
    ;;
  disable)
    echo -n "Disable firewall... "
    disable
    echo "done."
    ;;
  start)
    echo -n "Starting iptables... "
    start
    echo "done."
    ;;
  stop)
    echo -n "Stoping iptables... "
    stop
    echo "done."
    ;;
  restart)
    echo -n "Restarting iptables... "
    stop
    start
    echo "done."
    ;;
  forward)
    if [ $# -eq 1 ]; then
      echo "No param. Abort!"
    else
      echo -n "Enabling forwarding... "
      forward $2 $3 $4
      echo "done."
    fi
    ;;
  disforward)
    echo -n "Disable forwarding... "
    disforward
    echo "done."
    ;;
  *)
    echo "Usage $0 {enable|disable|start|stop|restart|forward}"
    exit 0
    ;;
esac

Aby /etc/init.d/iptables sam startował (do pracy firewall'a) należy jeszcze

update-rc.d iptables default

Zaś aby /etc/init.d/hostapd nie startował wraz z systemem (a wtedy gdy to koniecznie czyli wraz z poleceniem /etc/init.d/ap start) to

update-rc.d hostapd remove

Zaś /etc/init.d/ap startuje przy pomocy /etc/init.d/ap start iface, gdzie iface to interfejs na świat.