18 октября 2012 г.

Создаем быструю WiFi-точку доступа из USB-свистка

Как создавать точку доступа  на домашнем шлюзе, я уже описывал ранее. Теперь хотелось бы описать более конкретный случай поднятия "оперативной" точки доступа из соответствующего USB-адаптера (например с "рабочей" машины необходимо обеспечить доступ в интернет с телефона или планшета, а корпоративной точки доступа нет, ну или банально перекинуть файлы на эти устройства, а кабеля под рукой нет). Ну что ж, приступим. Все операции проводятся на системе Ubuntu 12.04 (т.е. все операции будут полностью совместимы с любыми Debian-based дистрибутивами).

В качестве USB-свистка использовался Edimax EW-7722UTn. Обратите внимание на то, что чип в адаптере обязательно должен поддерживать режим AP. Узнать это можно, вставив сам адаптер и выполнив в консоли:

$ sudo apt-get install iw
$ iw phy

Найдя строку "Supported interface modes:", посмотрите, есть ли там "AP". Если есть, то адаптер поддерживает необходимый нам режим работы. Для примера, для нашего адаптера этот список выглядит следующим образом:

Supported interface modes:
         * IBSS
         * managed
         * AP
         * AP/VLAN
         * WDS
         * monitor
         * mesh point

Убедившись в поддержке режима, можно приступать к конфигурации. Она не займет много времени. Для начала установим необходимые пакеты:

$ sudo apt-get install udhcpd hostapd

Далее настроим WiFi-интерфейс на работу со статической конфигурацией. 

$ nano /etc/network/interfaces

И добавляем туда такие строки:

allow-hotplug wlan0
iface wlan0 inet static
address 192.168.139.1
netmask 255.255.255.0

Обратите внимание, что ваш интерфейс может быть и не wlan0 (обычно в случае, если в компьютере уже были когда-либо установлены другие wifi-адаптеры), но в большинстве случаев адрес именно wlan0.
Теперь можно приступить к настройке фаервола на работу с NAT, а также IP-форвардинг. Делается это очень просто:

$ sudo iptables -t nat -A POSTROUTING -s 192.168.139.0/24 -j MASQUERADE
$ sudo iptables -t mangle -A FORWARD -o eth0 -p tcp -m tcp --tcp-flags SYN,RST SYN -m tcpmss --mss 1440:65495 -j TCPMSS --clamp-mss-to-pmtu

eth0 - это адрес сетевого интерфейса, с которого машина выходит в интернет; 192.168.139.0/24 - сеть для которой будет разрешен NAT. Разумеется, что вы можете вписать сюда какую угодно сеть, которая Вам будет удобна (например чтобы избежать конфликтов маршрутизации в вашей корпоративной сети, если она сконфигурирована на эту же подсеть) из частного диапазона адресов (10.*.*.*, 192.168.*.*, 172.16.*.*, 169.254.*.*). Дабы правила фаервола не потерялись после перезагрузки, их можно сохранить с помощью:

$ sudo iptables-save >/etc/iptables.conf

И добавить в /etc/rc.local (перед exit 0) следующее:

/sbin/iptables-restore </etc/iptables.conf

Далее настроим IP-форвардинг:

$ sudo nano /etc/sysctl.conf

Раскомментируем строки: net.ipv4.ip_forward=1 и net.ipv4.tcp_syncookies=1, сохраняем файл. Применяем изменения:

$ sudo sysctl -p

Теперь приступим к настройке hostapd (программы точки доступа). Редактируем конфиг:

$ sudo nano /etc/hostapd/hostapd.conf

interface=wlan0
driver=nl80211
ssid=inox_ap
hw_mode=g
channel=7
wpa=3
wpa_passphrase=muzon8850
wpa_key_mgmt=WPA-PSK
wpa_pairwise=CCMP
rsn_pairwise=CCMP
ieee80211n=1
ht_capab=[SHORT-GI-20][SHORT-GI-40][HT40+][TX-STBC][RX-STBC12]
wpa_group_rekey=3600

Параметры описывать не буду, т.к. они уже были описаны мною ранее в статье по настройке шлюза на базе Linux. Теперь нам осталось только настроить DHCP-сервер udhcpd. 

$ sudo nano /etc/udhcpd.conf

start         192.168.139.2
end           192.168.139.12
interface     wlan0
opt    dns    10.128.8.1 8.8.8.8
option subnet 255.255.255.0
opt    router 192.168.139.1
option dns    8.8.4.4 # Третий DNS (если нужен)
option lease  86400

На последок включаем сервисы (показано верное содержимое файлов).

$ cat /etc/default/hostapd
DAEMON_CONF="/etc/hostapd/hostapd.conf"

$ cat /etc/default/udhcpd
DHCPD_ENABLED="yes"

И создаем удобный скрипт для запуска  и остановки точки доступа:

$ cat ~/wifiap
#!/bin/bash
case "$1" in
    start)
    echo "Configuring WLAN interface..."
    sudo ifconfig wlan0 down && sleep 1 && sudo ifup -v wlan0
    echo "Starting needed services...."
    sudo /etc/init.d/hostapd start
    sudo /etc/init.d/udhcpd start
    ;;

    stop)
    echo "Stopping needed services..."
    sudo /etc/init.d/hostapd stop
    sudo /etc/init.d/udhcpd stop
    echo "Deconfiguring WLAN interfaces..."
    sudo ifdown wlan0
    ;;

    *)
    echo "WLAN FastAP v0.1"
    echo "Valid script parameters are: start, stop"
    ;;
esac

Сохраняем его в удобном месте и делаем ссылку в /usr/bin чтобы можно было запускать в любом месте, а также делаем его исполняемым.

$ chmod +x /full/path/to/script && sudo ln -s /full/path/to/script /usr/bin/wifiap

/full/path/to/script - соответственно ПОЛНЫЙ путь к данному скрипту.

Теперь можно точку доступа можно запускать так: 

$ wifiap start

Останавливать так:

$ wifiap stop