|
www.lissyara.su
—> статьи
—> FreeBSD
—> настройка
—> Wi-FI роутер + DHCP + DNS
Wi-Fi роутер Freebsd 8 + DNS сервер + DHCP сервер
Автор: zentarim.
Wi-fi роутер с DHCP и DNS серверами FreeBSD 8.2
Что хотим получить:
- чтобы Wi-Fi клиенты были в одной подсети с проводными.
- чтобы проводные и беспроводные клиенты получали адреса автоматически по DHCP
- чтобы был кэширующий DNS
- само собой хотим, чтобы все ходили в интернет
- чтобы был доступ по RDP на внутренний сервер
В общем хотим получить что-то схожее по функционалу с роутером Dlink DIR-300
Что имеем:
Celeron 700, 256 мб RAM, IDE винт на 80 гб и странную мамку, которая вменяемо работает только с отключенным ACPI
сетевые карты:
LAN - rl0 (10\100 какой-то реалтек, найденный за шкафом на работе)
rl0@pci0:1:8:0:class=0x020000 card=0x813910ec chip=0x813910ec rev=0x10 hdr=0x00
vendor = 'Realtek Semiconductor'
device = Realtek RTL8139 Family PCI FastEthernet NIC RTL-8139/8139C/8139D
class = network
subclass = ethernet
WAN - stge0 (10\100\1000 asus адаптер)
stge0@pci0:1:5:0:class=0x020000card=0x81801043chip=0x102313f0 rev=0x41 hdr=0x00
vendor = 'Sundance Technology Inc'
device = 'IC Plus IP1000 Family Gigabit Ethernet Adapter'
class = network
subclass = ethernet
WLAN - ral0 (дешевая Wi-Fi карточка от Dlink)
ral0@pci0:1:10:0:class=0x028000card=0x3a711186chip=0x03021814 rev=0x00 hdr=0x00
vendor = 'Ralink Technology, Corp.'
device = 'wireless a/b (RT2525 2.4GHz transceiver + RT2560 MAC/BBP)'
class = network
| предоставленный провайдером белый IP адрес:
IP 9.9.9.9
маска 255.255.255.0
шлюз 9.9.9.1
DNS1 9.9.9.254
DNS1 9.9.9.253
настройки отличаются от реально существующих, но сути это не меняет
диапазон локальной сети: 192.168.0.0 с маской 255.255.255.0
установлена ОС FreeBSD 8.2:
[root@GATE ~]# uname -a
FreeBSD GATE 8.2-RELEASE FreeBSD 8.2-RELEASE #0:Sat Apr 9 20:13:28 OMSST 2011
root@GATE:/usr/src/sys/i386/compile/GATE i386
| содержимое /etc/rc.conf:
keymap="ru.koi8-r"
hostname="GATE"
gateway_enable="YES"
defaultrouter="9.9.9.1"
sshd_enable="YES"
ifconfig_stge0="inet 9.9.9.9 netmask 255.255.255.0"
ifconfig_rl0="inet 192.168.0.1 netmask 255.255.255.0"
| содержимое /etc/resolv.conf (DNS сервера):
nameserver 9.9.9.254
nameserver 9.9.9.253
| Начинаем подготовку:
убираем из ядра все ненужные драйвера (ну или не убираем, кому как удобно) при этом оставляя все драйвера для беспроводных устройств. Если вы знаете, какой драйвер подходит для вашей карточки, то оставляете его, а остальные можете убрать.Я не знал, какой подойдет мне, поэтому оставил все. Пересобираем ядро с опциями:
device if_bridge # Модуль для работы моста
device wlan # поддержка 802.11 (Wi-fi)
# не знаю что это, подгружается автоматически
device wlan_amrr # AMRR transmit rate control algorith
device wlan_xauth # Модуль поддержки авторизации для режима точки доступа
device wlan_wep # Модуль поддержки алгоритма безопасности WEP
device wlan_tkip # модуль поддержки шифрования TKIP
device wlan_ccmp # модуль поддержки шифрования CCMP
device pf # в качестве фаервола я использую Packet Filter
# поддержка алгоритма очередей (приоритезация трафика)
options ALTQ
options ALTQ_CBQ # Class Bases Queuing (CBQ)
options ALTQ_RED # Random Early Detection (RED)
options ALTQ_RIO # RED In/Out
options ALTQ_HFSC # Hierarchical Packet Scheduler (HFSC)
options ALTQ_PRIQ # Priority Queuing (PRIQ)
# так как у меня одноядерный процессор, то поддержка многих ядер мне не нужна
#options ALTQ_NOPCC # Required for SMP build
| собираем и устанавливаем ядро:
[root@GATE ~]# cd /usr/src
[root@GATE /usr/src]# make buildkernel KERNCONF=GATE && \
make installkernel KERNCONF=GATE
| Перезагружаемся и смотрим, что получилось:
[root@GATE ~]# ifconfig
stge0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500
options=8209b<RXCSUM,TXCSUM,VLAN_MTU,VLAN_HWTAGGING,VLAN_HWCSUM,WOL_MAGIC,
LINKSTATE>
ether 01:01:01:01:01:01
inet 9.9.9.9 netmask 0xffffff00 broadcast 9.9.9.255
media: Ethernet autoselect (100baseTX <full-duplex>)
status: active
rl0: flags=8802<BROADCAST,SIMPLEX,MULTICAST> metric 0 mtu 1500
options=3808<VLAN_MTU,WOL_UCAST,WOL_MCAST,WOL_MAGIC>
ether 00:50:fc:ef:4d:75
inet 192.168.0.1 netmask 0xffffff00 broadcast 192.168.0.255
media: Ethernet autoselect (100baseTX <full-duplex>)
status: active
ral0: flags=8802<BROADCAST,SIMPLEX,MULTICAST> metric 0 mtu 2290
ether 00:26:5a:77:38:ba
media: IEEE 802.11 Wireless Ethernet autoselect (autoselect)
status: no carrier
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 16384
options=3<RXCSUM,TXCSUM>
inet 127.0.0.1 netmask 0xff000000
| Wi-fi карточка определилась как ral0. Уже хорошо. Можно еще раз пересобрать ядро и убрать ненужные драйвера для беспроводок.
Редактируем /etc/hostapd.conf до такого состояния:
interface=wlan0
logger_syslog=-1
logger_syslog_level=0
logger_stdout=-1
logger_stdout_level=2
debug=3
dump_file=/tmp/hostapd.dump
ctrl_interface=/var/run/hostapd
ctrl_interface_group=wheel
ssid=<SSID вашей беспроводной сети>
macaddr_acl=0
# 1 - WPA1; 2 - WPA2; 3 - WPA1+WPA2
wpa=2
wpa_passphrase=<Пароль к беспроводной сети>
wpa_key_mgmt=WPA-PSK
wpa_pairwise=CCMP TKIP
#можно заморочится с допустимыми MAC адресами, но я не стал
#macaddr_acl=1
#accept_mac_file=/etc/hostapd.accept
| Редактируем /etc/rc.conf:
keymap="ru.koi8-r"
hostname="GATE"
gateway_enable="YES"
defaultrouter="9.9.9.1"
sshd_enable="YES"
ifconfig_stge0="inet 9.9.9.9 netmask 255.255.255.0"
# настраиваем беспроводную карту как точку доступа
wlans_ral0="wlan0"
create_args_wlan0="wlanmode hostap"
ifconfig_wlan0="up mediaopt hostap"
# убираем IP адрес с интерфейса rl0
#ifconfig_rl0="inet 192.168.0.1 netmask 255.255.255.0"
# создаем мост между беспроводной и проводной локальными сетями
# и вешаем на него IP адрес шлюза локальной сети
cloned_interfaces="bridge0"
ifconfig_bridge0="inet 192.168.0.1 netmask 255.255.255.0 \
addm wlan0 addm rl0 up"
ifconfig_rl0="up"
# включаем функционал точки доступа
hostapd_enable="YES"
| Перезагружаемся. Смотрим, что получилось:
[root@GATE ~]# ifconfig
stge0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500
options=8209b<RXCSUM,TXCSUM,VLAN_MTU,VLAN_HWTAGGING,VLAN_HWCSUM,WOL_MAGIC,
LINKSTATE>
ether 01:01:01:01:01:01
inet 9.9.9.9 netmask 0xffffff00 broadcast 9.9.9.255
media: Ethernet autoselect (100baseTX <full-duplex>)
status: active
rl0: flags=8943<UP,BROADCAST,RUNNING,PROMISC,SIMPLEX,MULTICAST> mtu 1500
options=3808<VLAN_MTU,WOL_UCAST,WOL_MCAST,WOL_MAGIC>
ether 00:50:fc:ef:4d:75
media: Ethernet autoselect (100baseTX <full-duplex>)
status: active
ral0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 2290
ether 00:26:5a:77:38:ba
media: IEEE 802.11 Wireless Ethernet autoselect mode 11g <hostap>
status: running
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> metric 0 mtu 16384
options=3<RXCSUM,TXCSUM>
inet 127.0.0.1 netmask 0xff000000
bridge0:flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500
ether a6:09:ed:c1:23:38
inet 192.168.0.1 netmask 0xffffff00 broadcast 192.168.0.255
id 00:00:00:00:00:00 priority 32768 hellotime 2 fwddelay 15
maxage 20 holdcnt 6 proto rstp maxaddr 100 timeout 1200
root id 00:00:00:00:00:00 priority 32768 ifcost 0 port 0
member: rl0 flags=143<LEARNING,DISCOVER,AUTOEDGE,AUTOPTP>
ifmaxaddr 0 port 2 priority 128 path cost 200000
member: wlan0 flags=143<LEARNING,DISCOVER,AUTOEDGE,AUTOPTP>
ifmaxaddr 0 port 6 priority 128 path cost 370370
wlan0:flags=8943<UP,BROADCAST,RUNNING,PROMISC,SIMPLEX,MULTICAST> mtu 1500
ether 00:26:5a:77:38:ba
media: IEEE 802.11 Wireless Ethernet autoselect mode 11g <hostap>
status: running
ssid <SSID вашей сети> channel 1 (2412 MHz 11g) bssid 00:26:5a:77:38:ba
country US authmode WPA2/802.11i privacy MIXED deftxkey 2
AES-CCM 2:128-bit AES-CCM 3:128-bit txpower 0 scanvalid 60
protmode CTS dtimperiod 1 -dfs
| Все хорошо, Wi-fi и проводная карточки обьединены мостом и на этом мосту висит IP адрес
Приступаем к настройке PF. PF позволяет включить приоритезацию трафика. Краткое описание смотрим тут:
http://www.freebsd.org/doc/ru/books/handbook/firewalls-pf.html
создаем файлик /usr/local/etc/pf.conf и доводим его до такого состояния:
# Тут я определяю переменные, при помощи которых мне удобнее писать скрипт.
WAN="stge0"
LAN="bridge0"
LAN_POOL="192.168.0.0/24"
WANIP="9.9.9.9"
SERVER="192.168.0.3"
ADMIN="192.168.0.2"
RDP_PORT="3389"
EXTRDP_PORT="33389"
# трафик на эти порты и от них будет запрещен на внешнем интерфейсе
DROP_PORTS="{135:139,445}"
# Что делать после попадания какого-либо пакета в блокирующее правило (block)
# set block-policy drop - отбросить пакет и ничего не предпринимать
# set block-policy reject - отбросить пакет и отправить сообщение об ошибке
# хосту, который его отправил.
set block-policy drop
# Не проверять трафик на lo0
set skip on lo0
# Не проверять трафик на интерфейсе bridge0 (внутренних ограничений у нас нет)
set skip on $LAN
# "Нормализация" пакетов. Описания этой опции, на мой взгляд, достаточно
# расплывчаты, но поидее должна помогать против некоторых видов сетевых атак.
scrub in all
#У меня скорость ~5000 кбит\с, а вам надо тут вписывать свою скорость
altq on $WAN priq bandwidth 5000Kb queue { priv, other }
# У меня пристутствуют 2 очереди
# Для более приоритетного трафика (RDP от сервера)
queue priv qlimit 25 priority 14 priq(red)
# Для всех остальных
queue other qlimit 30 priority 10 priq(default)
# Размеры очередей взяты, можно сказать, с потолка :( Не слишком
# ориентируйтесь на них, пожалуйста. Попробуйте подобрать размер очереди сами
# включаем NAT на внешнем интерфейсе для LAN сети
nat on $WAN from $LAN_POOL to any -> ($WAN)
# Пробрасываем порт на сервер.Пробрасываем отличающийся от стандартного порт
# для защиты от сканирующих стандартные порты обезьян с брутфорсом
rdr on $WAN proto tcp from any to $WANIP \
port $EXTRDP_PORT -> $SERVER port $RDP_PORT
# Обрубаем ping запросы до нашего адреса
block quick on $WAN proto icmp from any to $WANIP icmp-type 8
# На внешнем интерфейсе не должно быть трафика от NETBIOS
block quick on $WAN proto { tcp udp } from any to any port $DROP_PORTS
# включаем антиспуфиг на WAN интерфейсе
# Цитирую http://openbsd.corebsd.or.id/faq/pf/ru/filter.html:
# Адреса спуфятся(spoofing), когда злоумышленник подделывает исходные
# IP адреса в пакетах, они передаются либо в оболочку своих реальных адресов,
# либо изображают другой узел в сети.После того, как пользователь был заспуфен
# они смогут запустить сетевую атаку без разоблачения реального источника
# атаки или попробовать получить доступ к сетевым сервисам, которые
# ограничены на определённые IP адреса.
antispoof quick for $WAN
#Запрет всего явно не разрешенного трафика
block all
# ### Входящий трафик
# Привилегированный трафик
pass in quick on $WAN proto tcp from any to $WANIP port $EXTRDP_PORT queue priv
# Обычный трафик
pass in quick on $WAN from any to $WANIP keep state queue other
# Вообще-то на входящем трафике приоритезация в PF не работает,но правила я
# все-таки написал.
# ### Исходящий трафик
# Привилегированный трафик
pass out quick on $WAN proto tcp from $WANIP \
port $EXTRDP_PORT to any keep state queue priv
# Обычный трафик
pass out quick on $WAN from $WANIP to any keep state queue other
| Добавляем в /etc/rc.conf строки:
pf_enable="YES"
pf_rules="/usr/local/etc/pf.conf"
| и рестартуем pf:
[root@GATE ~]# /etc/rc.d/pf restart
| Проверяем корректность создания правил при помощи команд:
pfctl -sn Cуществующие правила NAT
pfctl -sr Существующие правила трансляции
pfctl -ss Установленные соединения
pfctl -si Различные счетчики
pfctl -sa Все вышеперечисленное сразу
pfctl -sq -vvv Показывает состояние очередей
Обновляем порты при помощи portsnap:
[root@GATE ~]# portsnap fetch
Looking up portsnap.FreeBSD.org mirrors... 5 mirrors found.
Fetching snapshot tag from portsnap5.FreeBSD.org... done.
Fetching snapshot metadata... done.
Updating from Wed Jun 15 14:21:31 MSD 2011 to Thu Jul 21 11:37:27 MSD 2011.
Fetching 3 metadata patches.. done.
Applying metadata patches... done.
Fetching 3 metadata files... done.
Fetching 9656 patches.....10....
<Часть вывода удалена>
...........9650... done.
Applying patches... done.
Fetching 1282 new ports or files... done.
[root@GATE ~]# portsnap extract
/usr/ports/.cvsignore
/usr/ports/CHANGES
.................
<Часть вывода удалена>
.................
/usr/ports/x11/yelp/
/usr/ports/x11/zenity/
Building new INDEX files... done.
| В качестве кэширующего DNS-сервера используем dnscache из пакета djbdns, так как он ест меньше памяти и считается более безопасным, чем входящий в поставку FreeBSD DNS-сервер BIND.
устанавливаем djbdns:
[root@GATE ~]# cd /usr/ports/dns/djbdns && make install clean
| Собираем и устанавливаем с такими опциями:
[ ] DUMPCACHE persistent cache for dnscache
[ ] IPV6 IPv6 support by Felix von Leitner
[ ] IGNOREIP ignoreip2 patch by Russell Nelson
[ ] JUMBO jumbo patch by Claudiu Costin
[X] MAN manual pages by Gerritt Pape
[ ] PERSISTENT_MMAP persistent mmap patch by Lennert Buytenhek
[X] SRV SRV record patch by Michael Handler
| djbdns также потянет за собой порт daemontools. daemontools предназначен для запуска демонов и наблюдения за их работой. То есть если какой-то демон под его управлением "упадет", то daemontools перезапустит его.
создаем группу dnsusers, в которую будут входить пользователи, под которыми будут запускаться сам dnscache и dnslog (логгер для djbdns):
[root@GATE ~]# pw groupadd dnsusers
| создаем пользователя для dnscache:
[root@GATE ~]# pw useradd dnscache -s /sbin/nologin -d /dev/null -G dnsusers
| создаем пользователя для dnslog:
[root@GATE ~]# pw useradd dnslog -s /sbin/nologin -d /dev/null -G dnsusers
| создаем папку, с содержимым которой работает daemontools:
[root@GATE ~]# mkdir /var/service/
| добавляем в /etc/rc.conf запуск damontools:
[root@GATE ~]# echo 'svscan_enable="YES"' >> /etc/rc.conf
| запускаем daemontools:
[root@GATE ~]# /usr/local/etc/rc.d/svscan start
| производим начальное конфигурирование dnscache, задавая ему адрес, на котором он будет висеть. В моем случае адрес 192.168.0.1:
[root@GATE ~]# dnscache-conf dnscache dnslog /usr/local/etc/dnscache 192.168.0.1
| так как конфигурация dnscache находится в /usr/local/etc/djbdns, а daemontools работает с папкой /var/service, делаем ссылку:
[root@GATE ~]# ln -s /usr/local/etc/dnscache /var/service/dnscache
| В папке /usr/local/etc/dnscache/env находятся файлы с более расширенной конфигурацией dnscache, но в данном случае нас вполне устроят значения по умолчанию.
Для нормальной работы сервера нужно задать ему адреса вышестоящих серверов. За каждую зону отвечает файл с таким же, что и имя зоны, именем, находящийся в /usr/local/etc/dnscache/root/servers. В каждый файл вписываются ip адреса серверов, ответственных за эту зону. Так как мы любые запросы перенаправляем на DNS-сервера провайдера, мы пишем их имена в файл с именем "@" (ответственный за корневую зону).
[root@GATE ~]# cat /usr/local/etc/dnscache/root/servers/@
9.9.9.254
9.9.9.253
| Защищаем наш сервер от обращений с не наших IP адресов. Создаем в папке /usr/local/etc/dnscache/root/ip файлы с именами сетей. То есть для нашей сети (префикс 24) нужно создать файл 192.168.0
[root@GATE ~]# touch /usr/local/etc/dnscache/root/ip/192.168.0
| Перезапускаем dnscache:
[root@GATE ~]# svc -t /var/service/dnscache
| Проверяем, все ли нормально:
[root@GATE ~]# svstat /var/service/dnscache
/var/service/dnscache: up (pid 11085) 141 seconds
|
[root@GATE ~]# sockstat -l | grep dnscache
dnscache dnscache 11085 3 udp4 192.168.0.1:53 *:*
dnscache dnscache 11085 4 tcp4 192.168.0.1:53 *:*
| все нормально, заставляем фряху обращаться к своему DNS-серверу. Для этого пишем в файл /etc/resolv.conf адрес, на котором висит dnscache:
[root@GATE ~]# echo "nameserver 192.168.0.1" > /etc/resolv.conf
| Устанавливаем DHCP сервер (я его собрал с такими опциями):
[root@GATE ~]# cd /usr/ports/net/isc-dhcp41-server && make install clean
Options for isc-dhcp41-server 4.1.e_1,2
[ ] DHCP_IPV6 Enable support for IPv6
[X] DHCP_PARANOIA Enable support for chroot
[ ] DHCP_LDAP Experimental LDAP backend support
[ ] DHCP_LDAP_SSL Support LDAP connection over SSL/TLS
| Доводим конфиг DHCP сервера (/usr/local/etc/dhcpd.conf) до такого состояния:
local-address 192.168.0.1;
default-lease-time 600;
max-lease-time 7200;
authoritative;
ddns-update-style interim;
log-facility local7;
subnet 192.168.0.0 netmask 255.255.255.0 {
range 192.168.0.10 192.168.0.250;
option routers 192.168.0.1;
# Если у вас поднята SAMBA, то вы можете попробовать отдавать клиентам
# еще и значение WINS-сервера.
# option netbios-name-servers 192.168.0.1;
# у нас уже поднят свой DNS-сервер, поэтому отдаем его адрес
option domain-name-servers 192.168.0.1;
}
# "привязываем" определенные MAC адреса к определенным IP адресам
host admin {
hardware ethernet 03:03:03:03:03:03;
fixed-address 192.168.0.2;
}
host server {
hardware ethernet 04:04:04:04:04:04;
fixed-address 192.168.0.3;
}
| Добавляем в /etc/rc.conf строки:
dhcpd_enable="YES"
dhcpd_ifaces="bridge0" #интерфейс, на котором будет работать DHCP-сервер
# в нашем случае и для проводной и для беспроводной сети
| и стартуем DHCP сервер:
[root@GATE ~]# /usr/local/etc/rc.d/isc-dhcpd start
| Проверяем, запустился или нет:
[root@GATE ~]# sockstat -l | grep dhcpd
dhcpd dhcpd 1047 7 udp4 192.168.0.1:67 *:*
| Все нормально. Функционал простейшего dir-300 достигнут.
размещено: 2011-08-14,
последнее обновление: 2013-09-24,
автор: zentarim
|
|
Aler, 2011-08-16 в 6:45:25
а про \"- чтобы проводные и беспроводные клиенты получали адреса автоматически по DHCP\"?