Беспроводная точка доступа, используя Linux

в 17:15, , рубрики: dhcp, DNS, dnsmasq, hostapd, linux, метки: , , , ,

Что ж, вот и первая статья из обещанной серии.
Первое, что я буду делать — настраивать Software AP, или беспроводную сеть на базе компьютера. На этом этапе, конечно, нужен доступ к консоли сервера с правами рута. Кроме того, нужно также подключение к интернету НЕ через внутреннюю вайфай-карточку — кабелем, через 3G-модем, короче, как пожелаете, но только не по вайфаю, который мы будем использовать для создания беспроводной сети. Я на первое время подключил и сервер, и ноут, с которого управлял сервером, в одну сеть по кабелю — так надёжнее всё-таки. Буду использовать пакет hostapd — он довольно известен как надёжное решение и мануалов под него достаточно, а для DHCP и DNS серверов буду использовать dnsmasq — решение как раз под домашние сети, его использует DD-WRT, не удивлюсь, если кто-то ещё.

Самый первый шаг, конечно же:

apt-get install hostapd

Версия:

hostapd -v 
>hostapd v1.0 

Мда, в исходниках уже есть 2.0. Такой он, Debian stable. Но на самом деле это нам не особо помешает — версия 1.0 у меня работает достаточно стабильно.

Настройка:

Отредактировать файл /etc/default/hostapd.conf. В нём раскомментировать строку вида

DAEMON_CONF="/etc/hostapd/hostapd.conf"

Это путь к файлу конфигурации демона hostapd.
Затем идем дальше — редактировать /etc/hostapd/hostapd.conf. Предоставлю содержимое моего файла конфигурации. Предупреждаю, парсер конфигурационных опций у этого демона очень чувствителен и ругается даже на пустые строки с пробелом. На комментарии не ругается.

interface=wlan0

Сетевой интерфейс беспроводной карты

driver=nl80211

Драйвер сетевой карты — обычно для hostapd отлично работает nl80211, не вижу смысла менять, да и говорят, что он работает в большинстве случаев.

ssid=CRWiFi

Название точки доступа, т.н. SSID

hw_mode=g

Режим работы сетевой карты — 801.11b/g/n. На самом деле — там всегда должно оставаться g, даже если карта способна на n, для настройки режима n придётся кое-что поменять, смотрите дальше:

#ieee80211n=1 #Раскомментировать для включения режима n
#ht_capab=[HT40-][SHORT-GI-40] #Раскомментировать для включения режима n

channel=6

Беспроводной канал — от 1 до 13. Для лучшей производительности рекомендуются 1, 6 или 11 канал.

wpa=2

Версия WPA

wpa_passphrase=11111111

Пароль беспроводной точки
Дополнительные настройки WPA2:

wpa_key_mgmt=WPA-PSK
wpa_pairwise=TKIP
rsn_pairwise=CCMP
auth_algs=1

Следующая опция устанавливает блокировку MAC-адресов. Пока не знаю, как это настроить, да и штука довольно бесполезная, но все говорят, что без блокировки эту опцию нужно выставить в ноль — что я и сделал:

macaddr_acl=0

Полный конфиг одним блоком для копипаста в файл:

interface=wlan0
driver=nl80211
ssid=CRWiFi
hw_mode=g
#ieee80211n=1 
#Раскомментировать для включения режима n
#ht_capab=[HT40-][SHORT-GI-40] 
#Раскомментировать для включения режима n
channel=6
wpa=2
wpa_passphrase=11111111
wpa_key_mgmt=WPA-PSK
wpa_pairwise=TKIP
rsn_pairwise=CCMP
auth_algs=1
macaddr_acl=0

Конфиг автоматически проверяется перед запуском, так что — смело пробуйте запустить hostapd. Команды управления:

# /etc/init.d/hostapd start 
# /etc/init.d/hostapd stop 
# /etc/init.d/hostapd restart 

Напомню — также в Debian можно использовать команды вида service hostapd start, что легче в написании.

Пару шагов для устойчивости:

  • Нельзя забывать, что для шифрования WPA/WPA2 пароль должен быть не короче 8 символов. Если поменять пароль на лету, используя SSH сессию через беспроводной канал, можно внезапно отрезать себя от сервера — hostapd не захочет запускаться и единственное средство связи с сервером будет потеряно. Работает — не трогай, ну а если трогаешь — трогай осторожно.
  • В случае многопользовательской системы советую поставить права чтения файлов вида 700, чтобы простые пользователи не могли узнать пароль для точки доступа — если вас это волнует, конечно.

Что ещё могу сказать? С мобильными устройствами проблем нет, с ноутбуком под Windows 7 — крайне редко (примерно раз-два в месяц) не получается подключиться к точке. Лечится командой service hostapd restart, велика вероятность, что в новых релизах эта проблема убрана — есть версия hostapd 2.0.0, но компилировать и ставить её я пока что не пытался.

Пока всё. К точке можно попробовать подключиться, но… Для успешного подключения к точке доступа нужен DHCP сервер, без него к точке полноценно не подключишься — те же операционные системы не дадут этого сделать, поскольку без получения адреса само подключение не имеет особого смысла. Вот его и настроим!


Когда я только начинал учиться настраивать сервера под свои нужды, первое, на что я тогда я наткнулся — это пакет isc-dhcp-server, его я и планировал предложить, и статья уже была готова, но… Я нашёл dnsmasq, и моя жизнь изменилась в лучшую сторону. Dnsmasq — это и кэширующий DNS, и DHCP сервер со своим набором различных фич. Как только я заглянул в его конфиг, мое зрение улучшилось, все мысли в мозгу внезапно стали упорядоченными и я достиг просветления. Реально, конфиг очень простой и понятный. Но пока подготавливаем площадку для работы dnsmasq. Что же делать?

1) Придумать, как будут выглядеть адреса в нашей локальной сети. Я выбрал адреса типа 192.168.51.x.

2) Настроить сетевой интерфейс, на котором будет работать dnsmasq. На самом деле — очень важный шаг, который пропускают многие в своих мануалах по настройке DHCP-серверов. Дело в том, что компьютеру, на котором работает DHCP-сервер, необходимо прописать статический адрес — кто выдаст адрес DHCP-серверу, если он сам не может запуститься без адреса, а адрес себе он выдать не может, потому что не запущен?
Итак, открываем для редактирования файл /etc/network/interfaces и добавляем туда абзац вида:

auto наш_интерфейс
iface наш_интерфейс inet static
address 192.168.х.1 
netmask 255.255.255.0 
gateway 192.168.х.1

Сохраняем и перезапускаем наш сетевой интерфейс, на котором настроен DHCP:

ifconfig интерфейс down
ifconfig интерфейс up

Проверяем состояние, сверяем настройки с теми, что должны быть:

ifconfig интерфейс

3) Нужно удалить любые DNS и DHCP серверы, чтобы dnsmasq мог спокойно запуститься — иначе выдаёт ошибку. У меня были установлены bind9 и isc-dhcp-server, пришлось избавиться от них. Если работаем по SSH из сети, в которой раньше адреса раздавал покойный DHCP-сервер, не перезагружаемся — выдавать адреса уже некому.

4) Нужно создать условия для работы сервера — создать пользователя для того, чтобы под ним запускать dnsmasq, прописать в системных настройках DNS-сервера, к которым dnsmasq будет обращаться и ещё пару мелочей.
Прописываем DNS сервера Гугла

nano /etc/resolv.conf

nameserver 8.8.8.8
nameserver 8.8.8.4	

Нужно защитить это файл от перезаписи при каждом запуске системы. Перезаписывает его dhclient, если что. Честно говоря, блокировка от записи — лишь один из способов того, как не допустить перезапись =) Есть и другие, но этот самый простой:

chattr +i /etc/resolv.conf

Добавляем группу и пользователя:

groupadd -r dnsmasq
useradd -r -g dnsmasq dnsmasq

5) Ставим Dnsmasq, он запускается и готов к работе, но мы его отключаем — ещё не настроен, нечего ему тут делать:

apt-get install dnsmasq
service dnsmasq stop

6) Чистим оригинальный файл от стандартного конфига:

echo "">/etc/dnsmasq.conf

Ну а теперь мы готовы настраивать. Скажу сразу — у dnsmasq много разных опций, которые я при написании статьи подробно описывал в комментариях… Пока не понял, что топик раздулся до неприличных и нечитаемых размеров, как будто недостаточно того, что статья и так переполнена текстом и отформатирована, как кусок незнамо чего. Поэтому — я оставлю конфиг с самыми важными без длинных комментариев и всяких дополнительных опций, а конфиг с дополнительными опциями будет под спойлером.

# Заставим dnsmasq запускаться исключительно под пользователем dnsmasq
user=dnsmasq
group=dnsmasq
##
# Настраиваем DNS. Не нужен - смело выкидываем эту часть.
##
# Настройка DNS - чтобы отключить DNS, поставьте тут 0.
# Если же хотите расположить DNS на нестандартном порту - что ж, располагайте.
port=53

# Размер кэша. 
cache-size=1000

# Не спрашивать у внешнего DNS про имена без точки вроде homeserver, user-pc и прочие - 
# ему и так плохо, бедному, а ещё мы тут со своими заведомо локальными адресами...
domain-needed
# Что-то вроде предыдущего, тоже не даёт обращаться к глобальным DNS-серверам со всякой нелепицей в запросе
bogus-priv

# Интерфейс для приёма DHCP и DNS запросов.
interface=wlan0
# А вот этого интерфейса избегать, как чумы:
except-interface=ppp0 
# На всякий случай, мало ли глюк и сервер реально будет раздавать на ppp0, размахивая своим dhcp-authoritative.

##
# Настраиваем DHCP. НЕ нужен - смело выкидываем эту часть.
##
# Одна из самых главных строчек:
# она своим лишь присутствием запускает DHCP-сервер,
# заодно передавая ему размер пула адресов 
# 12h значит то, что срок аренды адреса по умолчанию - 12 часов.
# Соответственно, 12m - 12 минут, всё просто.
dhcp-range=192.168.51.50,192.168.51.150,12h

# Статический адрес. Указаны только MAC и IP:
dhcp-host=11:22:33:44:55:66,192.168.51.60
# Статический адрес. Указаны MAC, hostname, IP и индивидуальное время аренды.
# Да-да, вы поняли тему =) Всё решается одной строчкой:
dhcp-host=11:22:33:44:55:66,fred,192.168.51.60,45m

# Заблокировать выдачу IP-адреса для этого MAC-адреса:
dhcp-host=11:22:33:44:55:66,ignore
# Я лучше заблокирую - не, ну он выглядит реально подозрительно!

# Объявляем, что наш сервер - властитель нашей локальной сети и ни один другой не может быть подобным ему.
# НЕ ДЕЛАЙТЕ ЭТОГО, если есть такие же самопровозглашённые претенденты на трон - 
# можно порушить королевство, где выдаются IP-адреса
# А вот для моего сервера это необходимо, чтобы уменьшить время получения IP для устройств.
dhcp-authoritative

Расширенные опции:

# А тут можно немного подкорректировать то, что отдаёт DNS.
# IPv4-only.
# Поправим 1.2.3.4 на 5.6.7.8!
alias=1.2.3.4,5.6.7.8
# А если 1.2.3.x на 5.6.7.x? Ну тут уже нужна маска сети!
alias=1.2.3.0,5.6.7.0,255.255.255.0
# Ну а если мы вообще хотим перенаправить блок 192.168.0.10->192.168.0.40 на 10.0.0.10->10.0.0.40?
alias=192.168.0.10-192.168.0.40,10.0.0.0,255.255.255.0
# Всё, можно устраивать у себя свой Spamhaus и блокировать целыми блоками адресов, перенаправляя на что-нибудь ещё.

# Небольшой срыв покровов. Dnsmasq открывает порты на всех интерфейсах - 
# даже если сказано только про некоторые. Затем он просто игнорирует ненужные.
# Это, как говорят, сделано для удобства. Если честно - мне кажется, что 
# в нашем случае никакого удобства не будет.
# Следующая опция принуждает dnsmasq не притворяться и слушать только на тех интерфейсах,
# которые реально предназначены для этого.
bind-interfaces

# Интересная настройка! У нас же DNS, хоть и использующий общую базу адресов - 
# а это значит, что он может отдавать такие запросы, какие мы его попросим.
# Угадайте, что делает эта опция?
address=/vk.com/127.0.0.1
# Даа! Вместо ВК будет показываться гордое "It works!"
# Ходют тут всякие, трафик наш тратят.
# Ну и что, что безлимитный? =D 
# Использоваться, конечно, может не только для блокировки на уровне DNS, 
# но и для того, чтобы просто задать сетевое имя машине в локальной сети.

# Стоп, а зачем делать это в самом конфиге?
# Одна из прикольных фишек dnsmasq как DNS-сервера:
# читать файл /etc/hosts и все записи из него отдавать на соответствующие DNS-запросы.
# Можно не только удовлетворять запросы активизации KMS Microsoft Office
# и прочего софта с онлайн-активацией,
# но и блокать рекламу ещё до того, как она дойдёт до нашего сервера.
# Ну а зачем пихать всё сразу в hosts? Можно добавить внешний файлик с записями! И не один!
addn-hosts=/etc/banner_add_hosts
# Естественно, он по синтаксису должен быть в точности как hosts.
# А если идея c hosts, на ваш взгляд, неуместна, некультурна и вообще моветон?
# Используйте следующую опцию и отключите эту фишку.
no-hosts

# Интересная фишка, подходящая для ноутбуков с двумя сетевыми картами - проводной и беспроводной. 
# Заключается она в том, что на два разных MAC-адреса выдаётся один IP-адрес. 
# Правда, при этом подразумевается то, что два типа связи не будут использоваться одновременно - 
# если подключатся оба, то адрес получит второй MAC в строке. 
# Всё очень просто - MA:CA:DD:RE:SS:00,MA:CA:DD:RE:SS:01,12.34.56.78
dhcp-host=11:22:33:44:55:66,12:34:56:78:90:12,192.168.0.60

# Дать бесконечный lease клиенту c hostname bert. 
dhcp-host=bert,192.168.0.70,infinite

# На закуску - эта опция отвечает за "белый список". 
# Всё просто - адреса будут выдаваться только тем, кому вы выдали статический в этом файле.
# Остальные со своими грязными DHCPDISCOVER пролетают.
dhcp-ignore=tag:!known

# Размер пула DHCP-адресов. Интересно, почему эта настройка не задаётся согласно address range. 
dhcp-lease-max=640 #640 адресов хватит каждому
# На самом деле - большинству вообще не понадобится больше 100, но это мелочи.

# Интересная опция. Запускает скрипт при каждой выдаче адреса DHCP и истечении срока выдачи
# Аргументы: script add MA:CA:DD:RE:SS:00 12.34.56.78 hostname(если есть) (при добавлении)
# или script del MA:CA:DD:RE:SS:00 12.34.56.78 hostname(если есть) (при удалении)
dhcp-script=/bin/echo
# Если подумать - есть пара интересных применений. Вроде голосового оповещения при подключении =D

# Адрес NTP-сервера для машин в сети. Ещё не поставил - но обязательно поставлю, делов-то.
dhcp-option=42,192.168.51.1

Ага, сервер настроен. Запускаем:

service dnsmasq start

и смотрим на наличие ошибок в выводе команды. Если нет — всё отлично! Пробуем что-нибудь подключить к нашей точке и смотрим, как выдаются IP-адреса, пингуем и проверяем DNS. Файл со списком выданных адресов: /var/lib/misc/dnsmasq.leases.
В следующей статье — подключение 3G-модема и конфигурация простого, но стабильного NAT/firewall на iptables. Удачной настройки!

Критика по содержанию, удобочитаемости и форматированию статьи более, чем уместна.

Автор: CRImier

Источник

Поделиться

* - обязательные к заполнению поля