Создание беспроводного роутера на базе ОС 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

Организация доступа к спутниковому каналу

Моноблок

Gentoo: DVB HOWTO

Хранилище знаний SatWiki

Личные инструменты