В данной статье мы расскажем о настройке роутера на базе FreeBSD выполняющего роль шлюза в инернет с установкой firewall-a, и поддерживающем статическую arp таблицу mac адресов в локальной сети. Речь пойдет о IPFW который в FreeBSD служит верой и правдой уже много лет, тем более что в последней версии в составе c FreeBSD 4.0 исправленны ошибки и добавленна корректная возможность ограничивать полосу пропускания по интерфейсу (использование pipe с опцией bw). Предположим что мы имеет роутер с тремя сетевыми платами одна из которых (назовем ее vx0, IP 200.200.200.1) смотрит в сторону Internet-a а вторая (назовем ее vx1, IP 200.200.200.2) смотрит в сторону локальной сети с реальными 18 IP адресами (subnet 200.200.200.0/28 netmask 255.255.255.240). К третьей сетевой карточке (vx2 IP 192.168.1.1 и сеть 192.168.1.0/28) подключена 10Mb сеть соседнего офисса. Задачи перед нами поставленны следующие: 1. Закрыть доступ во внутренюю сеть извне по портам 135,137,139 2. Дать возможность пользователям локальной сети работать с почтой и работать с в броузере с WWW,FTP серверами других компаний. 3. Закрыть на роутере возможность атаки типа SYN Flood, ICMP Flood. 4. Закрыть доступ к корпоративному WWW,FTP серверу (200.200.200.5) используемый для работы с отчетами выставленными на этот WWW server только в пределах локальной сети и доступа из филиала который имеет IP 190.190.190.5 5. Открыть доступ для конфигурирования этого роутера с определеного хоста системного администратора. 6. Обеспечить подсчет трафика по IP адресам в локальной сети чтобы впоследствии доказать что Вася весь месяц только и занимался скачиванием c www.playboy.com картинок сомнительного содержания. 7. Ограничить трафик 64Kb на третьей сетевой карточке для дружественного клиента компании находящемуся в том же здании и подключенному по 10Mb к нашему роутеру и закрыть доступ с их стороны в локальную сеть нашей компании. Итак приступим. 1. Конфигурирование ядра и опций запукаемых скриптов. В ядро необходимо занести следующие опции: options IPFIREWALL (включает в ядро код для фильтрации пакетов) options IPFIREWALL_VERBOSE (включает возможность вести логи по правилам фильтрации и проходящих пакетов) options IPFIREEWALL_VERBOSE_LIMIT=10 (ограничение списка числа пакетов записываемых в лог для того чтобы не зафлудили syslog) options TCP_DROP_SYNFIN (отбрасывает TCP пакеты с SYN и FIN) В итоге при перезагрузке системы мы получим firewall который по умолчанию закрывает прохождение любого IP трафика по всем интерфейсам. Далее мы определим правила которые откроют только те порты TCP или UDP которые нужны для работы пользователей. Если Вы придерживаетесь другого подхода - "сначала все откроем а потом будем закрывать" то вам необходимо указать следующую опцию в ядре: options IPFIREWALL_DEFAULT_TO_ACCEPT В /etc/defaults/rc.conf указываем следующее: tcp_extensions="NO" (отключаем "опасные" из RFC1323 расширения TCP) tcp_drop_synfin="YES" (отбрасывем SYN + FIN) icmp_drop_redirect="YES" (игнорируем перенаправленные ICMP пакеты) icmp_log_redirect="YES" (включаем логинг ICMP REDIRECT) firewall_enable="YES" (включаем использование firewall) firewall_type="Company" (указываем что наши настройки firewalla находятся в rc.firewall в разделе "Company") defaultrouter="199.199.199.1" (шлюз до нашего ISP) 2. Конфигурирование IPFW. Теперь приступаем к написанию правил IPFW. Более побдробное описание синтактиса можно прочитать в handbook или man ipfw. Поскольку мы создаем свою конфигурацию ("Company") то делаем ее описание в rc.firewall: # Описываем сеть и интерфейсы fw="200.200.200.1" local="200.200.200.2" client="192.168.1.1" net="200.200.200.0/28" mask="255.255.255.255.240" # Разрешаем трафик по local интерфейсу ${fwcmd} add pass all from any to any via lo0 # Разрешаем трафик только в пределах локальной сети ${fwcmd} add pass all from any to any via vx1 # Запрещаем прохождение фрагментированных пакетов ${fwcmd} add deny icmp from any to any frag # Разрешаем прохождение ICMP пакетов ${fwcmd} add pass ICMP from any to any # Разрешаем работу с SMTP протоколом ${fwcmd} add pass tcp from any to any 25 out ${fwcmd} add pass tcp from any 25 to any out # Разрешаем работу с HTTPS протоколом ${fwcmd} add pass tcp from any to any 443 out ${fwcmd} add pass tcp from any 443 to any out # Запрещаем работу снаружи с внутреним сервером компании ${fwcmd} add pass tcp from 199.199.199.10 to 200.200.200.5 80 via vx0 ${fwcmd} add pass tcp from 200.200.200.5 80 to 199.199.199.10 via vx0 # Запрещаем работу снаружи с внутреним сервером компании ${fwcmd} add deny tcp from any to 200.200.200.5 80 in via vx0 # Разрешаем работу с HTTP протоколом ${fwcmd} add pass tcp from any to any 80 out via vx1 ${fwcmd} add pass tcp from any 80 to any out via vx1 # Разрешаем работу по всем протоколам в пределах # только локальной сети нашей компании ${fwcmd} add allow all from any to any via vx1 # Разрешаем работу с DNS серверами ${fwcmd} add pass udp from any to any 53 ${fwcmd} add pass udp from any 53 to any # Разрешаем работу с NEWS Серверами ${fwcmd} add pass udp from any to any 119 out via vx1 ${fwcmd} add pass udp from any 119 to any out via vx1 # Разрешаем забор почты по POP3 протоколу ${fwcmd} add pass udp from any to any 110 ${fwcmd} add pass udp from any 110 to any # Разрешаем работу с FTP серверами # Обратите внимание что 20 порт протокола TCP используется для # передачи данных, помимо 21 порта. ${fwcmd} add pass tcp form any 21 to any ${fwcmd} add pass tcp from any to any 21 ${fwcmd} add pass tcp from any 20 to any ${fwcmd} add pass tcp from any to any 20 # Разрешаем доступ по ssh с домашней машины # администратора имеющей IP 200.200.200.15 ${fwcmd} add pass tcp from 200.200.200.15 22 to {isp} ${fwcmd} add pass tcp from {isp} to 200.200.200.15 22 # Ограничиваем трафик с сетевой карточки vx2 в локальную сеть # нашей компании ${fwcmd} add deny all from 192.168.1.0/24 to ${net}:${mask} via vx1 ${fwcmd} add deny all from ${net}:${mask} to 192.168.1.0/24 via vx1 # Разрешаем работу по базовым портам TCP на интерфейсе vx2 ${fwcmd} add pass tcp from 192.168.1.0/24 to any 25 via vx2 ${fwcmd} add pass tcp from any 25 to 192.168.1.0/24 via vx2 ${fwcmd} add pass tcp from 192.168.1.0/24 to any 110 via vx2 ${fwcmd} add pass tcp from any 110 to 192.168.1.0/24 via vx2 ${fwcmd} add pass udp from 192.168.1.0/24 to any 53 via vx2 ${fwcmd} add pass udp from any 53 to 192.168.1.0/24 via vx2 ${fwcmd} add pass tcp from 192.168.1.0/24 to any 80 via vx2 ${fwcmd} add pass tcp from any 80 to 192.168.1.0/24 via vx2 # Ограничиваем полосу пропускания на интерфейсе vx2 в 64 Kb. # для входящего трафика ${fwcmd} add pipe 1 ip from any to any in via vx0 ${fwcmd} add pipe 1 config bw 64Kbit/s # Ограничиваем полосу пропускания на интерфейсе vx2 в 64 Kb. # для исходящего трафика ${fwcmd} add pipe 2 ip from any to any out via vx0 ${fwcmd} add pipe 2 config bw 64Kbit/s Для проверки работы правил вы можете воспользоваться популярным сканером TCP/IP NMAP (входит в состав FreeBSD) дав например команду: nmap 200.200.200.1 или nmap 200.200.200.2 находясь за пределами диапазона адресов вашей сети, или попросив об этом вашего ISP. 3. Предотвращение подделки MAC адреса Нам необходимо обезопасить наш роутер от возможности принятия пакетов с IP адресами которые могут попасть в локальную сеть извне под видом легальных пакетов TCP/IP входящие в диапазон сети 200.200.200.0/28. Даже если это произойдет то на этот случай у нас есть жестко привязанная таблица IP адресов к MAC адресам сетевых карт и роутера нашего ISP. Иногда это бывает необходимо как мера от нечистоплотных сотрудников которые меняют IP адресс своего хоста на адрес другого ПК, владелец которого например находится в отпуске и шишки соотв. посыплятся на него;) Для начала вам нужно построить MAC таблицу адресов, где формат ее будет примерно таким: petya 00:20:af:4a:3e:e3 vasya 00:20:fg:3a:3e:21 sasha 00:20:fg:3a:3e:21 marina 00:20:fg:3a:3e:21 и сохранить ее в файле например /etc/ethers. Для того чтобы узнать Ethernet адрес хоста достаточно на нем набрать arp -a. При запуске на роутере arp -f /etc/ethers вся информация о соответствии IP адреса и MAC адреса сетевой карточки при работе протокола ARP будет браться из файла /etc/ether и замораживаться. Это процесс можно автоматизировать запустив на роутере arpwatch (он есть в портах FreeBSD) и сделав на каждом хосте файл /etc/hosts с описанием пары name_hosts IP_adress и /etc/ethers с вышеприведенным форматом. Когда появляется факт подмены IP адресса то arpwatch посылает письмо с описанием проишедшего и таблица arp замораживается. 4. Настраиваем статистику. Для создания стратистики мы будем использовать ipfm входящий в состав пакетов FreeBSD. При инсталяции в /usr/local/etc/rc.d создается файл ipfm.sh а в /usr/local/etc файл ipfm.conf. Его то как раз нам и нужно отредактировать. Итак приступим: ##### FIRST LOGGING CONFIGURATION ##### # Описывем внутреннюю сеть с которой снимаем статистику LOG 200.200.200.0/255.255.255.240 NOT WITH 200.200.0.0/255.255.0.0 # Присваиваем название файлу для сбора статистики FILENAME /var/log/ipfm/local_net-%d.%m-%H.%M.%S # Устанавливаем период записи в лог в нашем случае лог будет обновляться # еженедально TIME 7 day SORT IN RESOLVE ##### SECOND LOGGING CONFIGURATION ##### NEWLOG # Описывем внутреннюю сеть нашего клиента 192.168.1.0/24 subnet 192.168.1.0/255.255.255.0 NOT WITH 192.168.0.0/255.255.0.0 # Задаем период записи в лог в данном случае 1 день FILENAME /var/log/ipfm/ipfm-%d.%m-%H.%M.%S # Log on a period of one week TIME 1 day SORT IN RESOLVE Если же требуется более детальная информация по протоколам и количеству передаваемых пакетов то можно воспользоваться опцией count в ipfw: # Подсчитываем входящий и исходящий трафик по HTTP протоколу ipfw add count tcp from any to any 80 in via vx0 ipfw add count tcp from any to any 80 out via vx0 # Подсчитываем входящий и исходящий трафик по HTTP протоколу для клиентов ipfw add count tcp from any to any 80 in via vx2 ipfw add count tcp from any to any 80 out via vx2 ipfw add count tcp from any to any 21 in via vx2 ipfw add count tcp from any to any 21 out via vx2 Еcли же вас интересует статистика с конкретного IP адреса то вы просто указываете так: ipfw add count tcp from any to 200.200.200.3 in via vx1 где 200.200.200.3 это IP адрес пользователя например Васи который ежемесячно скачивает с www.playboy.com графические файлы. Вы можете также закрыть доступ к этому сайту например таким способом: ipfw add log deny all from any to www.playboy.com с записью в лог попыток обращения к нему. Графическая статистика строится с применением пакеты MRTG (Multi Router Transfeer Grapheer) при использовании агента snmp запущенного на роутере. Также необходимо установить на роутере средства обнаружения атак, но это уже тема для другой статьи.

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:

# 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:

9 .9 .9 .1 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

собираем и устанавливаем ядро:

# cd /usr/src # make buildkernel KERNCONF=GATE && \ make installkernel KERNCONF=GATE

Перезагружаемся и смотрим, что получилось:

8843 mtu 1500 options =8209b ether 01 :01 :01 :01 :01 :01 inet 9 .9 .9 .9 9 .9 .9 .255 8802 metric 0 mtu 1500 options =3808 ether 00 :50 :fc :ef:4d:75 inet 192 .168 .0 .1 netmask 0xffffff00 broadcast 192 .168 .0 .255 media : Ethernet autoselect (100baseTX 8802 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 mtu 16384 options =3 inet 127 .0 .0 .1 netmask 0xff000000

Wi-fi карточка определилась как ral0. Уже хорошо. Можно еще раз пересобрать ядро и убрать ненужные драйвера для беспроводок.

Редактируем /etc/hostapd.conf до такого состояния:

Редактируем /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"

Перезагружаемся. Смотрим, что получилось:

# ifconfig stge0: flags =8843 mtu 1500 options =8209b ether 01 :01 :01 :01 :01 :01 inet 9 .9 .9 .9 netmask 0xffffff00 broadcast 9 .9 .9 .255 media : Ethernet autoselect (100baseTX ) status : active rl0: flags =8943 mtu 1500 options =3808 ether 00 :50 :fc :ef:4d:75 media : Ethernet autoselect (100baseTX ) status : active ral0: flags =8843 metric 0 mtu 2290 ether 00 :26 :5a:77 :38 :ba media : IEEE 802 .11 status : running lo0: flags =8049 metric 0 mtu 16384 options =3 inet 127 .0 .0 .1 netmask 0xff000000 bridge0:flags =8843 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 ifmaxaddr 0 port 2 priority 128 path cost 200000 member: wlan0 flags =143 ifmaxaddr 0 port 6 priority 128 path cost 370370 wlan0:flags =8943 mtu 1500 ether 00 :26 :5a:77 :38 :ba media : IEEE 802 .11 Wireless Ethernet autoselect mode 11g status : running 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
pf_enable="YES" pf_rules="/usr/local/etc/pf.conf"

и рестартуем pf:

# /etc/rc.d/pf restart

Проверяем корректность создания правил при помощи команд:

pfctl -sn Cуществующие правила NAT
pfctl -sr Существующие правила трансляции
pfctl -ss Установленные соединения
pfctl -si Различные счетчики
pfctl -sa Все вышеперечисленное сразу
pfctl -sq -vvv Показывает состояние очередей

Обновляем порты при помощи portsnap:

# 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. # 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:

# 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):

создаем пользователя для dnslog:

# pw useradd dnslog -s /sbin/nologin -d /dev/null -G dnsusers

создаем папку, с содержимым которой работает daemontools:

запускаем daemontools:

так как конфигурация dnscache находится в /usr/local/etc/djbdns, а daemontools работает с папкой /var/service, делаем ссылку:

# ln -s /usr/local/etc/dnscache /var/service/dnscache

В папке /usr/local/etc/dnscache/env находятся файлы с более расширенной конфигурацией dnscache, но в данном случае нас вполне устроят значения по умолчанию.

Для нормальной работы сервера нужно задать ему адреса вышестоящих серверов. За каждую зону отвечает файл с таким же, что и имя зоны, именем, находящийся в /usr/local/etc/dnscache/root/servers. В каждый файл вписываются ip адреса серверов, ответственных за эту зону. Так как мы любые запросы перенаправляем на DNS-сервера провайдера, мы пишем их имена в файл с именем "@" (ответственный за корневую зону).

Перезапускаем dnscache:

Устанавливаем DHCP сервер (я его собрал с такими опциями):

# 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 строки:

и стартуем DHCP сервер:

Все нормально. Функционал простейшего dir-300 достигнут.

Не так давно нужно было поставить гейт в Интернет для одного интернет-кафе. Кафе имело доступ к Интернету через ADSL-модем с Ethernet интерфейсом и локалку на 50 компьютеров со статическими адресами. Решено было поставить именно шлюз, а не купить обычной роутер с NAT, так как в роутерах все равно крутится урезанный линукс, а шлюз на базе ПК имел гораздо больше возможностей. К тому с таким количеством компьютеров использование прокси-сервера для кеширования веб-страниц давало определенную экономию траффика. Машинка имела параметры уровня Pentium2-600 с 256 Mb оперативной памяти. Вариант установки оффтописка отпадал из-за слабых мощностей и ненадежности и отсутствия гибкости. К тому же FreeBSD идеально подходит для гейтов в силу малой требовательности ресурсов и надежности работы. Насколько мне известно по хоум-провайдингу, гейты на FreeBSD могут спокойно натить полосу до 500-600 mbit/sec

Итак, дано - установить FreeBSD на компьютер, настроить NAT, настроить прозрачный прокси.

Не буду утомлять читателей описанием установки, благо это подробно описано и иллюстрировано в .
После установки я , включив в него дополнительные опции, а именно

options IPFIREWALL #добавил поддержку файрволла
options IPFIREWALL_VERBOSE #логгирование
options IPFIREWALL_VERBOSE_LIMIT=100 #органичение количества записей в лог
options IPFIREWALL_DEFAULT_TO_ACCEPT #файерволл "открыт" по умолчанию
options IPFIREWALL_FORWARD
options IPDIVERT #включение поддержки перенаправления пакетов
options DUMMYNET #может понадобится для ограничения скорости

После пересборки ядра настала очередь правки /etc/rc.conf для включения NAT. NAT будет использовать в виде отдельного демона. У меня на шлюзе стояло 2 сетевые карточки, одна смотрела в интернет через модем (настроенный в режиме моста), вторая в локальную сеть.
Соотвественно, первая была re0 и имела адрес вида 213.230.x.x, вторая rl0 - адрес 192.168.0.1

Правим /etc/rc.conf

defaultrouter=213.230.x.x #указываем основной шлюз
ifconfig_re0="inet 213.230.x.x netmask 255.255.255.252" #задаем внешний интернетовский адрес
ifconfig_rl0="inet 192.168.0.1 netmask 255.255.255.0" #задаем внутренний адрес
gateway_enable="YES" #зайдествуем режим шлюза
natd_enable="YES" #включем NAT
nat_interface="re0" #указываем натируемый интерфейс
nat_flags="-f /etc/natd.conf" #файл настройки демона NAT
firewall_enable="YES"

nameserver 195.158.0.1
nameserver 195.158.0.3

После сохранения и перезагрузки (это не обязательно, можно поднять интерфейсы и демон не перезагружая, но проверить как что поднимается все же нужно), проверяем доступность в обоих сетках, пропинговав локальные машины и хосты в интернете.
Уже на данном этапе интернет доступен локальным компьютерам, единственное что нужно дополнительно настроить на них, так это указать на них шлюз по умолчанию 192.168.0.1 и в строке DNS-сервера также прописать 192.168.0.1

Пришла очередь поставить squid. Для начала обновляем .
После успешного обновления переходим собственно к установке.

#cd /usr/ports/www/squid31/
#make install clean

После окончания установки идем править файл настройки squid, находящегося по адресу /usr/local/etc/squid/squid.conf


# Adapt to list your (internal) IP networks from where browsing
# should be allowed
#Здесь указываются подсетки, которые имеют доступ к нашей проксе, у нас подсетка 192.168.0.0, потому оставляем только ее
#acl localnet src 10.0.0.0/8 # RFC1918 possible internal network
#acl localnet src 172.16.0.0/12 # RFC1918 possible internal network
acl localnet src 192.168.0.0/24 # Указываем сеть 192.168.0.1-254
#IPv6 Not Available:acl localnet src fc00::/7 # RFC 4193 local private network range
#IPv6 Not Available:acl localnet src fe80::/10 # RFC 4291 link-local (directly plugged) machines

acl SSL_ports port 443
acl Safe_ports port 80 # https
acl Safe_ports port 21 # ftp
acl Safe_ports port 443 # httpss
acl Safe_ports port 70 # gopher
acl Safe_ports port 210 # wais
acl Safe_ports port 1025-65535 # unregistered ports
acl Safe_ports port 280 # https-mgmt
acl Safe_ports port 488 # gss-https
acl Safe_ports port 591 # filemaker
acl Safe_ports port 777 # multiling https
acl CONNECT method CONNECT

#
# Recommended minimum Access Permission configuration:
#
# Only allow cachemgr access from localhost
https_access allow manager localhost
https_access deny manager

# Deny requests to certain unsafe ports
https_access deny !Safe_ports

# Deny CONNECT to other than secure SSL ports
https_access deny CONNECT !SSL_ports

# We strongly recommend the following be uncommented to protect innocent
# web applications running on the proxy server who think the only
# one who can access services on "localhost" is a local user
#https_access deny to_localhost

#
# INSERT YOUR OWN RULE(S) HERE TO ALLOW ACCESS FROM YOUR CLIENTS
#

# Example rule allowing access from your local networks.
# Adapt localnet in the ACL section to list your (internal) IP networks
# from where browsing should be allowed
https_access allow localnet
https_access allow localhost

# And finally deny all other access to this proxy
https_access deny all

# Squid normally listens to port 3128 - Порт, на котором будет висеть прокси
https_port 127.0.0.1:3128 intercept #transparent для версий ниже 3.1

# We recommend you to use at least the following line.
hierarchy_stoplist cgi-bin ?

# Uncomment and adjust the following to add a disk cache directory.
cache_dir ufs /var/squid/cache 500 16 256
cache_mem 256 MB
# Leave coredumps in the first cache dir
coredump_dir /var/squid/cache

# Add any of your own refresh_pattern entries above these.
refresh_pattern ^ftp: 1440 20% 10080
refresh_pattern ^gopher: 1440 0% 1440
refresh_pattern -i (/cgi-bin/|?) 0 0% 0
refresh_pattern . 0 20% 4320

#/usr/local/sbin/squid -z

Стартуем его

#/usr/local/etc/rc.d/squid -start

Если Squid успешно запустился - открываем любой бразуер, указываем нашу проксю вида 192.168.0.1:3128 и пробуем открыть например тот же google.com.
Открылся? Замечательно, вписываем в /etc/rc.conf

squid_enable="YES"

И делаем его прозрачным, добавив правило в файрволл.

ipfw add fwd 192.168.0.1,3128 tcp from 192.168.0.0/24 to any 80

После этого, на клиентском компьютере убираем прокси с браузера и пробуем открыть другую страницу. Паралелльно можно смотреть файл /var/log/squid/access.log, в котором фиксируются обращения к прокси. Если все работает, в логи появляются записи - поздравляю. Теперь все веб-запросы от клиентских компьютеров будут прозрачно кешироваться, экономя вам траффик.
На этом первоначальная настройка гейта завершена.

UPD. Иногда нужно раздавать интернет не всем в локальной сети, а некоторым пользователям. Тогда можно прикрутить к сквиду авторизацию. Это делается путем добавления в конфиг

auth_param basic program /usr/local/libexec/squid/ncsa_auth /usr/local/etc/squid/internet_users
auth_param basic children 5
auth_param basic realm Squid proxy-caching web server
auth_param basic credentialsttl 2 hours
auth_param basic casesensitive off

acl squidusers proxy_auth REQUIRED

# htpasswd -c /etc/squid/internet_users synergix
New password: *******
Re-type new password: *******
Adding password for user synergix

Ключ -с необходимо указывать только один раз, при создании файла с паролями. В последующем добавлять пользователей нужно без этого ключа. Итак, мы получили файл с примерно таким содержимым.


synergix:89XzEEI/P0e56

Где synergix - имя пользователя, а 89XzEEI/P0e56 - хеш его пароля. Для добавления нового пользователя в существующий файл необходимо выполнить следующую команду

# htpasswd -b /etc/squid/internet_users second_user 1234567
Adding password for user second_user

Посмотрим -

# cat /etc/squid/internet_users
syenrgix:89XzEEI/P0e56
second_user:EAJezc5eLXrV2

Выставим права для файла

# chmod 440 /usr/local/etc/squid/internet_users
# chown squid:squid /usr/local/etc/squid/internet_users

#/usr/local/etc/rc.d/squid reload

У тебя есть своя собственная локальная сеть,
ты решил, что тебе пора ее подключать к Интернету по выделенной лини. Ну, что же дело хорошее, сегодня я постараюсь тебе
помочь немного с этим 🙂 Начнем с установки FreeBSD, поскольку мы помешаны на
безопасности, о ней надо позаботиться заранее 🙂 Вырубай все, везде отвечай
твердо нет:), то что нам надо мы сами потом включим 🙂 Во время установки системы у тебя спросит
"Хотите ли вы посмотреть коллекцию портов?", отвечай да. Сейчас мы установим дополнительное
программное обеспечение. Лезем в раздел security и выбираем там программу с названием PortSentry, позже она нам пригодиться 🙂 После установки нам надо откомпилировать
ядро… За основу возьмем готовое ядро GENERIC. Оно лежит по адресу /sys/i386/conf. Пиши новое ядро для системы внимательно, удаляй все не нужное (например, удаляй нафиг поддержку USB, COM, LPT, SCSI, RAID и других устройств которые ты не будишь использовать в системе, USB тебе на фиг не надо ты же не собираешься к маршрутизатору подключать устройства с поддержкой USB, и так поступай со всем остальным, тем более это повысит быстродействие системы в целом... Более подробную информацию ты найдешь в файле LINT). Дальше в новое ядро добавляем следующие строчки:

Options IPFIREWALL #Включаем поддержку файрвола
Options IPDIVERT #это опция нужна для работы NAT
Options IPFIREWLL_VERBOSE #Пускай файрвол пишет логи
Options IPFIREWALL_VERBOSE_LIMIT=10 #Ограничение записей в лог, для событий
Options TCP_DROP_SYNFIN #Не будим принимать левые пакеты
Options ICMP_BANDLIMIT #Это опция для предотвращения DOS атак 🙂
Options ACCEPT_FILTER_DATA #Я обычно включаю эту опцию 🙂
Options TCP_RESTRICT_RST #Данную опцию тоже следует включить

config proxy, cd ../../compile/proxy, make depend, make, make install

Все, поздравляю, только что ты откомпилировал свое ядро, если что-то не пошло и компиляция
остановилась - посмотри, может ты что-то не так сделал, такое бывает и попробуй пересобрать ядро заново. После чего делаем ребут системы. И машина у нас должна загрузиться с новым ядром. Если же все таки этого не
произошло не расстраивайся - систему можно загрузить со старым ядром. Для этого при
загрузке, когда она скажет хотите ли вы войти в режим восстановления, нажми Enter, там
дай команду unload, потом load kernel.old и boot. Все, система загрузиться со старым ядром.

По умолчанию система перед загрузкой ждет 9 секунд.
Мы идем в папку /boot и правим там файл loader.conf, нам надо добавить туда следующую строчку
boot_autodelay=0, это делается чтобы системы не ждала 9 секунд ответ пользователя, нам же надо чтобы если что система при перезагрузке выходила быстро в онлайн 🙂 Дальше идем в
папку /etc и начинаем править фал rc.conf. Ниже привожу пример с комментариями, так что разобраться
будет не сложно:

hostname="zlobix.evil.com" #Ссетевое имя твоей машины
firewall_enable="YES" #Включаем файрвол
firewall_script="/usr/local/etc/firewall.conf" #путь к файлу с политиками файрвола
firewall_type="close" #Тип файрвола, данный тип запрещает все!
firewall_logging="YES" #Тускай наш файрвол пишет логи
natd_program="/sbin/natd" #Туть к демону natd
natd_interface="ed0" #Та каком интерфейсе у нас будит висеть NAT, интерфейс должен смотреть в сторону ISP (Inetrnet Service Provader)
tcp_extension="NO" #Отрубаем опасные расширения для TCP/IP
tcp_keepalive="YES" #Ставь эту опцию, твой роутер будит менее
подвержен DOS атакам.
tcp_drop_synfin="YES" #Не принимаем левые пакеты
tcp_restrcit_rst="YES" #Не помню что обозначает но включить рекомендую 🙂
icmp_drop_redirect="YES" #Не работаем с ICMP
пакетами
icmp_log_redirect="YES" #Ведем логи ICMP пакетов
ifconfig_lo0="inet 127.0.0.1" #настройка петлевого адреса,
оставь так как тут указано

ifconfig_ed0="inet 167.65.89.147 nemask 255.255.255.192" #в данном примере у нас этот
интерфейс смотрит в сторону провайдера, где ed0 имя интерфейса, inet
IP - адрес выданный провайдером, netmask маска подсети.

ifconfig_ed1="inet 192.168.0.1 netmask 255.255.255.0" #настройка внутреннего интерфейса, то есть который смотрит в сторону локальной сети

ifconfig_ed1_alias0="inet 192.168.1.1 netmask 255.255.255.0" # на один сетевой интерфейс можно повесить сразу несколько
IP адресов (IP-алиасинг), в данном примере предполагается, что сеть у нас поделена логически на две подсети 192.168.0.0/24 и 192.168.1.0/24 где /24
- код по маски по методу CIDR, который соответствует
маске подсети 255.255.255.0

syslogd_enable="YES" #Включаем демон, который
будет отвечать за логи
inetd_enable="NO" #Выруби этот сервис обязательно!
named_enable="NO" #этот тоже выруби, ты же не будишь юзать свой маршрутизатор в качестве DNS сервера 🙂
nfs_client_enable="NO" # Ниже три параметра отвечают за подержку Network File System, мой тебе совет отруби ее тоже
nfs_server_enbale="NO"
nfs_reserved_port_only="NO"
fsck_y_enable="YES"
portmap_enbale="NO" #отключаем портмапер
sshd_enbale="YES" #Включаем ssh, чтобы мы могли управлять нашим маршрутизатор удаленно 🙂
sshd_programm="/usr/sbin/sshd/" #путь до демона ssh
sshd_flags="" #Флаги запуска sshd, если не знаешь оставь так как есть
defaultrouter="167.65.89.1" #Вышестоящий маршрутизатор нашего провайдера
getaway_enbale="YES" #Включаем шлюз на нашей машине
icmp_bmcastecho="NO" #Вырубаем ответы на сообщения echo протокола ICMP, это нам сэкономит нервы 🙂
cron_enable="NO" #Не знаю, но большинство людей включает Cron, я же его вырубаю, поскольку на маршрутизаторе он мне нафиг не нужен...
clear_tmp_enable="YES" #Очищаем директорию tmp при каждой загрузки системы
lpd_enable="NO" #Печатать ты тоже не будишь с маршрутизатора, так что отрубай тоже
usbd_enable="NO" #Вырубаем демон для поддержки USB устройств
sendmail_enable="NO" #Отрубаем sendmail, самое дырявое место во FreeBSD, постоянно находят какие-то ошибки:))))
kern_securelevel_enable="YES" #Включаем защиту
kern_securelevel="0" #Устанавливаем тип защиты

Так, после того как мы разобрались с rc.conf, надо настроить наш Маршрутизатор на работу с ДНС, для этого открывай файл resolv.conf в этой же папке и пиши туда это:

nameserver="167.65.88.18" #Адрес DNS сервера нашего провайдера
nameserver="167.65.88.17" #Адрес резервного DNS сервера нашего провайдера

Как ты уже понял после nameserver="" в кавычках указывается
IP адрес DNS сервера. DNS сервера локальной сети лучше не добавляй, береженого бог бережет 🙂 Дошло дело до ssh.
Его нам надо обезопасить 🙂 и повысить защиту,
поэтому идем в папку /etc/ssh и открываем файл sshd_config. И правим следующие:

#sshd_config
Port 666 #На данном порте у нас будит весеть ssh 🙂
Protocol 2 #Используем более безопасный метод передачи данных
PermitRootLogin no #Отключаем возможность входа в систему пользователю root, для наших нужд мы создадим специального пользователя 🙂
PrintLastLog yes #Отображает дату последнего входа в систему
PermitEmptyPasswords no #Запрещаем вход пользователей с пустым паролем

После того как разобрались, преступим к файрволу...