Что ж, вот и первая статья из обещанной серии.
Первое, что я буду делать — настраивать 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:
ifdown интерфейс
ifup интерфейс
Проверяем состояние, сверяем настройки с теми, что должны быть:
ifconfig интерфейс
3) Нужно удалить любые DNS и DHCP серверы, чтобы dnsmasq мог спокойно запуститься — иначе выдаёт ошибку. У меня были установлены bind9 и isc-dhcp-server, пришлось избавиться от них. Если работаем по SSH из сети, в которой раньше адреса раздавал покойный DHCP-сервер, не перезагружаемся — выдавать адреса уже некому.
4) Нужно создать условия для работы сервера — создать пользователя для того, чтобы под ним запускать dnsmasq, прописать в системных настройках DNS-сервера, к которым dnsmasq будет обращаться и ещё пару мелочей.
Прописываем DNS сервера Гугла. Правда, первой строчкой у нас будет localhost. Это сделано для того, чтобы остальные системные приложения на нашем же сервере, когда им надо получить адрес от DNS-сервера, обращались сначала к dnsmasq, а не к Гуглу. Ну а dnsmasq достаточно умён, чтобы игнорировать эту строчку:
nano /etc/resolv.conf
nameserver 127.0.0.1
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. Удачной настройки!