Что хотим получить: - чтобы 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
убираем из ядра все ненужные драйвера (ну или не убираем, кому как удобно) и пересобираем ядро с опциями:
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
Редактируем /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"
# Тут я определяю переменные, при помощи которых мне удобнее писать скрипт.
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 1514:21:31 MSD 2011 to Thu Jul 2111: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 перезапустит его.
создаем группу, в которую будут входить пользователи, под которыми будут запускаться сам dnscache и dnslog (логгер для djbdns):
В папке /usr/local/etc/dnscache/env находятся файлы с более расширенной конфигурацией dnscache, но в данном случае нас вполне устроят значения по умолчанию.
Для нормальной работы сервера нужно задать ему адреса вышестоящих серверов. За каждую зону отвечает файл с таким же, что и имя зоны, именем, находящийся в /usr/local/etc/dnscache/root/servers. В каждый файл вписываются ip адреса серверов, ответственных за эту зону. Так как мы любые запросы перенаправляем на DNS-сервера провайдера, мы пишем их имена в файл с именем "@" (ответственный за корневую зону).
Защищаем наш сервер от обращений с не наших IP адресов. Создаем в папке /usr/local/etc/dnscache/root/ip файлы с именами сетей. То есть для нашей сети (префикс 24) нужно создать файл 192.168.0