Создание беспроводного роутера на базе ОС Linux
Материал из Belgorod Linux User Group - Белгород.
[править] Введение
Данная статья является практическим руководство по созданию беспроводного роутера на базе ОС Linux.
Данный проект позиционируется для использования в качестве беспроводной точки доступа с выходом в интернет с использованием спутникового подключения (в качестве наземного канала используется gprs-подключение).
[править] Требования к конечному продукту
Законченный проект будет обладать следующими характеристиками:
- Автономная работа с возможностью самодиагностики состояния интернет-подключения и его восстановление, в случае, если это возможно
- Использование WPA шифрования при подключении беспроводных клиентов
- Автоматическая раздача адресов в локальной сети с использование dhcp
- Работа в качестве файл-сервера
- Подсчет интеренет-траффика
[править] Выбор аппаратного обеспечения
[править] Материнская плата, CPU, память
TODO: вписать требования
[править] Беспроводная карта
В качестве wifi адаптера была выбрана плата на основе чипсета atheros - D-Link 520G. Преимуществом является наличие открытых , стабильно работающих драйверов.
[править] Установка и настройка
[править] Установка операционной системы
[править] Настройка сетевых соединений
[править] Создание "запросного" канала (gprs)
Организация доступа будет выполняться средствами pppd. Для этого создадим файл /etc/ppp/peers/gprs следующего содержания
hide-password # noauth # connect "/usr/sbin/chat -v -f /etc/chatscripts/gprs" # начальная строчка - указывает откуда читать данные с инициализацией debug #вывод отладочной информации /dev/ttyACM0 #устройство модема 57600 #скорость defaultroute #сделать маршрутом по-умолчанию noipdefault user "user" #имя пользователя учетной записи remotename gprs ipparam gprs persist #восстанавливать соединение при разрыве связи maxfaul 0 #количество попыток, после которых pppd прекращает попытки соединиться с серверов (0 - неограниченно) userpeerdns #получить от сервера данные dns
теперь необходимо создать файл /etc/chatscripts/gprs следующего содержания
ABORT 'NO ANSWER' ABORT 'NO CARRIER' ABORT 'BUSY' ABORT ERROR ' ' "ATZ" ' ' "ATE1" OK AT+CGDCONT=1,"IP","internet.mts.ru" OK ATD*99# CONNECT c
так же необходимо добавить связку логин-пароль в файлы /etc/ppp/pap-secrets и /etc/ppp/chap-secrets
"user" gprs "password"
подключение можно выполнить либо
pppd call gprs
либо
pon gprs
разорвать соединение
killall pppd
либо
poff
[править] Проверка работоспособности соединения
[править] Способ первый
для проверки работоспособности соединения и его восстановления создадим скрипт /usr/bin/testgprs
#!/bin/bash /bin/ping -s 1 -c 10 www.ru &>/dev/null if [ "$?" -ne "0" ]; then /usr/bin/poff &>/dev/null /usr/bin/pon gprs &>/dev/null fi
chmod 700 /usr/bin/testgprs
далее следует создать файл запуска для crontab (/etc/cronscripts/testgprs.cron)
*/5 * * * * /usr/bin/testgprs
добавим задание
sudo crontab /etc/cronscripts/testgprs.cron
проверим, появилось ли оно в списке
sudo crontab -l
если задание появилось, то все в порядке. Иначе проверьте все, что вы делали.
[править] Способ второй
Можно проверять работоспособность PPP-линка средствами самого pppd. Для этого в /etc/ppp/peers/gprs добавляем следующие параметры:
holdoff 10 # время в секундах, которое pppd будет ждать до попытки восстановления соединения lcp-echo-interval 30 # период, в секундах, посылки эхо-запросов PPP-серверу lcp-echo-failure 4 # количество потерянных эхо-запросов (оставшихся без ответа) для разрыва соединения
Таким образом, в течение двух минут будет осуществлено 4 попытки обмена эхо-запрос--эхо-ответ, и, если все они будут неудачные, то pppd бросит соединение, подождет 10 секунд и попытается установить соединение заново.
[править] Подготовка беспроводного интерфейса
Установка необходимых модулей ядра и утилит
pacman -S madwifi
Для работы карты в режиме точки доступа необходимо добавить следующие строки в файл /etc/modprobe.conf
alias ath0 ath_pci options ath_pci autocreate=ap
[править] Предварительная настройка сетевых интерфейсов
Для правильной работы hostapd и wpa необходимо, чтобы беспроводный интерфейс входил в состав так называемого моста (bridge).
Выполним установку bridge-utils
pacman -S bridge-utils
Создадим новый "мост" и добавим в него интерфейсы ath0 и eth0
ifconfig eth0 0.0.0.0 up ifconfig ath0 0.0.0.0 up brctl addbr br0 brctl addif br0 eth0 brctl addif br0 ath0
Добавим эти настройки в файл /etc/conf.d/bridges
bridge_br0="ath0 eth0" BRRIDGE_INTERFACES=(br0)
Далее нужно сделать необходимые изменения в файле /etc/rc.conf в секции networking
eth0="eth0 up" ath0="ath0 up" br0="br0 192.168.0.1 netmask 255.255.255.0 broadcast 192.168.0.0" INTERFACES=(... ath0 eth0 br0)
[править] hostapd
Для авторизации беспроводных клиентов необходимо использовать приложение hostapd.
[править] Компиляция
Для компиляции необходимо наличие исходных текстов драйвера madwifi.
В каталоге с исходными текстами hostapd необходимо создать файл .config со следующими настройками
CFLAGS += -I ../madwifi # Здесь нужно указать путь к исходным текстам madwifi CONFIG_DRIVER_HOSTAP=y CONFIG_DRIVER_MADWIFI=y CONFIG_DRIVER_WIRED=y CONFIG_EAP=y CONFIG_EAP_GTC=y CONFIG_EAP_MD5=y CONFIG_EAP_MSCHAPV2=y CONFIG_EAP_PEAR=y CONFIG_EAP_TLS=y CONFIG_EAP_TTLS=y CONFIG_IAPP=y CONFIG_IPV6=y CONFIG_PEERKEY=y CONFIG_PKCS12=y CONFIG_RSNPREAUTH=y
Hostapd содержит ошибку , которая не позволяет ему корректно работать с драйвером madwifi.
Выглядит это следующим образом
# hostapd -dddd /etc/hostapd-ath0.conf Configuration file: /etc/hostapd-ath0.conf madwifi_set_iface_flags: dev_up=0 Using interface ath0 with hwaddr 00:02:6f:20:fa:82 and ssid 'test-ath0' SIOCGIWRANGE: WE(compiled)=19 WE(source)=13 enc_capa=0x0 Flushing old station entries madwifi_sta_deauth: addr=ff:ff:ff:ff:ff:ff reason_code=3 ioctl[IEEE80211_IOCTL_SETMLME]: Invalid argument Could not connect to kernel driver. Deauthenticate all stations madwifi_set_iface_flags: dev_up=0
Для её устранения нужно выполнить следующее:
В районе 1200 строки в driver_madwifi.c закомментировать следующую строку
madwifi_set_iface_flags(drv, 0); /* mark down during setup */
следующим образом
//madwifi_set_iface_flags(drv, 0); /* mark down during setup */
Теперь выполним компиляцию и установку hostapd
make && make install
[править] Настройка
Для работы hostapd создадим файл с настройками /etc/hostapd/hostapd.conf
auth_algs=1 bridge=br0 ctrl_interface=/var/run/hostapd ctrl_interface_group=0 debug=0 driver=madwifi dump_file=/tmp/hostapd.dump interface=ath0 logger_stdout=-1 logger_stdout_level=2 logger_syslog=-1 logger_syslog_level=2 macaddr_acl=0 ssid=My_Secure_WLAN #ESID вашей сети wpa=1 wpa_key_mgmt=WPA-PSK wpa_pairwise=TKIP CCMP wpa_passphrase=yourpassphrase
Запуск выполняется командой
/usr/local/bin/hostapd -d /etc/hostapd/hostapd.conf
Можно пробовать подключиться к вашему роутеру с использованием статического адреса.
[править] Использование DHCP в вашей локальной сети
Для раздачи адресов с использованием dhcp воспользуемся пакетом dnsmasq
pacman -S dnsmasq
Конфигурационный файл /etc/dnsmask.conf
dhcp-range=192.168.0.100,192.168.0.199,12h interface=br0
[править] Обеспечение NAT-маршрутизации в сети
#Сначала обнуляем наши текущие правила
iptables -F
iptables -t nat -F
#Установим политики по умолчанию для трафика, не соответствующего ни одному из правил
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD DROP
#Скопируйте и вставьте для примера...
export LAN=br0
export WAN=ppp0
#Теперь закроем наши сервисы так, чтобы они могли работать только для LAN
iptables -I INPUT 1 -i ${LAN} -j ACCEPT
iptables -I INPUT 1 -i lo -j ACCEPT
iptables -A INPUT -p UDP --dport bootps -i ! ${LAN} -j REJECT
iptables -A INPUT -p UDP --dport domain -i ! ${LAN} -j REJECT
#(Необязательно) Разрешаем доступ к нашему ssh-серверу из интернета
iptables -A INPUT -p TCP --dport ssh -i ${WAN} -j ACCEPT
#Отбросим все TCP/UDP-пакеты, обращающиеся к привилегированным портам
iptables -A INPUT -p TCP -i ! ${LAN} -d 0/0 --dport 0:1023 -j DROP
iptables -A INPUT -p UDP -i ! ${LAN} -d 0/0 --dport 0:1023 -j DROP
#В конце добавляем правила для NAT
iptables -I FORWARD -i ${LAN} -d 192.168.0.0/255.255.255.0 -j DROP
iptables -A FORWARD -i ${LAN} -s 192.168.0.0/255.255.255.0 -j ACCEPT
iptables -A FORWARD -i ${WAN} -d 192.168.0.0/255.255.255.0 -j ACCEPT
iptables -t nat -A POSTROUTING -o ${WAN} -j MASQUERADE
#Сообщаем ядру, что ip-форвардинг разрешен
echo 1 > /proc/sys/net/ipv4/ip_forward
for f in /proc/sys/net/ipv4/conf/*/rp_filter ; do echo 1 > $f ; done
Сохраняем правила, чтобы потом не вводить все вручную заново при перезагрузке
/etc/rc.d/iptables save
Редактируем /etc/sysctl.conf
добавляем
net.ipv4.ip_forward = 1 net.ipv4.conf.default.rp_filter = 1
Если у вас динамически назначаемый IP-адрес, возможно, вам понадобиться включить следующее:
net.ipv4.ip_dynaddr = 1
[править] Скрипт запуска pppd и hostapd
Для поднятия соединения с интернет и активизации точки доступа создадим следующий скрипт /etc/rc.d/netinterfaces
#!/bin/bash
. /etc/rc.conf
. /etc/rc.d/functions
case "$1" in
start)
stat_busy "Starting pppd and hostapd"
/usr/bin/pon gprs&>/dev/null
/usr/local/bin/hostapd -B /etc/hostapd/hostapd.conf
stat_done
;;
stop)
stat_busy "Stopping pppd and hostapd"
/usr/bin/poff &>/dev/null
/usr/bin/killall hostapd&>/dev/null
/sbin/ifconfig ath0 up
stat_done
;;
restart)
$0 stop
sleep 1
$0 start
;;
*)
echo "usage: $0 {start|stop|restart}"
;;
esac
exit 0
и добавим его в список автоматически запускаемых при загрузке.
[править] Настройка соединения со спутником
В этом разделе приведена общая информация для настройки соединения со спутником. За более детальной информацией стоит обратиться к источникам.
установка необходимого ПО
pacman -S linuxtv-dvb-apps
Добавляем модуль dvb-core в список автозагружаемых (файл /etc/rc.conf)
... MODULES=(... dvb-core ...) ...
Файл /etc/channels.conf (содержит параметры сигнала спутникового провайдера)
общий формат
service_name:frequency(MHz):polarisation:fec:symbol_rate:video_pid:audio_pid:program_id
пример /etc/channels.conf (провайдер planetsky 53E широкий луч)
planetsky:10974:v:7/8:32223:0:0:0
[править] Настройка ускорителя tellinet
[править] Прозрачное "соксифицирование" траффика
Поскольку ускоритель tellinet работает в качестве socks-сервера, то следует завернуть весь исходящий траффик на этот ускоритель.
#!/bin/sh LOCAL_NET=192.168.0.0/24 iptables -t nat -X SOCKSIFY iptables -t nat -N SOCKSIFY #Обработаем исключения iptables -t nat -A SOCKSIFY -o lo -j RETURN iptables -t nat -A SOCKSIFY --dst 127.0.0.1 -j RETURN iptables -t nat -A SOCKSIFY --dst $LOCAL_NET -j RETURN #избавимся от вечного зацикливания траффика iptables -t nat -A SOCKSIFY -m owner --cmd-owner tellinet -j RETURN #логирование (опционально) iptables -t nat -A SOCKSIFY -j LOG -p tcp --syn --log-level info --log-prefix "SOCKSify " #заворачиваем траффик на tellinet iptables -t nat -A SOCKSIFY -p tcp -j REDIRECT --to-port 9203 #обработка траффика, отправленного текущим хостом iptables -t nat -A OUTPUT -p tcp --syn -j SOCKSIFY #обработаем траффик с других хостов в сети iptables -t nat -A PREROUTING -p tcp -s $LOCAL_NET --syn -j SOCKSIFY
[править] Источники
Журнал Системный Администратор (Апрель 2006) - Собираем беспроводной роутер 802.11g на базе ОС Linux
Gentoo-Wiki: Руководство по развертыванию домашнего маршрутизатора
Настройка SkyStar3 (TT-Budget S-1401)
Create a secure Linux-based wireless access point

