Главная > Операционные системы, Программное обеспечение > Домашний сервер на CentOS 6. Часть 2. Hostapd+dnsmasq.

Домашний сервер на CentOS 6. Часть 2. Hostapd+dnsmasq.

Считаем, что CentOS 6.2 уже установлен. Установка операционной системы CentOS 6.2 процесс не сложный и широко описывается на просторах интернета. Более того, есть даже ролики на YouTube. Поэтому я не буду заострять внимание на этом. Скажу лишь, что я устанавливаю CentOS в комплектации Minimum, ну а затем устанавливаю по ходу нужные пакеты или собираю из исходников.

Сегодня мы будем собирать hostapd. Он будет выполнять работу точки доступа, управлять беспроводным устройством TL-WN722NC, шифровать данные и т.д. Вместе с ним будет использоваться dnsmasq, который может работать в качестве DHCP сервера и раздавать подключившимся клиентам IP адреса. Также dnsmasq будет перенапрвлять DNS запросы на внешний DNS сервер, т.е. будет неким DNS Forwarder’ом. Итак приступим.

Установка Hostapd (точка доступа)

Как я уже писал выше, для подключения беспроводных клиентов к серверу у нас будет использоваться устройство TL-WN722NC. Оно будет работать в режиме Access Point (AP). Подключаем устройство в USB, устанавливаем пакет usbutils:

yum install usbutils

Выполняем команду lsusb

lsusb

Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 003 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 004 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 005 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 001 Device 002: ID 0cf3:9271 Atheros Communications, Inc. AR9271 802.11n

Наш адаптер TL-WN722NC на чипсете Atheros AR9271.

На странице http://wireless.kernel.org/en/users/Drivers/ath9k_htc можно увидеть, что нам нужны драйвера ath9k_htc.

Ядро в CentOS 6.2 (kernel-2.6.32-220.4.1.el6.x86_64) не имеет поддержку ath9k_htc, поэтому нам нужно более свежее ядро, скомпилированное со следующими опциями:

CONFIG_ATH_COMMON=m
CONFIG_ATH9K_HW=m
CONFIG_ATH9K_COMMON=m
CONFIG_ATH9K_HTC=m

На 32 разрядной CentOS 6.2 я собирал ядро руками по следующей инструкции: http://cs-aul.ru/showthread.php?t=1789 и все было замечательно. При сборке ядра (kernel-3.2.2) на 64 разрядной системе, CentOS отказывался запускаться. И не удивительно, в вики CentOS’а, крайне не рекомендуют собирать ядро самому (http://wiki.centos.org/HowTos/Custom_Kernel).

Но не все так плохо. Для поддержки ath9k_htc, можно использовать последнее ядро на текущий момент kernel-ml-3.2.2-0.el6.elrepo.x86_64 из репозитория elrepo.org.

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

rpm --import http://elrepo.org/RPM-GPG-KEY-elrepo.org
rpm -Uvh http://elrepo.org/elrepo-release-6-4.el6.elrepo.noarch.rpm

Откываем файл /etc/yum.repos.d/elrepo.repo и меняем в секции [elrepo-kernel] параметр enabled на 1 (enabled=1). Устанавливаем новое ядро:

yum install kernel-ml

Редактируем файл /boot/grub/grub.conf и меняем параметр default на 0 (default=0). Это необходимо, чтобы система автоматически загружалась с новым ядром.

Перезагружаемся. Проверяем поддержку ath9k_htc:

modprobe -l |grep ath9k
kernel/drivers/net/wireless/ath/ath9k/ath9k.ko
kernel/drivers/net/wireless/ath/ath9k/ath9k_hw.ko
kernel/drivers/net/wireless/ath/ath9k/ath9k_common.ko
kernel/drivers/net/wireless/ath/ath9k/ath9k_htc.ko

То что нам нужно.

Скачиваем последние версии firmware map AR9271 — htc_9271.fw и AR7010 — htc_7010.fw отсюда http://linuxwireless.org/download/htc_fw/ и кладем их в /lib/firmware/. Перезагружаемся.

После перезагрузки должен появиться новый беспроводной сетевой интерфейс, смотрим командой ifconfig -a:

mon.wlan0 Link encap:UNSPEC HWaddr B0-48-7A-89-39-D6-80-BE-00-00-00-00-00-00-00-00
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:182 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:30466 (29.7 KiB) TX bytes:0 (0.0 b)

wlan0 Link encap:Ethernet HWaddr B0:48:7A:89:39:D6
inet6 addr: fe80::b248:7aff:fe89:39d6/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:73 errors:0 dropped:0 overruns:0 frame:0
TX packets:6 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:9855 (9.6 KiB) TX bytes:576 (576.0 b)

У меня в системе интерфейс eth0 подключен к интернет провайдеру, это будет WAN интерфейс. Остальные интерфейсы eth1 и wlan0 мы объединим в бридж интерфейс br0 — это будет LAN.

Создаем конфигурационные файлы ifcfg-eth1, ifcfg-wlan0 и ifcfg-br0 в каталоге /etc/sysconfig/network-scripts/

ifcfg-eth1:
DEVICE=eth1
HWADDR=00:15:17:23:B6:A4
NM_CONTROLLED=no
ONBOOT=yes
IPV6INIT=no
BRIDGE=br0

ifcfg-wlan0:
DEVICE=wlan0
HWADDR=B0:48:7A:89:39:D6
NM_CONTROLLED=no
ONBOOT=yes
IPV6INIT=no
BRIDGE=br0

ifcfg-br0:
DEVICE=br0
TYPE=Bridge
BOOTPROTO=static
BROADCAST=192.168.0.255
IPADDR=192.168.0.1
NETMASK=255.255.255.0
NETWORK=192.168.0.0
ONBOOT=yes
IPV6INIT=no

Для работы бриджа необходимо установить пакет bridge-utils

yum install bridge-utils

Для работы беспроводного интерфейса нам потребуется пакет wireless-tools

yum install wireless-tools

Перезагружаем сетевую службу

service network restart

Теперь нам необходимо скомпилировать последний на текущий момент hostapd-0.7.3. Для компиляции нам понадобятся следующие пакеты: kernel-ml-devel, kernel-ml-headers, make, gcc-c++, gcc, libgcc, binutils, openssl, openssl-devel, libnl-devel, libnl. Устанавливаем эти пакеты через yum.

Скачиваем последнюю версию исходников hostapd на сайте http://w1.fi/hostapd/. Я скачивал последнюю версию hostapd-0.7.3.tar.gz. Распаковываем архив и переходим в каталог hostapd. Нам нужно создать файл конфигурации .config (в качестве примера можно использовать defconfig). Копируем конфиг по умолчанию defconfig в .config:

cp defconfig .config

Правим конфигурационный файл. У меня получился такой:

# Driver interface for drivers using the nl80211 kernel interface
CONFIG_DRIVER_NL80211=y
# driver_nl80211.c requires a rather new libnl (version 1.1) which may not be
# shipped with your distribution yet. If that is the case, you need to build
# newer libnl version and point the hostapd build to use it.
LIBNL=/usr/src/libnl
CFLAGS += -I$(LIBNL)/include
LIBS += -L$(LIBNL)/lib

# IEEE 802.11F/IAPP
CONFIG_IAPP=y

# WPA2/IEEE 802.11i RSN pre-authentication
CONFIG_RSN_PREAUTH=y

# PeerKey handshake for Station to Station Link (IEEE 802.11e DLS)
CONFIG_PEERKEY=y

# Integrated EAP server
CONFIG_EAP=y

# EAP-MD5 for the integrated EAP server
CONFIG_EAP_MD5=y

# EAP-TLS for the integrated EAP server
CONFIG_EAP_TLS=y

# EAP-MSCHAPv2 for the integrated EAP server
CONFIG_EAP_MSCHAPV2=y

# EAP-PEAP for the integrated EAP server
CONFIG_EAP_PEAP=y

# EAP-GTC for the integrated EAP server
CONFIG_EAP_GTC=y

# EAP-TTLS for the integrated EAP server
CONFIG_EAP_TTLS=y

# PKCS#12 (PFX) support (used to read private key and certificate file from
# a file that usually has extension .p12 or .pfx)
CONFIG_PKCS12=y

# IEEE 802.11n (High Throughput) support
CONFIG_IEEE80211N=y

Собираем hostapd командой make и устанавливаем командой make install. Если что-то не компилируется, то значит не хватает каких-то пакетов.

Hostapd установлен и готов к использованию.

Конфигурируем hostapd в файле /etc/hostapd/hostapd.conf. Такого каталога нет, поэтому его вместе с файлом нужно создать самостоятельно. Мой конфиг hostapd.conf:

interface=wlan0
bridge=br0
driver=nl80211
hw_mode=g
channel=9

country_code=JP

ieee80211n=1
wmm_enabled=1

#read this http://val-khmyrov.blogspot.com/2011/05/ieee-8021g-ieee-8021n.html
ht_capab=[HT40-][GF][SHORT-GI-20][SHORT-GI-40][RX-STBC1][DSSS_CCK-40]

logger_syslog=-1
logger_syslog_level=2
logger_stdout=-1
logger_stdout_level=2

#debug=0
dump_file=/tmp/hostapd.dump
ctrl_interface=/var/run/hostapd
ctrl_interface_group=0
ssid=billiards
ignore_broadcast_ssid=0

auth_algs=3
wpa=3
wpa_passphrase=secret
wpa_key_mgmt=WPA-PSK

Я умышленно буду приводить сухие конфиги, т.к. описывать их бумаги не хватит, что непонятно можно спросить в камментах или у гугля :) Ещё советую почитать замечательную статью http://val-khmyrov.blogspot.com/2011/05/ieee-8021g-ieee-8021n.html

После компиляции нам нужно создать скрипт для автоматического запуска hostapd. Я взял скрипт из какого-то rpm пакета hostapd и немного его изменил:

/etc/init.d/hostapd
#!/bin/bash
#
# hostapd
#
# chkconfig: - 23 88
# description: hostapd is a user space daemon for access point and
# authentication servers. It implements IEEE 802.11 access point
# management, IEEE 802.1X/WPA/WPA2/EAP Authenticators and RADIUS
# authentication server.
# processname: hostapd
# config: /etc/hostapd/hostapd.conf
#
### BEGIN INIT INFO
# Provides: hostapd
# Required-Start: $network
# Required-Stop: $network
# Default-Start:
# Default-Stop: 0 1 6
# Short-Description: start and stop hostapd
# Description: IEEE 802.11 AP, IEEE 802.1X/WPA/WPA2/EAP/RADIUS Authenticator
### END INIT INFO

# Source function library.
. /etc/rc.d/init.d/functions

# Source networking configuration.
. /etc/sysconfig/network

exec="/usr/local/bin/hostapd"
prog=hostapd
conf="/etc/hostapd/hostapd.conf"
lockfile=/var/lock/subsys/$prog

[ -e /etc/sysconfig/$prog ] && . /etc/sysconfig/$prog

start() {
echo -n $"Starting $prog. "
daemon $exec -B $OTHER_ARGS $conf
retval=$?
echo
[ $retval -eq 0 ] && touch $lockfile
return $retval
}

stop() {
echo -n $"Stopping $prog. "
killproc $prog
retval=$?
echo
[ $retval -eq 0 ] && rm -f $lockfile
return $retval
}

restart() {
stop
start
}

reload() {
restart
}

force_reload() {
restart
}

fdr_status() {
status $prog
}

 

case "$1" in
start|stop|restart|reload)
$1
;;
force-reload)
force_reload
;;
status)
fdr_status
;;
condrestart|try-restart)
[ -f $lockfile ] && restart
;;
*)
echo $"Usage: $0 {start|stop|status|restart|try-restart|reload|force-reload}"
exit 1
esac

Назначаем права скрипту и ставим его в автозагрузку:

chmod 755 hostapd
chkconfig hostapd on
service hostapd start

Теперь hostapd будет стартовать вместе с системой.

Установка Dnsmasq (DHCP и DNS Forwarder)

Тут все просто.

yum install dnsmasq

Правим конфиг /etc/dnsmasq.conf. У меня такой:

# Never forward plain names (without a dot or domain part)
domain-needed
# Never forward addresses in the non-routed address spaces.
bogus-priv

# If you want dnsmasq to listen for DHCP and DNS requests only on
# specified interfaces (and the loopback) give the name of the
# interface (eg eth0) here.
# Repeat the line for more than one interface.
interface=br0

# Uncomment this to enable the integrated DHCP server, you need
# to supply the range of addresses available for lease and optionally
# a lease time. If you have more than one network, you will need to
# repeat this for each network on which you want to supply DHCP
# service.
dhcp-range=192.168.0.50,192.168.0.150,12h

Настраиваем автозапуск.

chkconfig dnsmasq on
service dnsmasq start

На этом все. Переходим к следующей части: Домашний сервер на CentOS 6. Часть 3. Установка и настройка Samba.

  1. Grigorii
    9 Март 2013 в 19:29 | #1

    Добрый день. Помогите мне поялуиста cоздать точку доступа на Centos 6.3
    У менея маленкии ноутбоок. На нем 1 LAN eth0 карта и одна WiFI wlan0 карта.
    eth0 LAN карта подклучена к интернету.
    WiFI wlan0 карту хочу исполизовать как точку достуа для других компютеров, телефонов дома.
    Настроил /etc/sysconfig/network-scripts/: eth0 wlan0 br0, но после етого интернет не работает.
    Установил вроде все что требуется.
    Спасибо

  2. 4 Апрель 2013 в 12:50 | #2

    Приведите тут конфигурационные файлы сетевых интерфейсов.

  3. Roman
    27 Май 2013 в 02:49 | #3

    Не работает какается
    nl80211 driver initialization failed.
    и все тут

    Хотя на debian все работало с этой картой (ar9285)

  4. 18 Август 2013 в 11:15 | #4

    Esli u menya v laptope 2 wi-fi (built-in i vneshnij) mogu ja ne sozdavat vse eti bridgi? to est kak-to nastroit dopustim odina kartochka vsegda listen , drugaya naoborot otpravlaet na router dannye?
    interesno kak eto nastroit?

  1. Пока что нет уведомлений.