Инструкция предназначена для 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"
Создаем и редактируем файл /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)
wpa=2
wpa_passphrase=12345678 #(пароль естественно заменить на свой)
wpa_key_mgmt=WPA-PSK
wpa_pairwise=TKIP
rsn_pairwise=CCMP
auth_algs=1
macaddr_acl=0
Не забудьте убрать из конфига мои коменты, так как hostapd не будет работать с ними.В общем-то тут все просто — имя точки доступа, пароль, канал, на котором будет работать и драйвер.
Под спойлером ниже приведено краткое описание и дополнительные опции: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ГГц всего 3 основных канала - 1,6 и 11.
hw_mode=g - режим работы точки в IEEE 802.11g. Обязательно указывать даже при стандарте N, если не указать, то по умолчанию будет использоваться IEEE 802.11b.
ieee80211n=1 - указывает стандарт N нашей точки.
wmm_enabled=1 - режим приоритета мультимедиа трафика.
auth_algs=1 - определяем, что нашей wifi точке будет требоваться аутентификация по ключу. Если указать 0, то будет открытая точка доступа.
ignore_broadcast_ssid=0 - SSID сети виден всем, 1 - скрывать.
wpa=2 - опции WPA шифрования. При значении 2 можно использовать, только WPA2, если wpa=3 - то WPA или WPA2.
wpa_passphrase=password_wifi_key - наша парольная фраза
wpa_key_mgmt=WPA-PSK - принимаемые алгоритмы управления ключами шифрования. Можно задавать WPA-PSK WPA-EAP одновременно.
wpa_pairwise=CCMP TKIP - принимаемые парные алгоритмы шифрования для RSN/WPA(v1).
rsn_pairwise=CCMP - принимаемые парные алгоритмы шифрования для RSN/WPA2 rsn_pairwise=CCMP
(CCMP — протокол шифрования 802.11i созданный для замены TKIP, обязательного протокола шифрования в WPA и WEP, как более надёжный вариант. CCMP является обязательной частью стандарта WPA2, и необязательной частью стандарта WPA.)
Совет: При выборе канала для вашей точки досупа, выбирайте наименее забитые каналы и каналы где присутствует наибольшее отрицательное 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
iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE
Для решения
проблемы с PMTU (Веб браузеры связываются, но просто висят без пересылки данных и т.д.) разработчики iptables предусмотрели специальную опцию и для ее активации можно в терминале выполнить:
iptables -t mangle -A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu
И можно попытаться сохранить: service iptables save (но возможно слетит после перезагрузки, поэтому я добавил эту команду в скрипт инициализации wifi-ap, чтобы не городить еще один скрипт в автозагрузке)
То есть делать это удобнее с помощью одного скрипта wifi-ap:
UPD: В последних версиях Network Manager появилась неприятная особенность, он монопольно захватывает управление 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) можно будет удалить.
Если используется
Systemd, то скрипт будет выглядеть следующим образом:
#!/bin/bash
#script to start/stop hostapd, dnsmasq, add/remove iptables rule
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
systemctl stop network-manager
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
systemctl start hostapd
notify-send --expire-time=4000 "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
systemctl start network-manager
notify-send --expire-time=4000 "Software Access Point" "<b>stop</b>"
exit 0
fi
Если используется
Sysvinit, то скрипт будет выглядеть следующим образом:
#!/bin/bash
#script to start/stop hostapd, dnsmasq, add/remove iptables rule
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
service network-manager stop
ifconfig wlan0 192.168.2.1
service dnsmasq start
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
service hostapd start
notify-send --expire-time=4000 "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
service network-manager start
notify-send --expire-time=4000 "Software Access Point" "<b>stop</b>"
exit 0
fi
Сохраняем скрипт в текстовом редакторе и разрешаем выполнение:
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
Приятного использования.