ITСooky

IT-рецепты съедобные и не очень!

Создаем шлюз на FreeBSD и Wi-Fi точку доступа!

дата 30.09.2011

Домашний шлюз на FreeBSD для доступа к общим ресурсам и интернету по Wi-Fi с автоматическим получением IP адреса по DHCP!

Ингредиенты:
1. Сервер с установленной FreeBSD 8.1
2. PCI Wi-Fi карта низко профильная
3. Ethernet свич, хаб, коммутатор да как его только не называют даже маршрутизатор!
4. Putty

К сожалению низко профильную планку для PCI разъема найти не удалось но сама плата низко профильная — так что влезла, а как её там закрепить каждый придумывает сам!

Для того чтобы сервер заработал как шлюз мало указать при установке gateaway_enable «YES» для этого надо пересобрать ядро ОС с нужными параметрами! Кстати если gateaway_enable не установлен это можно сделать в любой момент:

sysinstall

[Options] — выбираем нужный параметр.

Для начала посмотрим что у нас за версия ситемы делаем:

uname -a

или

sysctl kern.version

видим

FreeBSD Server.Home 8.1-RELEASE FreeBSD 8.1-RELEASE #0: Mon Jul 19 02:55:53 UTC 2010     root@almeida.cse.buffalo.edu:/usr/obj/usr/src/sys/GENERIC  i386

GENERIC — чистое ядро после установки никем не тронутое!

Перед сборкой ядра надо установить его исходники например с CD, делать это надо при первой пересборке ядра!

sysinstal

выбираем
Configure>Distributions>
[] src Source for everything
[x] sys
OK

Теперь приступаем к сборке ядра тут используем ранее выясненное имя ядра GENERIC

cd /usr/src/sys/i386/conf
cp GENERIC ipfwcrypt

Открываем файл, напоминаю команды редактора vi — кнопки [esc] [i] редактировать, [esc] [x] удалить, [esc] [:q!] [enter] выйти без записи, [esc] [:wq!] [enter] выйти записать.

vi ipfwcrypt

меняем строку на

ident    ipfwcrypt

Для шлюза добавляем в конце строки

options IPFIREWALL
options IPFIREWALL_VERBOSE
options IPFIREWALL_VERBOSE_LIMIT=50
options IPFIREWALL_FORWARD
options IPDIVERT
options DUMMYNET
options IPFIREWALL_DEFAULT_TO_ACCEPT

Сразу добавляем для шифрованного раздела (если надо) снизу, чтобы по сто раз не пересобирать ядро это всё таки очень долго!

options GEOM_ELI
device crypto

далее делаем

config ipfwcrypt
cd /usr/src/sys/i386/compile/ipfwcrypt
make cleandepend && make && make install

Последняя операция занимает значительное количество времени, по окончании для шифрования надо добавить в /boot/loader.conf

vi /boot/loader.conf

текст

geom_eli_load="YES"

Инструкция по установке шифрораздела тут, этим нужно заняться позже.

Перезагружаемся

reboot

Смотрим какие у нас сетевые интерфейсы есть

ifconfig

re0
status: runnig
ath0
status: no carier — не работает
Нам повезло чип Wi-Fi Atheros IEEE 802.11, а ни какой нибудь экзотический rt28600, хотя его тоже можно заставить работать!

Устанавливаем Wi-Fi

Создаем интерфейс коммандой

ifconfig wlan0 create wlandev ath0

Добавляем в rc.conf строки даем беспроводному интерфейсу IP

wlans_ath0="wlan0"
ifconfig_wlan0="inet 10.10.30.1/24"
create_args_wlan0="wlanmode hostap country RU"
hostapd_enable="YES"

Создаем файл

vi /etc/hostapd.conf

добавляем в него строки

interface=wlan0
hw_mode=g
macaddr_acl=0
auth_algs=1
ssid=Imya_Nashe_Tochki_dostupa
ctrl_interface=/var/run/hostapd
ctrl_interface_group=wheel
wpa=2
wpa_passphrase=12345678
wpa_key_mgmt=WPA-PSK
wpa_pairwise=CCMP

wpa_passphrase должен быть не менее 8 знаков

Перезагружаемся. Теперь в ifconfig мы видим что Wi-Fi заработал

ath0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 2290
        ether 00:11:95:e7:3a:8c
        media: IEEE 802.11 Wireless Ethernet autoselect mode 11g <hostap>
        status: running
<...>
wlan0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
        ether 00:11:95:e7:3a:8c
        inet 10.10.30.1 netmask 0xffffff00 broadcast 10.10.30.255
        media: IEEE 802.11 Wireless Ethernet autoselect mode 11g <hostap>
        status: running
        ssid Imya_Nashe_Tochki_dostupa channel 11 (2462 MHz 11g) bssid 00:11:95:e7:3a:8c

Запускаем шлюз IPFW

Добавляем в /etc/rc.conf строки

firewall_enable="YES"
firewall_type="/etc/rc.firewall"
firewall_logging="YES"

Переименовываем стандартный файл настроек

mv /etc/rc.firewall /etc/rc.firewall.old

Создаем файл /etc/rc.firewall

vi /etc/rc.firewall

Добавляем в него строки

#!/bin/sh
FwCMD="/sbin/ipfw"
lanout="re0"
lanin="wlan0"
ipout="192.168.1.107"
ipin="10.10.30.1"
netin="10.10.30.0/24"
# Sbrasyvaem vse pravila:
${FwCMD} -f flush
# 
${FwCMD} add allow ip from any to 127.0.0.1
${FwCMD} add allow ip from 127.0.0.1 to any
#${FwCMD} add fwd 127.0.0.1,3128 tcp from ${netin} to any 80 via ${lanout}
${FwCMD} add allow all from any to any via lo0
${FwCMD} add check-state
#!!! ROUTING
#${FwCMD} add divert 199 ip from any to any out xmit ${lanin}
#${FwCMD} add divert 199 ip from any to any in recv ${lanin}
#${FwCMD} add divert 199 ip from any to any out xmit ${lanout}
${FwCMD} add divert natd ip from any to any out via ${lanout}
${FwCMD} add divert natd ip from any to me in via ${lanout}
#${FwCMD} add divert 199 ip from any to any in recv ${lanout}
${FwCMD} add allow tcp from any to any established
${FwCMD} add allow ip from ${ipout} to any out xmit ${lanout}
# DNS udp zaprosy po 53 portu
${FwCMD} add allow udp from any 53 to any via ${lanout}
${FwCMD} add allow udp from any to any 53 via ${lanout}
#${FwCMD} add allow ip from any to ${netin} in via ${lanin}
#${FwCMD} add allow ip from ${netin} to any out via ${lanin}
#!!! RAZRESHENO
#HTTP WEB SERVER iz vnutrenney seti y vneshnei
${FwCMD} add allow tcp from any to ${ipout} 80 in via ${lanout} setup
${FwCMD} add allow tcp from any to ${ipin} 80 in via ${lanin} setup
# PING
${FwCMD} add allow icmp from any to any out via ${lanout} keep-state
${FwCMD} add allow icmp from any to any in via ${lanout}
# Mail POP SMTP
${FwCMD} add allow tcp from any to any 110 via ${lanin}
${FwCMD} add allow tcp from any to any 25 via ${lanin}
#LDAP
${FwCMD} add allow tcp from any to any 389 via ${lanin}
# WWW
${FwCMD} add allow tcp from any to any 80 via ${lanin}
${FwCMD} add allow tcp from any to any 443 via ${lanin}
# Ne pomnu
${FwCMD} add allow icmp from any to any via ${lanin}
#SAMBA
${FwCMD} add allow tcp from any to any 135,137,138,139,445 via ${lanin}
${FwCMD} add allow udp from any to any 135,137,138,139,445 via ${lanin}
#DHCP
${FwCMD} add allow udp from any to any 67,68 via ${lanin}
#DNS
${FwCMD} add allow udp from any to any via ${lanin}
#SHH
${FwCMD} add allow tcp from any to any 22 via ${lanin}
#uVNC
${FwCMD} add allow tcp from any to any 5900,5500 via ${lanin}
# SSH iz vnewnei seti
${FwCMD} add allow tcp from 192.168.1.156 to ${ipout} 22 via ${lanout} keep-state
#!!! Zapreshaem vsio ostalnoe
${FwCMD} add deny all from any to any 

В файле много строк закоменчено, они нам потребуются далее! В начае описываем наши интерфейсы и сети

lanout="re0" 

— интерфейс смотрящий на ружу будь то на adsl модем или во внешнею сеть на прямую

lanin="wlan0"

— Wi-Fi интерфейс именно так а не ath0

ipout="192.168.1.107"

— IP внешнего интерфейса, здесь может быть и статический внешний IP(у кого есть конечно)

ipin="10.10.30.1"

— IP точки доступа
n

etin="10.10.30.0/24"

— маска сети тут можно повыпендривать и ограничивать ей например елси подклбчений будет 16 то писать (уф быстро это забывает — есть унивирсальный способ с дофичным деление но проще посмотреть в книжке) 10.10.30.0/24 приэтом реально можно использовать 14 IP адресов один отсается для имени сети другой на широковещательные запросы. Вообщем тюнег сети при помощи масок в домашей ести не нужен! А где нужен там это делаеют VLAN’ом!

В секции # RAZRESHENO идет перечесление портов которые можно использовать — они привязываются к интерфейсу
Эта строка разрешает заход по SSH только с ip 192.168.1.156 измените его на свой ip с внешнего интерфейса

# SSH
${FwCMD} add allow tcp from 192.168.1.156 to ${ipout} 22 via ${lanout} keep-state

Также нам нужен natd — Network Address Translation daemon
Добавляем следующие строки в /etc/rc.conf:

natd_enable="YES"
natd_interface="re0"
natd_flags="-m -u"

Также нам нужен DNS proxy — чтобы клиентам по DHCP раздавать его а не реальный, на случай экстренной смены оного (чтобы не менять у каждого кто не на DHCP).

cd /usr/ports/dns/totd
make&make install

В rc.conf добавляем

totd_enable="YES"

Создаем /usr/local/etc/totd.conf указываем интернет шлюз тот же что и в настройках ос

forwarder 213.12.3.213
interfaces re0

Настраиваем DHCP раздачу IP адресов и всего автоматом. Устанавливаем DHCP соглашаемся на всё что предлагают!

cd /usr/ports/net/isc-dhcp31-server
make install

В /etc/rc.conf добавляем

dhcpd_enable="YES"
dhcpd_flags="-q"
dhcpd_ifaces="wlan0"
dhcpd_conf="/usr/local/etc/dhcpd.conf"

Создаем файл /usr/local/etc/dhcpd.conf в нем пишем

option domain-name "DHCP_Prosto_Imya";
ddns-update-style none;
option domain-name-servers 192.168.1.107;
option subnet-mask 255.255.255.0;

subnet 10.10.30.0 netmask 255.255.255.0
{
interface wlan0;
range 10.10.30.10 10.10.30.25;
option routers 10.10.30.1;
option domain-name-servers 192.168.1.107;
}

Перезагружаемся!

reboot

У нас должна получится точка доступа Wi-Fi под именем Imya_Nashe_Tochki_dostupa c автоматической раздаче IP и интернетом пока никак не ограниченным по URL и без подсчета трафика!

Если что-то не работает начинаем проверять!

Проверим файл настроек DHCP

dhcpd -cf /usr/local/etc/dhcpd.conf

Смотрим статистику шлюза по всем правилам, цифорки есть значит трафик идет!

ipfw show 

Смотрим запущено ли natd, totd, dhcpd

ps auxc | egrep -w 'totd|dhcpd|natd' | egrep -v 'egrep'

Всё запущено — хорошо

root    981  0.0  0.1  3568  1444  ??  Is   12:59PM   0:00.02 natd
root   1042  0.0  0.1  3288  1332  ??  Ss   12:59PM   0:00.07 totd
dhcpd  1194  0.0  0.3  4312  2940  ??  Is   12:59PM   0:00.00 dhcpd
root   1609  0.0  0.1  3288  1288  ??  Ss    1:32PM   0:00.03 totd

Подключаемся к Wi-Fi точке с какого-нибуть утсройства у нас должно быть:
IP: в интервале 10.10.30.10-10.10.30.25
Шлюз: 10.10.30.1
DNS: 192.168.1.107

Далее будем считать трафик и ограничивать интернет…