Как прописать маршруты для роутера freebsd вручную. Настройка маршрутизатора под управлением системы FreeBSD

13.04.2022

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 достигнут.

Дистрибутив фрюхи часто называют самым подходящим для решения прикладных сетевых задач в локальной сети. Сегодня мы займемся решением одной из сетевых задач — настройкой шлюза на Freebsd 10 для доступа в интернет из локалки. Это простой, популярный и востребованный функционал сервера, который можно расширять дополнительными возможностями.

Будем использовать следующую версию системы для решения нашей задачи по настройке шлюза:

# uname -v FreeBSD 10.2-RELEASE-p8 #0 r292756M: Sat Dec 26 22:49:34 MSK 2015 root@freebsd:/usr/obj/usr/src/sys/GENERIC

На сервере установлены 2 сетевые карты:

  • hn0 — внешний интерфейс, получает интернет от провайдера, настройки по dhcp
  • hn1 — локальная сеть, адрес 10.20.30.1, установлен вручную

В нашу задачу по настройке программного freebsd роутера будет входить настройка маршрутизации на сервере, установка и настройка ipfw, включение nat, настройка локального dhcp и dns сервера.

Подготовка сервера к настройке шлюза

Информацию о выданных leases dhcp сервера dnsmasq можно посмотреть в файле /var/db/dnsmasq.leases .

Анализ сетевой активности в freebsd с помощью iftop

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

Устанавливаем iftop на настроенный Freebsd шлюз:

# pkg install iftop

Запускаем iftop с указанием интерфейса и отображением используемых портов:

# iftop -i hn1 -P

Видим любопытную картину — кто, куда, по какому порту и с какой скоростью лезет.

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

Заключение

Подведем итог того, что сделали. За короткое время настроили полноценный шлюз (по сути программный роутер) на базе Freebsd 10 для обеспечения выхода в интернет клиентов за сервером. При этом обеспечили автоматическое получение настроек. Даже на скромном виртуальном сервере такой шлюз способен переварить достаточно большой траффик.

Вся настройка занимает буквально 10-15 минут. Основное время уходит на сборку ядра. Чем выше версия Freebsd, тем дольше оно собирается, несмотря на то, что скорости железа существенно возрастают.

Пройдемся по пунктам и разберемся с тем, что конкретно мы сделали:

  1. Подготовили сервер к настройке шлюза.
  2. Пересобрали ядро с необходимыми параметрами.
  3. Настроили ipfw и nat, включили маршрутизацию.
  4. Установили и настроили dnsmasq для раздачи сетевых настроек по dhcp и dns сервера.
  5. Установили iftop для простейшего анализа сетевой активности на внешнем интерфейсе.

Этого достаточно для полноценной работы шлюза на Freebsd 10. Если есть необходимость подсчета пользовательского траффика или ограничения доступа к определенным ресурсам, можно к нему.

Многие новички в сетях и FreeBSD сталкиваются с вопросом:

«Как соединить две сети если сервер на FreeBSD имеет физическое подключение к обеим сетям?»

Иными словами сервер FreeBSD должен выступать в роли router (маршрутизатор).

Итак, что мы имеем:

  • Ethernet сеть
  • Две подсети класса «С» (/24 — маска 255.255.255.0)
  • Сервер FreeBSD с двумя сетевыми картами
  • Клиенты в обеих подсетях

Наша задача, чтобы клиенты из подсети 192.168.1.0/24 могли обмениваться трафиком с клиентами из подсети 192.168.0.0/24.

Сначала настроим сервер FreeBSD и заставим его передавать (маршрутизировать) пакеты из одной подсети в другую.

За это отвечает параметр net.inet.ip.forwarding , посмотрим в какое значение он имеет:

# sysctl net.inet.ip.forwarding
net.inet.ip.forwarding: 0

На данный момент его значение «0», а это значит, что сервер FreeBSD не будет выполнять маршрутизации.

Включим эту функцию:

# sysctl net.inet.ip.forwarding=1
net.inet.ip.forwarding: 0 -> 1

Так мы изменили значение с «0» на «1». Теперь нужно сделать, так чтобы после ребута это значение всегда было 1-цой. Это можно сделать 2-мя способами:

  1. в файл /etc/rc.conf добавить строчку: gateway_enable=»YES»
  2. в файл /etc/sysctl.conf добавить строчку: net.inet.ip.forwarding=1

На сервере у нас есть две сетевые карты и соответственно два интерфейса: em0 и em1.

Пусть em0 «смотрит» в сеть слева, а em1 в сеть справа. Назначим IP-адреса для интерфейсов FreeBSD сервера:

# ifconfig em0 add 192.168.1.1/24
# ifconfig em1 add 192.168.0.1/24

Примечание :

Если на команду ifconfig вы получаете ответ:
command not found
воспользуйтесь командой
# whereis ifconfig
ifconfig: /sbin/ifconfig /usr/share/man/man8/ifconfig.8.gz /usr/src/sbin/ifconfig
которая укажет где именно располагается утилита ifconfig
как видно из результата выполнения команды whereis утилита ifconfig находится /sbin/ifconfig
вводите полный путь до утилиты ifconfig, тогда надпись command not found появляться не будет и команда будет выполняться

Посмотрим что получилось:

# ifconfig -a

em0 : flags=8843 metric 0 mtu 1500 ether 00:02:a5:4e:92:48 inet 192.168.1.1 netmask 0xffffff00 broadcast 192.168.1.255 media : Ethernet autoselect (100baseTX ) status : active em1 : flags=8802 metric 0 mtu 1500 ether 00:02:a5:4e:92:49 inet 192.168.0.1 netmask 0xffffff00 broadcast 192.168.0.255 media : Ethernet autoselect (100baseTX ) status : active

Рассмотрим что все это значит:

em0 и em1 — имена сетевых интерфейсов
флаг UP — означает что сетевая карта включена, если этого флага не будет, то пакеты не будут приниматься на этом интерфейсе (для включения воспользуйтесь командой: ifconfig ИМЯ_ИНТЕРФЕЙСА up)
ether — это mac-адрес этой сетевой карты
inet — назначенный IP-адрес для этого интерфейса и broadcast адрес для этой подсети
media — информация о скорости и дуплексе интерфейса
status — текущий статус интерфейса. Если status: no carrier, то это означает, что на сетевой карте нет линка.

Сохраним настройки, чтобы IP-адреса назначались интерфейсам после ребута сервера, для этого необходимо добавить в файл /etc/rc.conf следующие строчки:

ifconfig_em0=»inet 192.168.1.1 netmask 255.255.255.0″
ifconfig_em1=»inet 192.168.0.1 netmask 255.255.255.0″

Если на сервере вы используете firewall, например ipfw, то добавим правила разрешающие проход пакетов из одной сети в другую:

ipfw add 100 allow ip from 192.168.1.1/24 to 192.168.0.1/24
ipfw add 110 allow ip from 192.168.1.0/24 to 192.168.1.1/24

Теперь настройте клиентские компьютеры:

  • Выставить IP-адрес из нужной подсети: 192.168.1.ХХХ или 192.168.0.ХХХ
  • Выставить маску подсети 255.255.255.0
  • Выставить шлюз по умолчанию: для подсети 192.168.1.ХХХ это 192.168.1.1, а для подсети 192.168.0.ХХХ это 192.168.0.1 (именно эти IP-адреса на интерфейсах нашего FreeBSD сервера)

Наступило время проверить есть ли связь сервера и клиентов. Для этого возьмем заведомо рабочий клиентский компьютер из 2-х сетей, например это будут компьютеры с IP-адресами:

  • 192.168.1.11
  • 192.168.0.15

Воспользуемся утилитой ping на сервере:

# ping 192.168.1.11

Если результат будет таким:

PING 192.168.1.11 (192.168.1.11): 56 data bytes
64 bytes from 192.168.1.11: icmp_seq=0 ttl=64 time=0.466 ms
64 bytes from 192.168.1.11: icmp_seq=1 ttl=64 time=0.238 ms
64 bytes from 192.168.1.11: icmp_seq=2 ttl=64 time=0.272 ms
^C
— 192.168.1.11 ping statistics —
3 packets transmitted, 3 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 0.238/0.325/0.466/0.100 ms

Значит все хорошо и связь между сервером и клиентом есть. Проделайте тоже самое с 192.168.0.15.

Если результат ping отрицательный, то убедитесь что на клиентском компьютере правильно выставлен IP-адрес и маска подсети, а так же наличие линка на сетевой карте.

Теперь можно попробовать проверить связь между клиентскими компьютерами из разных подсетей.

Так же воспользуемся утилитой ping, но уже на компьютере с IP-адресом 192.168.1.11:

ping 192.168.0.15

Если ответ есть, то и свзяь между компьютерами из разных подсетей есть.

Если ответа нет, то воспользуемся утилитой tracert (для Windows) или traceroute (для FreeBSD):

tracert 192.168.0.15

Если сразу «идут звездочки»:

1 * * *

То проверьте правильность выставление шлюза по умолчанию.

Если трасса выглядит так:

1 192.168.1.1 (192.168.1.1) 0.421 ms 0.447 ms 0.485 ms
2 * * *

То пакет доходит до сервера, убедитесь что firewall сервера не блокирует пакеты и что клиентский компьютер с IP-адресом 192.168.0.15 правильно настроен и «видит» сервер (проверьте IP-адрес, маску подсети, шлюз по умолчанию и наличие ping до сервера)

Вы все проверили, но по прежнему ничего не работает? Воспользуемся утилитой tcpdump на сервере, которая покажет пакеты проходящие через интерфейсы сервера:


и

Запустите пинг с одного клиентского компьютера из одной подсети на другой клиентский компьютер в другой подсети (как мы делали в примерах выше) и смотрите в вывод команды tcpdump на сервере, который будет примерно таким:

# tcpdump -ni em0

12:17:23.398376 IP 192.168.1.11 > 192.168.0.15: ICMP echo request, id 49222, seq 0, length 64
12:17:24.399906 IP 192.168.1.11 > 192.168.0.15: ICMP echo request, id 49222, seq 1, length 64

Т.е. компьютер 192.168.1.11 посылает пакет ICMP echo request до компьютера 192.168.0.15, но ответов мы не видим. Посмотри передает ли сервер эти пакеты на другую сетевую карту:

# tcpdump -ni em1

12:21:18.167017 IP 192.168.1.11 >
12:21:19.168022 IP 192.168.1.11 > 192.168.0.15: ICMP echo request, id 50246, seq 5, length 64

Видим, что запросы передаются на другой интерфейс сервера, но ответов по прежнему нет. Проверьте настройки компьютера 192.168.0.15 и отсутствие у него проблем с физическим подключением к сети.

Когда все работает вывод будет таким:

12:21:17.165998 IP 192.168.1.11 > 192.168.0.15: ICMP echo request, id 50246, seq 3, length 64
12:21:17.171199 IP 192.168.0.15 > 192.168.1.11: ICMP echo reply, id 50246, seq 3, length 64
12:21:18.167017 IP 192.168.1.11 > 192.168.0.15: ICMP echo request, id 50246, seq 4, length 64
12:21:18.171353 IP 192.168.0.15 > 192.168.1.11: ICMP echo reply, id 50246, seq 4, length 64

Мы видим стандартый вывод «запрос-ответ», когда на пакет ICMP echo request приходит ответ в виде пакета ICMP echo reply

Введение == Кратенько хотелось бы накидать план, которому стоит следовать, чтобы курс на Интернет для офиса был правильным и в сторону никого не вильнуло. Сразу отмечу, что шлюз в юниксе - это не одна программа, а целый десяток программ, каждая из которых выполняет свое действие и имеет свои собственные настройки. Мы используем: * FreeBSD 7 * natd * named, routed * ipfw * squid * squidGuard * apache * dhcpd Мой тестовый сервер уже находится в рамках локальной сети, поэтому я считаю, что внешняя сеть у меня это 192.168.0.0/24, а внутреняя - 172.16.0.0/16. Числа, в конце концов, не имеют значения - главное, смысл. Я поставил FreeBSD в минимальной комплектации и мой rc.conf содержит только: hostname="vm=freepro.local" ifconfig_em0="DHCP" linux_enable="YES" sshd_enable="YES" == Настройка NAT == Мой внешний интерфейс - em0 - по умолчанию получает свой IP-адрес по DHCP от обычного роутера с адресом 192.168.1.1. Очевидно, что этот же роутер выполняет роль DNS-сервера. На первом этапе я делаю NAT (всегда на внешнем интерфейсе!) и модифицирую файл /etc/rc.conf таким образом: hostname="vm=freepro.local" defaultrouter="192.168.1.1" ifconfig_em0="inet 192.168.1.10 netmask 255.255.255.0" linux_enable="YES" sshd_enable="YES" # Интернет-шлюз ifconfig_em1="inet 172.16.0.1 netmask 255.255.0.0" gateway_enable="YES" natd_enable="YES" natd_interface="em0" #natd_flags="-f /etc/redirect.conf" firewall_enable="YES" firewall_type="open" #firewall_script="/etc/firewall.conf" router_enable="YES" router="/sbin/routed" router_flags="-q" Я зафиксировал внешний адрес и задал внутренний. Теперь поправим DNS в файле /etc/resolv.conf: nameserver 192.168.1.1 Это всё! Стартуем службы: # /etc/rc.d/ipfw start # /etc/rc.d/natd start # /etc/rc.d/routed start # /etc/rc.d/named start И интернет работает! Клиенту, разумеется, руками прописываем: IP: 172.16.0.2 MASK: 255.255.0.0 GATE: 172.16.0.1 DNS1: 192.168.1.1 Конечно, это очень плохой шлюз. Во-первых, он вообще не защищен, во-вторых, он совсем не кешируется, в-третьих, все DNS-запросы он перенаправляет "наверх", ну и в нем напрочь отсутствует возможность получать какую-либо статистику и чем-либо управлять. Но зато это очень легкий и быстрый шлюз и от дальнейших настроек его производительность будет только увеличиваться, а не уменьшаться. Кстати, обратите внимание, что в новом rc.conf уже закомментированы две строки. Первый комментарий - поможет мне в будущем "пробросить" некоторые порты снаружи - внутрь сети. Т.е. к примеру, если я хочу получить доступ по ssh к клиентскому компьютеру 172.16.0.2 - то я должен буду сделать такой файл: # Файл /etc/redirect.conf redirect_port tcp 172.16.0.2:22 2222 Это означает, что соединяясь с сервером снаружи по порту 2222 я попаду на машину в локальной сети как раз по 22 порту (ssh). Второй комментарий - это моя персональная конфигурация фаервола, заточенная и проверенная. == Настройка ipfw == Моя конфигурация для ipfw на данном этапе она выглядит так: #!/bin/sh # Конфигурация IPFW для простого NAT-сервера /etc/firewall.conf cmd="/sbin/ipfw -q" IfOut="em0" IpOut="192.168.1.10" NetOut="192.168.1.0/24" IfIn="em1" IpIn="172.16.0.1" NetIn="172.16.0.0/16" ################################################## # Clear ################################################## ${cmd} -f flush ${cmd} table 0 flush ${cmd} table 1 flush ################################################## # Whitelist / Blacklist ################################################## ${cmd} table 0 add 172.16.0.12 ${cmd} table 1 add 172.16.0.13 ################################################## # Loopback ################################################## ${cmd} add allow ip from any to any via lo0 ################################################## # Block world to private ################################################## ${cmd} add deny ip from any to 127.0.0.0/8 ${cmd} add deny ip from 127.0.0.0/8 to any #${cmd} add deny ip from 172.16.0.0/16 to any via ${IfOut} #${cmd} add deny ip from 192.168.1.0/24 to any via ${IfOut} ${cmd} add deny ip from any to 10.0.0.0/8 via ${IfOut} #${cmd} add deny ip from any to 172.16.0.0/12 via ${IfOut} #${cmd} add deny ip from any to 192.168.0.0/16 via ${IfOut} ${cmd} add deny ip from any to 0.0.0.0/8 via ${IfOut} ${cmd} add deny ip from any to 169.254.0.0/16 via ${IfOut} ${cmd} add deny ip from any to 192.0.2.0/24 via ${IfOut} ${cmd} add deny ip from any to 224.0.0.0/4 via ${IfOut} ${cmd} add deny ip from any to 240.0.0.0/4 via ${IfOut} ################################################## # ICMP ################################################## ${cmd} add deny icmp from any to any frag ${cmd} add deny log icmp from any to 255.255.255.255 in via ${IfOut} ${cmd} add deny log icmp from any to 255.255.255.255 out via ${IfOut} ################################################## # NAT ################################################## ${cmd} add divert 8668 ip from ${NetIn} to any via ${IfOut} ${cmd} add divert 8668 ip from any to ${IpOut} via ${IfOut} #${cmd} add divert 8668 ip from any to any via ${IfOut} ################################################## # Block private to world ################################################## ${cmd} add deny ip from 10.0.0.0/8 to any via ${IfOut} #${cmd} add deny ip from 172.16.0.0/12 to any via ${IfOut} #${cmd} add deny ip from 192.168.0.0/16 to any via ${IfOut} ${cmd} add deny ip from 0.0.0.0/8 to any via ${IfOut} ${cmd} add deny ip from 169.254.0.0/16 to any via ${IfOut} ${cmd} add deny ip from 192.0.2.0/24 to any via ${IfOut} ${cmd} add deny ip from 224.0.0.0/4 to any via ${IfOut} ${cmd} add deny ip from 240.0.0.0/4 to any via ${IfOut} ################################################## # Whitelist ################################################## ${cmd} add allow all from "table(0)" to any ${cmd} add allow all from any to "table(0)" ################################################## # Blacklist ################################################## ${cmd} add deny all from "table(1)" to any ################################################## # Keep established ################################################## ${cmd} add allow tcp from any to me established ################################################## # Main ################################################## ${cmd} add allow ip from any to any frag ${cmd} add allow icmp from any to ${IpOut} icmptypes 0,8,11 # dns ${cmd} add allow tcp from any to ${IpOut} dst-port 53 setup ${cmd} add allow udp from any to ${IpOut} dst-port 53 ${cmd} add allow udp from ${IpOut} 53 to any ${cmd} add allow udp from ${IpOut} to any dst-port 53 keep-state # dns-client ${cmd} add allow tcp from any to ${NetIn} dst-port 53 setup ${cmd} add allow udp from any to ${NetIn} dst-port 53 ${cmd} add allow udp from ${NetIn} 53 to any ${cmd} add allow udp from ${NetIn} to any dst-port 53 keep-state # time ${cmd} add allow udp from ${IpOut} to any dst-port 123 keep-state # time-client ${cmd} add allow udp from ${NetIn} to any dst-port 123 keep-state # ssh-in ${cmd} add allow tcp from any to ${IpOut} 22 ${cmd} add allow tcp from ${IpOut} 22 to any # ssh-out ${cmd} add allow tcp from ${IpOut} to any 22 ${cmd} add allow tcp from any 22 to ${IpOut} # http ${cmd} add allow tcp from ${IpOut} to any dst-port 80 # http-client ${cmd} add allow tcp from ${NetIn} to any dst-port 80 ${cmd} add allow tcp from any 80 to ${NetIn} # smtp ${cmd} add allow tcp from any to ${IpOut} dst-port 25 setup # forward 8080 to 81 ${cmd} add allow tcp from any to ${IpOut} dst-port 8080 ${cmd} add allow tcp from ${IpOut} 8080 to any ${cmd} add allow tcp from any to ${NetIn} dst-port 81 ${cmd} add allow tcp from ${NetIn} 81 to any # out ${cmd} add deny log tcp from any to any in via ${IfOut} setup #${cmd} add allow tcp from any to any setup ################################################## # Local network ################################################## ${cmd} add allow all from any to any via ${IfIn} ################################################## # Deny All ################################################## ${cmd} add deny all from any to any Я специально закомментировал некоторые строки, которые прибивают пакеты из локальных сетей 192, 172 на внешнем интерфейсе, поскольку мой внешний интерфейс и есть локальный. В реальности эти строки нужны. Едем дальше. == Настройка squid == Теперь мне нужен squid - кеширующий прокси-сервер, способный грамотно раздавать интернет всем пользователям по правилам, которые задает системный администратор. pkg_add -r squid Примечание: конечно, более правильный вариант - собирать ПО из свежих и обновленных портов, но мы экономим на времени, поэтому ставим пакетами. Когда-нибудь потом обновимся с помощью portupgrade. Для squid делаем самую простую настройку - правим файл /usr/local/etc/squid/squid.conf # Минимальная конфигурация SQUID acl all src 0.0.0.0/0.0.0.0 acl manager proto cache_object acl localhost src 127.0.0.1/255.255.255.255 acl to_localhost dst 127.0.0.0/8 acl localnet src 172.16.0.0/255.255.0.0 acl SSL_ports port 443 acl CONNECT method CONNECT http_access allow manager localhost http_access allow localnet http_access deny manager http_access deny !Safe_ports http_access deny CONNECT !SSL_ports http_access deny all icp_access allow all http_port 3128 transparent hierarchy_stoplist cgi-bin ? acl QUERY urlpath_regex cgi-bin \? cache deny QUERY cache_dir ufs /usr/local/squid/cache 100 16 256 access_log /usr/local/squid/logs/access.log squid cache_log /usr/local/squid/logs/cache.log cache_store_log /usr/local/squid/logs/store.log refresh_pattern ^ftp: 1440 20% 10080 refresh_pattern ^gopher: 1440 0% 1440 refresh_pattern . 0 20% 4320 acl apache rep_header Server ^Apache broken_vary_encoding allow apache cache_effective_user squid cache_effective_group squid visible_hostname vm-freepro.local icp_port 0 error_directory /usr/local/etc/squid/errors/English coredump_dir /usr/local/squid/cache Комментарии из файла конфигурации я намеренно убрал, потому что там их не много, а очень много. Не забываем поправить /etc/rc.conf, добавив строку: squid_enable="YES" Далее - перестраиваем кэш и стартуем сквид: # squid -z # /usr/local/etc/rc.d/squid start Первое, что мы делаем после установки squid - запрещаем локальным пользователям ходить в интернет через 80 порт. Порт 80 перебрасываем на 3128 - т.е. заставляем всех пользователей ходить только через squid. Здесь есть большая маленькая загвоздка. Такую операцию можно сделать, только внедрив поддержку IPFW в ядро, иначе форвардинг не работает. Да, это означает, что сейчас нам придется собрать своё ядро! Дело непростое, но полезное - после сборки своего ядра скорость его работы должна возрасти, а объем - заметно уменьшиться. Сначала с помощью sysinstall ставим исходники ядра: # sysinstall Переходим в /Configure/Distributions Отмечаем внутри раздела src [X] base [X] sys Теперь в папке /usr/src у нас есть исходники ядра. Далее копируем конфигурацию GENERIC в "свою" MYKERNEL, и правим MYKERNEL: # cd /usr/src/sys/i386/conf # cp GENERIC MYKERNEL # mcedit MYKERNEL При правке конфига обязательно нужно указать следующие опции: # Включение фаервола в ядро options IPFIREWALL # Включение механизма логирования "log" options IPFIREWALL_VERBOSE # Ограничение логов - защита от переполнения options IPFIREWALL_VERBOSE_LIMIT=50 # Включение механизма перенаправления пакетов options IPFIREWALL_FORWARD # Включение механизма трансляции адресов NAT options IPDIVERT # Включение механизма ограничения скорости канала options DUMMYNET А также убрать все лишнее "железо", которого в реальности у вас нет. Теперь выполняем сборку ядра. Данная операция может немного затянуться, и может оборваться с ошибкой, потребовав установки дополнительных исходников из sysinstall в зависимости от того, что вы написали в конфигурации. Надеемся, что там нет ничего лишнего. # cd /usr/src # make buildkernel KERNCONF=MYKERNEL # make installkernel KERNCONF=MYKERNEL Теперь нужно перегрузиться, но перед перезагрузкой обязательно прочитайте мануал на тот случай, если перезагрузиться не получится. Хотелось бы, чтобы этого, конечно, не произошло. Итак, перегружаемся и снова правим /etc/firewall.conf. #!/bin/sh # Конфигурация IPFW для NAT-сервера и SQUID-прокси cmd="/sbin/ipfw -q" IfOut="em0" IpOut="192.168.1.10" NetOut="192.168.1.0/24" IfIn="em1" IpIn="172.16.0.1" NetIn="172.16.0.0/16" ################################################## # Clear ################################################## ${cmd} -f flush ${cmd} table 0 flush ${cmd} table 1 flush ################################################## # Whitelist / Blacklist ################################################## ${cmd} table 0 add 172.16.0.2 ${cmd} table 1 add 172.16.0.13 ################################################## # Loopback ################################################## ${cmd} add allow ip from any to any via lo0 ################################################## # Block world to private ################################################## ${cmd} add deny ip from any to 127.0.0.0/8 ${cmd} add deny ip from 127.0.0.0/8 to any #${cmd} add deny ip from 172.16.0.0/16 to any via ${IfOut} #${cmd} add deny ip from 192.168.1.0/24 to any via ${IfOut} ${cmd} add deny ip from any to 10.0.0.0/8 via ${IfOut} #${cmd} add deny ip from any to 172.16.0.0/12 via ${IfOut} #${cmd} add deny ip from any to 192.168.0.0/16 via ${IfOut} ${cmd} add deny ip from any to 0.0.0.0/8 via ${IfOut} ${cmd} add deny ip from any to 169.254.0.0/16 via ${IfOut} ${cmd} add deny ip from any to 192.0.2.0/24 via ${IfOut} ${cmd} add deny ip from any to 224.0.0.0/4 via ${IfOut} ${cmd} add deny ip from any to 240.0.0.0/4 via ${IfOut} ################################################## # ICMP ################################################## ${cmd} add deny icmp from any to any frag ${cmd} add deny log icmp from any to 255.255.255.255 in via ${IfOut} ${cmd} add deny log icmp from any to 255.255.255.255 out via ${IfOut} ################################################## # NAT ################################################## ${cmd} add divert 8668 ip from ${NetIn} to any via ${IfOut} ${cmd} add divert 8668 ip from any to ${IpOut} via ${IfOut} #${cmd} add divert 8668 ip from any to any via ${IfOut} ################################################## # Block private to world ################################################## ${cmd} add deny ip from 10.0.0.0/8 to any via ${IfOut} #${cmd} add deny ip from 172.16.0.0/12 to any via ${IfOut} #${cmd} add deny ip from 192.168.0.0/16 to any via ${IfOut} ${cmd} add deny ip from 0.0.0.0/8 to any via ${IfOut} ${cmd} add deny ip from 169.254.0.0/16 to any via ${IfOut} ${cmd} add deny ip from 192.0.2.0/24 to any via ${IfOut} ${cmd} add deny ip from 224.0.0.0/4 to any via ${IfOut} ${cmd} add deny ip from 240.0.0.0/4 to any via ${IfOut} ################################################## # Whitelist ################################################## ${cmd} add allow all from "table(0)" to any ${cmd} add allow all from any to "table(0)" ################################################## # Blacklist ################################################## ${cmd} add deny all from "table(1)" to any ################################################## # Keep established ################################################## ${cmd} add allow tcp from any to me established ################################################## # Main ################################################## ${cmd} add allow ip from any to any frag ${cmd} add allow icmp from any to ${IpOut} icmptypes 0,8,11 # dns ${cmd} add allow tcp from any to ${IpOut} dst-port 53 setup ${cmd} add allow udp from any to ${IpOut} dst-port 53 ${cmd} add allow udp from ${IpOut} 53 to any ${cmd} add allow udp from ${IpOut} to any dst-port 53 keep-state # dns-client ${cmd} add allow tcp from any to ${NetIn} dst-port 53 setup ${cmd} add allow udp from any to ${NetIn} dst-port 53 ${cmd} add allow udp from ${NetIn} 53 to any ${cmd} add allow udp from ${NetIn} to any dst-port 53 keep-state # time ${cmd} add allow udp from ${IpOut} to any dst-port 123 keep-state # time-client ${cmd} add allow udp from ${NetIn} to any dst-port 123 keep-state # ssh-in ${cmd} add allow tcp from any to ${IpOut} 22 ${cmd} add allow tcp from ${IpOut} 22 to any # ssh-out ${cmd} add allow tcp from ${IpOut} to any 22 ${cmd} add allow tcp from any 22 to ${IpOut} # http ${cmd} add allow tcp from ${IpOut} to any dst-port 80 # http-client #${cmd} add allow tcp from ${NetIn} to any dst-port 80 #${cmd} add allow tcp from any 80 to ${NetIn} # squid ${cmd} add allow all from ${NetIn} to ${IpIn} 3128 via ${IfIn} ${cmd} add fwd ${IpIn},3128 tcp from ${NetIn} to any 80 # smtp ${cmd} add allow tcp from any to ${IpOut} dst-port 25 setup # out ${cmd} add deny log tcp from any to any in via ${IfOut} setup #${cmd} add allow tcp from any to any setup ################################################## # Local network ################################################## ${cmd} add allow all from any to any via ${IfIn} ################################################## # Deny All ################################################## ${cmd} add deny all from any to any Перезапускаем сервисы и проверяем - всё работает, и клиенты незаметно для самих себя проходят через систему контроля. Настройку контроля доступа пока отложим, и решим еще один важный вопрос: получение DNS. == Настройка DNS == Сейчас в наших клиентах прописан DNS адрес 192.168.1.1 - внешний по отношению к внутренней сети 172.16.0.0/16. Можно сказать, что клиенты тысячи раз за день лезут выше сервера в поисках адресов. Сделаем систему лучше - настроим кеширующий DNS-сервер, который бы позволял избежать сквозных коннектов наружу, экономил нам трафик и ускорял работу. Не забываем перед этим запретить доступ по порту 53 наружу для всех клиентов. В файле /etc/namedb/named.conf правим параметры listen-on, forwarders: options { directory "/etc/namedb"; pid-file "/var/run/named/pid"; dump-file "/var/dump/named_dump.db"; statistics-file "/var/stats/named.stats"; listen-on { 127.0.0.1; 172.16.0.1; }; disable-empty-zone "255.255.255.255.IN-ADDR.ARPA"; disable-empty-zone "0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.IP6.ARPA"; disable-empty-zone "1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.IP6.ARPA"; forwarders { 192.168.1.1; }; // query-source address * port 53; }; В файле /etc/resolv.conf делаем первым локальный DNS: nameserver 127.0.0.1 nameserver 192.168.1.1 В /etc/firewall.conf запрещаем клиентам использовать внешние DNS (правим секции с комментарием dns-client) # dns-client # Запрещаем внешние DNS #${cmd} add allow tcp from any to ${NetIn} dst-port 53 setup #${cmd} add allow udp from any to ${NetIn} dst-port 53 #${cmd} add allow udp from ${NetIn} 53 to any #${cmd} add allow udp from ${NetIn} to any dst-port 53 keep-state # Разрешаем только локальные DNS ${cmd} add allow tcp from ${NetIn} to ${IpIn} dst-port 53 setup ${cmd} add allow udp from ${NetIn} to ${IpIn} dst-port 53 Рестартуем: # /etc/rc.d/named restart # /etc/rc.d/ipfw restart Теперь вернемся к вопросу контроля доступа в интернет. Решений - сразу два. Во-первых - настроить acl-политики в squid. Во-вторых - установить и настроить squidGuard - специальное приложение для контроля доступа. Начнем по порядку. == Настройка squid acl == acl - это правила в конфигурации squid, которые достаточно эффективно позволяют ограничивать информационный поток, проходящий через прокси-сервер. Если кратко - с acl в два счета можно убить всякую левоту, которая мешает работать. Все acl- настройки по умолчанию пишутся в файле squid.conf, но также могут быть вынесены во внешние файлы. Для примера приведу часть конфига: # Запрещаем всем файлопомойки acl shares dstdomain .rapidshare.com .webfile.ru http_access deny shares # Запрещаем всем запрашивать сайты по IP acl ip_urls url_regex http://+\.+\.+\.+[:/] http_access deny ip_urls # Ограничения по группам src group_strict { ip 172.16.0.20-172.16.0.25 } src group_allow { ip 172.16.0.26-172.16.0.30 } acl { group_allow { pass any } group_strict { pass local none } } Получается замечательно. Но очевидно, что в хорошем прокси таких правил должно быть много - по правилу на каждую "дыру". Выяснять "дыры" и прописывать их поштучно - утомительно, но, как всегда, есть готовое решение - squidGuard - приложение-фильтр с огромным набором правил, пополнять которые, в принципе, можно даже по расписанию cron. Изучаем вопрос. == Настройка squidGuard == Теперь попробуем поставить и настроить squidGuard. Делается это не сложно, но нужно быть внимательным. Итак: # pkg_add -r squidGuard # cp /usr/local/etc/squid/squidGuard.conf.sample /usr/local/etc/squid/squidGuard.conf В файле squidGuard.conf хранятся все настройки, некоторые из которых придется поправить сразу же, а именно: # Файл squidGuard.conf ... source sample-clients { ip 172.16.0.0/16 } ... Сделаем привязку squidGuard к squid - добавим 3 строки в файл squid.conf: redirector_bypass on redirect_program /usr/local/bin/squidGuard -c /usr/local/etc/squid/squidGuard.conf redirect_children 10 squidGuard хранит свою конфигурационную базу в /var/db/squidGuard. Перед первым запуском или после внесения изменений ее необходимо перестроить: # rehash # squidGuard -C all # chown -R squid:squid /var/db/squidGuard # /usr/local/etc/rc.d/squid restart Все хорошо, вот только при попытке клиента зайти на запрещенный сайт, к примеру, http://3warez.com/, мы наблюдаем тормоза. А хотелось бы получать какое-то вразумительное сообщение. Для этого нам потребуется apache. == Настройка apache == Как уже говорилось, apache нужен нам для отображения информации о заблокированных адресах и причинах блокировок. Делаем как обычно: # pkg_add -r apache22 # echo "apache22_enable="YES"" >> /etc/rc.conf Настройки apache лежат в файле /usr/local/etc/apache22/httpd.conf. Перед запуском необходимо проверить директивы DocumentRoot, ServerName - подробности опущу, т.к. в интернете масса статей по настройке этого сервера. Делается за 1 сек. Запускаем: # echo "Access denied" > /usr/local/www/apache22/data/index.html # /usr/local/etc/rc.d/apache22 start Поправим немного конфиг squidGuard.conf: # В самом конце файла acl { ..... default { redirect http://172.16.0.1/index.html } } == Настройка dhcpd == И вот мы близимся к завершению. Сеть настроена и работает чудесно. Все под контролем, все строго ограничено. Но после кнута клиентам пора предложить и пряник - в виде раздачи автоматической DHCP-адресов. Хороший администратор, конечно, и тут смухлюет - будет раздавать адреса только по MAC, но мы просто наведём изюм. # pkg_add -r isc-dhcp3-server # cp /usr/local/etc/dhcpd.conf.sample /usr/local/etc/dhcpd.conf В файл /etc/rc.conf добавляем строки: dhcpd_enable="YES" dhcpd_flags="-q" dhcpd_ifaces="em1" Еще нужно поправить самый главный конфиг /usr/local/etc/dhcpd.conf: option domain-name "example.com"; option domain-name-servers 172.16.0.1; option subnet-mask 255.255.255.0; default-lease-time 3600; max-lease-time 86400; ddns-update-style none; subnet 172.16.0.0 netmask 255.255.0.0 { range 192.16.0.11 172.16.0.15; option routers 172.16.0.1; } Включаем электричество: # /usr/local/etc/rc.d/isc-dhcpd start Вот, пожалуй, и всё, самое главное. Данная статья не претендует на абсолютную полноту и содержательность, но вкратце описывает этапы, которые необходимо пройти, чтобы довести сервер до рабочего состояния. Дальше - только тюнинг и еще раз тюнинг. Не забывайте также, что это не единственный путь настройки сервера - в unix всегда есть альтернатива и вы можете использовать совсем другие приложения.

У тебя есть своя собственная локальная сеть,
ты решил, что тебе пора ее подключать к Интернету по выделенной лини. Ну, что же дело хорошее, сегодня я постараюсь тебе
помочь немного с этим 🙂 Начнем с установки 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 #Запрещаем вход пользователей с пустым паролем

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