Делаем софтовую точку доступа (Soft AP) [Инструкция]

Автор CoolAller, 18 ноября 2015, 19:10:15

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

CoolAller

Инструкция предназначена для Debian-based дистрибутивов, но работает и на других.

Нам понадобится hostapd — для раздачи wi-fi, dnsmasq — для раздачи ip-адресов и notify-send (libnotify-bin) — для вывода на экран оповещений. iptables на данный момент доступен из коробки.

Устанавливаем hostapd:
sudo aptitude install hostapdОстанавливаем его:
Если используется Systemd, останавливаем командой:
sudo systemctl stop hostapdЕсли используется Sysvinit, останавливаем командой:
sudo service hostapd stop
В файле /etc/default/hostapd раскомментируем и исправляем строку:
DAEMON_CONF="/etc/hostapd/hostapd.conf"
Смотрим название Ваших сетевых интерфейсов при помощи команды: ifconfig.

Создаем и редактируем файл /etc/hostapd/hostapd.conf
interface=wlan0
driver=nl80211
ssid=Internet
hw_mode=g
ieee80211n=1   #Для включения режима n, не отменяет необходимость предыдущей строки hw_mode=g. Если не планируется использование режима n, то строку ieee80211n не пишем)
channel=6   #В режиме n 2.4GHz доступны 3 неперекрывающихся канала: 1, 6, 11. Для автоматического выбора канала на основе ACS алгоритма, hostapd должен быть собран с опцией CONFIG_ACS=y (в настоящий момент в Debian репозитоиях hostapd собран с этой опцией), для активации автовыбора укажите channel=acs_survey или channel=0
wpa=2
wpa_passphrase=12345678
wpa_key_mgmt=WPA-PSK
wpa_pairwise=TKIP
rsn_pairwise=CCMP
auth_algs=1
macaddr_acl=0

В графе wpa_passphrase не забудьте изменить пароль на свой.
В общем-то тут все просто — имя точки доступа, пароль, канал, на котором будет работать и драйвер.

*Примечание: Если ваша сетевая карта имеет чипсет RTL8192CU, установите драйвер hostapd-rtl871xdrvAUR и в hostapd.conf замените driver=nl80211 на driver=rtl871xdrv

Краткое описание режимов и дополнительные опции
driver=nl80211 - так называется тип драйвера относящийся к типу mac80211. В таблице можно посмотреть что подходит под этот тип. (Чипсеты ralink подходят).
macaddr_acl=0 - точка принимает всех клиентов, если их mac адресов нет в "черном списке". Файл "черного списка" в файле /etc/hostapd.deny. Также файл можно переопределить в конфиге переменной deny_mac_file=/etc/имя_файла. Если указать macaddr_acl=1, то будем отклонять каждого клиента кто не задан в файле accept_mac_file=/etc/hostapd.accept.
ssid=Internet - имя точки доступа.
channel=6 -  обратите особое внимание на канал n, на частоте 2.4 GHz всего 3 основных канала - 1, 6 и 11. Для автоматического выбора канала на основе ACS алгоритма, hostapd должен быть собран с опцией CONFIG_ACS=y (в настоящий момент в Debian репозитоиях hostapd собран с этой опцией), для активации автовыбора укажите channel=acs_survey или channel=0
hw_mode=g - режим работы точки в IEEE 802.11g (2.4 GHz), теоретическая пропускная способность 54 Мбит/с. Обязательно указывать даже при стандарте N, если не указать, то по умолчанию будет использоваться IEEE 802.11b (2,4 GHz), теоретическая пропускная способность 11 Мбит/с.
hw_mode=a - режим работы точки в IEEE 802.11a (5 GHz), теоретическая пропускная способность 54 Мбит/с.
ieee80211ac=1 - режим работы точки в IEEE 802.11ac (5 GHz), теоретическая пропускная способность 1300 Мбит/с.
ieee80211n=1 - указывает режим работы точки в IEEE 802.11n, (2,4/ 2,4 и 5 GHz), теоретическая пропускная способность от 150 Мбит/с до 450 Мбит/с в зависимости от адаптера.
wmm_enabled=1 - режим приоритета мультимедиа трафика.
auth_algs=1 - значение 1 позволяет использовать только алгоритмы аутентификации WPA2. Значение 2 означает WEP. Никогда не используйте шифрование WEP (Wired Equivalent Privacy), поскольку оно давно взломано. Значение 3 позволяет использовать оба алгоритма.
ignore_broadcast_ssid=0 - значение 0 означает, что SSID сети виден всем, значение 1 - скрывает SSID сети.
wpa=2 - опции WPA шифрования. Значение 1 означает использовать только WPA1, при значении 2 можно использовать только WPA2, при значении 3 можно использовать WPA и WPA2.
wpa_passphrase=password_wifi_key - наша парольная фраза.
wpa_key_mgmt=WPA-PSK - указывает алгоритмы ключей шифрования, которые вы хотите разрешить. Вы можете выбрать WPA-PSK, WPA-EAP или оба варианта. PSK означает Pre-Shared Key (предварительно распространенные ключи). EAP означает Extensible Authentication Protocol — расширяемый протокол аутентификации, представляющий собой систему, поддерживающую множество разных методов аутентификации. Для вашей компактной конфигурации с предварительно распространенными ключами он не понадобится.
wpa_pairwise=CCMP TKIP - принимаемые парные алгоритмы шифрования для RSN/WPA(v1).
rsn_pairwise=CCMP - принимаемые парные алгоритмы шифрования для RSN/WPA2 rsn_pairwise=CCMP
(CCMP — протокол шифрования 802.11i созданный для замены TKIP, обязательного протокола шифрования в WPA и WEP, как более надёжный вариант. CCMP является обязательной частью стандарта WPA2, и необязательной частью стандарта WPA.). wpa_pairwise и rsn_pairwise показывают, какие шифры можно использовать для шифрования данных; можно использовать CCMP, TKIP или оба. CCMP значительно устойчивей, чем TKIP, поэтому можно попробовать разрешить только CCMP. Клиенты Windows печально известны капризностью и проблемами при использовании стойких шифров, поэтому для них лучше разрешить TKIP.
wmm_enabled=1 - поддержка QoS.
[свернуть]

Совет по выбору канала
При ручном выборе канала для вашей точки досупа, выбирайте наименее забитые каналы и каналы где присутствует наибольшее отрицательное dBm. Более детально можно прочитать здесь.
Для выбора канала, окружающие ваc сети можно посмотреть командой:
sudo iw dev wlan0 scanИли воспользоваться программой LinSSID (доступна для Debian x64)
[свернуть]

Устанавливаем dnsmasq:
sudo aptitude install dnsmasqОстанавливаем его:
Если используется Systemd, то останавливаем командой:
sudo systemctl stop dnsmasqЕсли используется Sysvinit:
sudo service dnsmasq stop
dnsmasq хорош тем, что в нем все есть и он прост для настройки. Открываем файл конфигурации /etc/dnsmasq.conf и вписываем в него строки:
interface=wlan0
dhcp-range=192.168.2.2,192.168.2.100,12h

Если необходимо, можно добавить альтернативный DNS сервер, а также можно хосты принудительно направлять на 127.0.0.1, тем самым блокируя их. Подробности в справке man dnsmasq. Еще один момент, обязательно адреса dhcp-range должны быть в одной сети с wlan0. если Вы по каким-либо соображениям в скрипте запуска не будете принудительно менять ip адрес для wlan0, то укажите тут пул такой же, как в wlan0. Например дома есть роутер с адресом 192.168.1.1 и сеть 192.168.1.0/24, то dhcp-range нужно указать в пределах этого пространства, а также, чтобы он не пересекался с пулом адресов, выдаваемых dhcp-сервером роутера. Мы пойдем путем по-проще и сами укажем другую подсеть.

Теперь отключим автозагрузку демонов:
Если используется Systemd:
sudo systemctl disable hostapd
sudo systemctl disable dnsmasq
Если используется Sysvinit:
sudo update-rc.d hostapd disable
sudo update-rc.d dnsmasq disable

Ко всему этому осталось только включать/отключать роутинг и добавлять/удалять правило для iptables, скрипт будет ниже, здесь пояснения:

#Включаем роутинг:
sysctl net.ipv4.ip_forward=1
#Опция MASQUERADE для исходящих пакетов заменяет IP-адрес источника на адрес интерфейса, с которого уходит пакет (интерфейс ppp0 по необходимости можно заменить на другой, например, eth0 и т.д.).
iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE
#Для решения проблем с PMTU (описание проблемы ниже*):
iptables -t mangle -A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu
#Разрешает прохождение транзитных пакетов(если в файерволе они запрещены):
iptables -I FORWARD 1 -j ACCEPT
#Разрешает DHCP запросы к серверу (если в файерволе они запрещены) для того, чтобы клиенты получили IP от сервера, где wlan0 - сетевой интерфейс на котором запущен DHCP сервер:
iptables -I INPUT -p udp -i wlan0 --dport 67 -j ACCEPT

*Для решения проблемы с PMTU (Веб браузеры связываются, но просто висят без пересылки данных, проблема с почтой, проблема с SCP протоколом и т.д.) в iptables предусмотрена специальная опция, для ее активации можно в терминале выполнить:
iptables -t mangle -A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtuДанное правило iptables можно сохранить для автоматического запуска при загрузке OS, но мы добавим эту команду в скрипт.

Скрипт для запуска wifi-ap:

Если используется Systemd, то скрипт будет выглядеть следующим образом:
#!/bin/bash
#Script to start/stop hostapd, dnsmasq, add/remove iptables rule

#Detect the name of the display in use
display=":$(ls /tmp/.X11-unix/* | sed 's#/tmp/.X11-unix/X##' | head -n 1)"

#Detect the user using such display
user=$(who | grep '('$display')' | awk '{print $1}')

#Detect the id of the user
uid=$(id -u $user)

set -e
exec 3>&1
exec 2>&1 >> /tmp/wifi-ap

function print_help(){
    echo "Start/Stop Software Access Point"
    echo
    echo "Usage `basename $0` options..."
    echo "wifi-ap on to start Software AP"
    echo "wifi-ap off to stop Software AP"
    echo
    echo "log-file - /tmp/wifi-ap"
    echo
}
if [ $# = 0 ]; then
    print_help >&3
        exit 0
fi

if [ $1 = on ]; then
        rfkill block wifi
        sleep 1
        nmcli dev set wlan0 managed no
        rfkill unblock wifi
        ifconfig wlan0 192.168.2.1
        systemctl start dnsmasq
        sysctl net.ipv4.ip_forward=1
        iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE
        iptables -t mangle -A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu
        iptables -I FORWARD 1 -j ACCEPT
        iptables -I INPUT -p udp -i wlan0 --dport 67 -j ACCEPT
        systemctl start hostapd
        sudo -u $user DISPLAY=$display DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/$uid/bus notify-send --expire-time=4000 -i radiotray "Software Access Point" "<b>Start</b>"
    exit 0
fi

if [ $1 = off ]; then
        systemctl stop dnsmasq
        systemctl stop hostapd
        ifconfig wlan0 192.168.1.4
        sysctl net.ipv4.ip_forward=0
        iptables -D POSTROUTING -t nat -o ppp0 -j MASQUERADE
        iptables -I FORWARD 1 -j DROP
        iptables -D INPUT -p udp -i wlan0 --dport 67 -j ACCEPT
        nmcli dev set wlan0 managed yes
        sudo -u $user DISPLAY=$display DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/$uid/bus notify-send --expire-time=4000 -i radiotray "Software Access Point" "<b>Stop</b>"
    exit 0
fi


Если используется Sysvinit, то скрипт будет выглядеть следующим образом:
#!/bin/bash
#Script to start/stop hostapd, dnsmasq, add/remove iptables rule

#Detect the name of the display in use
display=":$(ls /tmp/.X11-unix/* | sed 's#/tmp/.X11-unix/X##' | head -n 1)"

#Detect the user using such display
user=$(who | grep '('$display')' | awk '{print $1}')

#Detect the id of the user
uid=$(id -u $user)

set -e
exec 3>&1
exec 2>&1 >> /tmp/wifi-ap

function print_help(){
    echo "Start/Stop Software Access Point"
    echo
    echo "Usage `basename $0` options..."
    echo "wifi-ap on to start Software AP"
    echo "wifi-ap off to stop Software AP"
    echo
    echo "log-file - /tmp/wifi-ap"
    echo
}
if [ $# = 0 ]; then
    print_help >&3
        exit 0
fi

if [ $1 = on ]; then
        rfkill block wifi
        sleep 1
        nmcli dev set wlan0 managed no
        rfkill unblock wifi
        sysctl net.ipv4.ip_forward=1
        iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE
        iptables -t mangle -A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu
        iptables -I FORWARD 1 -j ACCEPT
        iptables -I INPUT -p udp -i wlan0 --dport 67 -j ACCEPT
        service hostapd start
        sudo -u $user DISPLAY=$display DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/$uid/bus notify-send --expire-time=4000 -i radiotray "Software Access Point" "<b>Start</b>"
    exit 0
fi

if [ $1 = off ]; then
        service dnsmasq stop
        service hostapd stop
        ifconfig wlan0 192.168.1.4
        sysctl net.ipv4.ip_forward=0
        iptables -D POSTROUTING -t nat -o ppp0 -j MASQUERADE
        iptables -I FORWARD 1 -j DROP
        iptables -D INPUT -p udp -i wlan0 --dport 67 -j ACCEPT
        nmcli dev set wlan0 managed yes
        sudo -u $user DISPLAY=$display DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/$uid/bus notify-send --expire-time=4000 -i radiotray "Software Access Point" "<b>Stop</b>"
    exit 0
fi

Борьба с Network Manager
В Network Manager версий 0.9.xx появилась неприятная особенность, он монопольно захватывает управление WiFi адаптером и не передает управление hostapd при этом устройства будут видеть ваш SSID, но не смогут подключаться к вашей Soft AP, поэтому можно добавить в скрипт остановку и последующий запуск NM после завершения использования Soft AP (это никак не сказывается на работе уже установленных соединений с помощью NM). Если ситуация изменится, то эти строки (systemctl stop network-manager/service network-manager stop и systemctl start network-manager/service network-manager start) можно не использовать. Если данный вариант решения проблемы по какой-то причине вас не устраивает, то можно полностью отключить управление Network Manager'ом вашего Wi-Fi адаптера добавив либо его mac-адрес, либо наименование интерфейса в файл конфигурации: /etc/NetworkManager/NetworkManager.conf
[keyfile]
unmanaged-devices=mac:[mac address of interface to exclude]
unmanaged-devices=interface-name:wlan0
Пример: unmanaged-devices=mac:00:22:68:1c:59:b1;mac:00:1E:65:30:D1:C4;interface-name:wlan0

Перезапуск Network Manager в данной версии не требуется, конфигурация применяется сразу же после сохранения файла конфигурации, если у вас не так, то перезапустите NM командой:
sudo systemctl restart NetworkManager.service В Network Manager (1.2.0 и выше) можно указывать параметрами командной строки устройства которыми NM не должен управлять, таким образом если у вас указанная версия, то можно вместо отключения NM добавить в скрипт:
nmcli dev set wlan0 managed noИ затем:
nmcli dev set wlan0 managed yesВ Network Manager (1.14.6 и выше) появился еще один косяк - если wifi адаптер уже подключен к какой-либо сети и если перед запуском Soft AP не произвести отключение от этой сети, то после перевода wifi адаптера в режим точки доступа у вас не будет интернета. Для решения этой проблемы можно использовать rfkill:
#Отключаем wifi адаптер и ждем 1 сек., чтобы не появился варнинг после выполнения следующей команды:
rfkill block wifi
sleep 1
#Для отключения захвата Network Manager'ом управления wifi адаптером:
nmcli dev set wlan0 managed no
#Снова включаем wifi адаптер:
rfkill unblock wifi
Добавил этот костыль в скрипт, сейчас он необходим для работы Soft AP.
[свернуть]
Сохраняем скрипт в текстовом редакторе и разрешаем выполнение:
chmod +x wifi-ap
Чтобы каждый раз не указывать местоположение данного скрипта, а запускать командой из терминала, его можно поместить в /usr/bin/ или в /usr/local/bin/

Скрипт принимает 2 параметра, on и off. Вы легко можете скорректировать его под себя и, если необходимо, можно заменить интерфейс ppp0 на eth0 (или другой, на Ваше усмотрение).

PS. Команду запускать с Root правами, т.е. через sudo:
sudo wifi-ap on
sudo wifi-ap off

Для вывода суммарной информации о созданной точке доступа (SSID, Channel, TXPower и т.д.) можно использовать команду:
iw dev
Для вывода списка всех подключеных устройств к точке доступа (lease name, ip и mac) можно воспользоваться скриптом wifilist:
Для постоянного обновления информации можно использовать команду: watch wifilist
#!/bin/bash

# Shows MAC, IP address and any hostname info for all connected wifi devices

echo    "# All connected wifi devices, with IP address,"
echo    "# hostname (if available), and MAC address."
printf  "# %-20s %-30s %-20s\n" "IP address" "lease name" "MAC address"
leasefile=/var/lib/misc/dnsmasq.leases
# list all wireless network interfaces
# (for MAC80211 driver; see wiki article for alternative commands)
for interface in `iw dev | grep Interface | cut -f 2 -s -d" "`
do
  # for each interface, get mac addresses of connected stations/clients
  maclist=`iw dev $interface station dump | grep Station | cut -f 2 -s -d" "`
  # for each mac address in that list...
  for mac in $maclist
  do
    # If a DHCP lease has been given out by dnsmasq,
    # save it.
    ip="UNKN"
    host=""
    ip=`cat $leasefile | cut -f 2,3,4 -s -d" " | grep $mac | cut -f 2 -s -d" "`
    host=`cat $leasefile | cut -f 2,3,4 -s -d" " | grep $mac | cut -f 3 -s -d" "`
    # ... show the mac address:
    printf "  %-20s %-30s %-20s\n" $ip $host $mac
  done
done
[свернуть]

Внимание: обнаружен баг из-за которого при запуске скрипта не запускается dnsmasq и выводится сообщение: See 'systemctl status dnsmasq.service' and 'journalctl -xn' for details.
Это связано с обновлением пакета dns-root-data, из-за которого в Debian Jessie перестает нормально работать dnsmasq. Решение такое, либо удалить пакет dns-root-data, либо обновить этот пакет из репозитория sid.

Возможно вас заинтересует статья о реализации криптостойкого шифрования WiFi с помощью hostapd.

vic5710

CoolAller, попробовал ваш мануал-УМВР. респект и уважуха

Malaheenee

При всем уважении к автору - копипаст. Не рассмотрены: автоматический выбор канала (hostapd); блокировка рекламы (dnsmasq); закрытие доступа к сети извне (iptables); интеграция в эту цепочку прокси-сервера (squid); удаленный контроль (ssh); поднятие AP кнопкой включения wi-fi (acpid).. При этом чтобы за этой машиной мог работать пользователь.
[ot]Ничего личного, просто надоели бесконечные мега-инструкции, передираемые авторами без раздумий и чтения официальной документации.[/ot]
Все мы где-то, когда-то и в чем-то были новичками.

CoolAller

#3
del

Palzuncoff

все получилось, сетка поднялась, но к ней невозможно подключится, пишет неверный пароль, пароли проверял.

CoolAller

#5
Palzuncoff, значит что-то не сделали, смотрите внимательнее, только что сам проверил, все работает. Если вы копировали раньше эту инструкцию, то я ее обновил и внес коментарии, сейчас она находится в актуальном состоянии. Читайте UPD.

endru

Этот раздел для обсуждения темы, а не для решения проблем.
Palzuncoff, при проблемах, создавайте отдельную тему.

Mit

привет. взял дешевый адаптер на чипе реалтек 8187. можно с ним организовать точку доступа??

CoolAller

#8
Mit, из сводной таблицы по wireless chipsets видим: AP/Master mode rtl8187 - not working yet. Там вроде две модификации с буквой B и без нее. По-моему просто rtl8187 не поддерживает этот режим в принципе, по крайней мере там написано: AP (Master) mode: unsupported. Если же у вас другая модификация (в подробности не вдавался) и вы уверены, что Master mode все же поддерживается, то можно попробовать скомпилировать драйвера с сайта производителя. Если нужен донгл с поддержкой Master Mode, то лучше озадачится этим вопросом перед покупкой и выбирать или Ralink или Atheros предварительно изучив спецификации, поддержка чипсетов Realtek в linux оставляет желать лучшего.



CoolAller

#9
Может кому поможет, недавно настраивал Soft AP на донгле с чипом Realtec - RTL8188, использовал взятый с github патченый hostapd RTL8188-hostapd-master и драйвер rtl8188eu-master.