Wi-fi роутер с DHCP FreeBSD 8.2
/*
Захотелось мне получить от роутера на фряхе функционал простейшего роутера dlink. То есть чтобы вай-фай был в одной подсети с проводными клиентами, адреса раздавались по dhcp, NAT, редирект портов, ну и всего остального по мелочи.
*/
что хотим:
- чтобы wi-fi клиенты были в одной подсети с проводными.
- чтобы проводные и беспроводные клиенты получали адреса автоматически по DHCP
- само собой хотим, чтобы все ходили в интернет
- чтобы был доступ по RDP на внутренний сервер
что имеем:
Celeron 700, 256 мб RAM, IDE винт на 80 гб и странную мамку, которая вменяемо работает только с отключенным ACPI
сетевые карты:
Код: Выделить всё
LAN - rl0 (10\100 какой-то реалтек, который не может "пробить" 50 метров до моего провайдера)
rl0@pci0:1:8:0: class=0x020000 card=0x813910ec chip=0x813910ec rev=0x10 hdr=0x00
vendor = 'Realtek Semiconductor'
device = 'Realtek RTL8139 Family PCI Fast Ethernet NIC (RTL-8139/8139C/8139D)'
class = network
subclass = ethernet
WAN - stge0 (10\100\1000 asus адаптер)
stge0@pci0:1:5:0: class=0x020000 card=0x81801043 chip=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=0x028000 card=0x3a711186 chip=0x03021814 rev=0x00 hdr=0x00
vendor = 'Ralink Technology, Corp.'
device = 'wireless a/b (RT2525 2.4GHz transceiver + RT2560 MAC/BBP)'
class = network
диапазон локальной сети: 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
Код: Выделить всё
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"
Код: Выделить всё
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/sys/i386/conf
[root@GATE /usr/src/sys/i386/conf]# config GATE
Kernel build directory is ../compile/GATE
Don't forget to do ``make cleandepend && make depend''
[root@GATE /usr/src/sys/i386/conf]#
[root@GATE /usr/src/sys/i386/conf]# cd ../compile/GATE
[root@GATE /usr/src/sys/i386/compile/GATE]#make clean && make cleandepend && make depend && make && make install clean
Код: Выделить всё
[root@GATE ~]# ifconfig
stge0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 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> metric 0 mtu 16384
options=3<RXCSUM,TXCSUM>
inet 127.0.0.1 netmask 0xff000000
Редактируем /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
Код: Выделить всё
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 (комментируем строку, в которой присваиваем адрес интерфейсу 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> metric 0 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> metric 0 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> metric 0 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> metric 0 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
Приступаем к настройке PF. PF позволяет включить приоритезацию трафика. Краткое описание смотрим тут: http://www.freebsd.org/doc/ru/books/han ... ls-pf.html
создаем файлик /usr/local/etc/pf.conf и доводим его до такого состояния:
Код: Выделить всё
# Тут я определяю переменные, при помощи которых мне удобнее писать скрипт.
WAN="stge0"
LAN="bridge0"
LAN_POOL="192.168.0.0/24"
WANIPADDR="9.9.9.9"
SERVER="192.168.0.3"
ADMIN="192.168.0.2"
RDP_PORT="3389"
EXT_RDP_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 до 5200 кбит\с, а вам надо тут вписывать свою скорость
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 $WANIPADDR port $EXT_RDP_PORT -> $SERVER port $RDP_PORT
# Обрубаем ping запросы до нашего адреса
block quick on $WAN proto icmp from any to $WANIPADDR 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
# Вообще на входящем трафике приоритезация в PF не работает, но правила я все-таки написал.
# Привилегированный трафик
pass in quick on $WAN proto tcp from any to $WANIPADDR port $EXT_RDP_PORT queue priv
# Обычный трафик
pass in quick on $WAN from any to $WANIPADDR keep state queue other
#Исходящий трафик
# Привилегированный трафик
pass out quick on $WAN proto tcp from $WANIPADDR port $EXT_RDP_PORT to any keep state queue priv
# Обычный трафик
pass out quick on $WAN from $WANIPADDR to any keep state queue other
Код: Выделить всё
pf_enable="YES"
pf_rules="/usr/local/etc/pf.conf"
Код: Выделить всё
[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.
Код: Выделить всё
[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
Код: Выделить всё
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;
option domain-name-servers 9.9.9.254, 9.9.9.253;
}
# "привязываем" определенные 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;
Код: Выделить всё
dhcpd_enable="YES"
dhcpd_ifaces="bridge0" #интерфейс, на котором будет работать 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 *:*