Настройка шлюза на freebsd 11. Настраиваем шлюз в Интернет на базе FreeBSD. Подготовка сервера к настройке шлюза
АЛЕКСЕЙ БЕРЕЖНОЙ
Настраиваем шлюз в Интернет на базе FreeBSD
Использование FreeBSD на небольших роутерах для связи с внешним миром уже давно перестало быть чем-то выдающимся. Эта простая в использовании, нетребовательная к ресурсам и обслуживанию операционная система почти идеально подходит для решения подобных задач.
Нам понадобится
- Аппаратное обеспечение . Чтобы вывести внутреннюю сеть в Интернет, достаточно компьютера Pentium III 600 МГц, 256 Мб RAM, 10 Гб HDD, 2 сетевые карты. Конфигурация взята с запасом, для полноценной работы сети малого офиса (около 50 пользователей) вполне хватило бы Pentium II 400 МГц, c 128 Мб RAM. Но в дальнейшем может возникнуть желание установить на этот же шлюз, к примеру, прокси-сервер, лучше выбрать конфигурацию более высокого уровня.
- Операционная система : FreeBSD 5.5 или 6.1.
- Дополнительно : из-за того, что данный компьютер подлежит непрерывному использованию, рекомендую доставить внутрь корпуса дополнительные вентиляторы чтобы обеспечить принудительное нагнетание/отток воздуха для охлаждения. Практически все современные корпусы ATX позволяют сделать это.
Поскольку все необходимые модули включены в состав операционной системы, больше нам ничего не потребуется.
Настройка сетевых интерфейсов
Необходимо уточнить имена интерфейсов сетевых карт, под которыми их распознает операционная система.
# ifconfig
Должно появиться что-то подобное:
rl0: flags=8843 mtu 1500 Options=8 Ether 00:xx:xx:xx:xx:xx Status: active xl0: flags=8843 mtu 1500 Options=9 Ether 00:zz:zz:zz:zz:zz Media: Ethernet autoselect (100baseTX) Status: active plip0: flags=108810 mtu 1500 lo0: flags=8049 mtu 16384 Inet6::1 prefixlen 128 |
В компьютере установлены две сетевые карты c именами интерфейсов rl0 и xl0.
В нашем случае интерфейс rl0 будет «смотреть» во внешний мир, а xl0 – во внутреннюю сеть. IP- адрес внутреннего интерфейса: 192.168.9.2 , маска подсети 255.255.255.0, имя интерфейса xl0; IP-адрес внешнего интерфейса 83.xxx.xxx.xxx, маска подсети 255.255.255.224, имя интерфейса rl0.
Уточнить, сетевым картам каких производителей соответствуют те или иные сетевые адреса, можно, заглянув в файл GENERIC в каталоге /usr/src/sys/i386/conf:
# more /usr/src/sys/i386/conf/ GENERIC
В нем находим соответствующие строчки:
device rl # RealTek 8129/8139 device xl # 3Com 3c90x (``Boomerang"", ``Cyclone"") |
Таким образом, интерфейс rl0 соответствует сетевой карте RealTek 8129/8139 и ее аналогам. Сетевой интерфейс xl0 соответствует сетевой карте 3Com.
Отдельно стоит упомянуть о файле GENERIC. Это файл конфигурации ядра, устанавливаемого по умолчанию при инсталляции FreeBSD. Он организован так, чтобы система могла поддерживать большинство наиболее используемых устройств, в том числе и указанные сетевые карты. Очень часто дальнейшие модификации ядра строятся на модифицированной копии этого файла. В данном случае, мы именно так и поступим:
- Шлюз провайдера – по умолчанию 83.xxx.xxx.1.
- В сети присутствуют компьютеры пользователей – 192.168.9.31, 192.168.9.32.
- Наш домен (условно) – ourdomain.ru.
- Имя хоста (компьютера) – ourhost.ourdomain.ru.
Выполняем настройку сетевых карт. Можно использовать утилиту sysinstall (/stand/sysinstall для FreeBSD 5.5 и /usr/sbin/sysinstall для FreeBSD 6.1) Но поскольку нам известны все необходимые параметры, то для упрощения процесса и экономии времени мы будем задавать параметры путем редактирования соответствующих конфигурационных файлов.
Настройки сетевых интерфейсов во FreeBSD хранятся в файле /etc/rc.conf. Открываем его на редактирование:
# vi /etc/rc.conf
И добавляем следующие строки:
# Задаем внутренний интерфейс
ifconfig_xl0="inet 192.168.9.2 netmask 255.255.255.0"
# Задаем внешний интерфейс
ifconfig_rl0="inet 83.xxx.xxx.xxx netmask 255.255.255.224"
# Задаем шлюз провайдера по умолчанию
defaultrouter="83.xxx.xxx.1"
# Имя хоста
hostname="ourhost.ourdomain.ru"
# Указываем, что сервер будет работать как маршрутизатор
gateway_enable="YES"
После чего перезагружаем компьютер:
# reboot
В данный момент компьютер можно было и не перезагружать. Но мы хотим достоверно убедиться, что наши интерфейсы установлены корректно и работают, поэтому я все же рекомендую перезагрузиться.
После загрузки проверяем:
# ifconfig
Вывод команды ifconfig:
rl0: flags=8843 mtu 1500 Options=8 Inet6 fe80::215:58ff:fe3e:8fb1%rl0 prefixlen 64 scopeid 0x1 Inet 83.xxx.xxx.xxx netmask 0xffffffe0 broadcast 83.xxx.xxx.yyy Ether 00:xx:xx:xx:xx:xx Media: Ethernet autoselect (100baseTX) Status: active xl0: flags=8843 mtu 1500 Options=9 Inet6 fe80::20a:5eff:fe62:ade2%xl0 prefixlen 64 scopeid 0x2 Inet 192.168.9.2 netmask 0xffffff00 broadcast 192.168.9.255 Ether 00:zz:zz:zz:zz:zz Media: Ethernet autoselect (100baseTX) Status: active plip0: flags=108810 mtu 1500 lo0: flags=8049 mtu 16384 Inet6::1 prefixlen 128 Inet6 fe80::1%lo0 prefixlen 64 scopeid 0x4 Inet 127.0.0.1 netmask 0xff000000 |
Файл rc.conf, на мой взгляд, можно назвать ключевым файлом конфигурации. Очень большое число параметров, используемых системой, задается в виде соответствующих переменных в этом файле. В том числе настройки сетевых интерфейсов, файервола и NAT, используемых нами.
Настройка шлюза
Мы будем использовать «родной» для FreeBSD файервол IPFW. Для этого мы должны внести некоторые изменения в ядро системы. Если возникли дополнительные вопросы по перекомпиляции ядра, советую прочитать дополнительный материал: http://freebsd.org.ru/how-to/kernelconfig.html .
Заметьте, что нужно использовать исходные тексты ядра для соответствующей архитектуры. Поскольку архитектура нашего компьютера базируется на платформе i386, то и ядро должно быть скомпилировано в соответствии с платформой. Для владельцев компьютеров других платформ я рекомендую обратиться к соответствующей литературе.
Исходники ядра по умолчанию лежат в каталоге /usr/src/sys/i386/conf. Соответственно переходим в данный каталог:
# cd /usr/src/sys/i386/conf
Как правило, изменяют файл GENERIC, содержащий опции ядра, устанавливаемого по умолчанию. Для этого делаем копию данного файла:
# cp GENERIC ourkernel
Открываем на редактирование новый файл ourkernel:
# vi ourkernel
и добавляем следующие опции:
Options IPFIREWALL #firewall
Options IPFIREWALL_VERBOSE ?
#enable logging to syslogd(8)
Options IPFIREWALL_FORWARD ?
#enable transparent proxy support
Options IPFIREWALL_VERBOSE_LIMIT=100 #limit verbosity
Options IPFIREWALL_DEFAULT_TO_ACCEPT #allow everything by default
Options DUMMYNET
Options IPDIVERT #divert sockets
После сделанных изменений можно приступать к перекомпиляции ядра.
Выполняем команды:
# config ourkernel
# cd /usr/src/sys/i386/compile/ourkernel
# make depend
# make
# make install
Перегружаемся:
# reboot
Если после перезагрузки сервер работает нормально, приступаем к настройке файервола.
Для организации работы файервола используются следующие переменные, добавляемые при необходимости в файл rc.conf.
Разрешает или запрещает использование файервола:
# Set to YES to enable firewall functionality
firewall_enable="NO"
Имя и местоположение файла, отвечающего за инициализацию файервола.
# Which script to run to set up the firewall
firewall_script="/etc/rc.firewall"
При установке данного правила в «YES» подавляется вывод на дисплей:
firewall_quiet="NO"
Разрешить/запретить ведение лога событий:
firewall_logging="NO"
Тип настройки файервола:
firewall_type="UNKNOWN"
по умолчанию FreeBSD использует правила из файла /etc/rc.firewall.
В нем есть несколько готовых шаблонов:
- open – файервол разрешает прохождение всех пакетов.
- client – рекомендуется для защиты только этого компьютера. То есть файервол настроен как стандартный клиентский компьютер. Он разрешает все исходящие соединения и запрещает все входящие соединения, кроме соединений по 25 порту.
- simple – предполагается для настроек простых шлюзов и т. д. То есть в качестве простейшего файервола, защищающего внутреннюю сеть от проникновения извне. Мы будем настраивать более гибкую систему правил, поэтому данный шаблон нами не используется не будет.
- closed – Разрешается трафик через локальный интерфейс lo0. Прохождение остального трафика определяется правилом по умолчанию. Как правило, это запрет любого доступа, исключая внутренний интерфейс lo0 (попросту говоря, разрешен только доступ «к самому себе»)
- UNKNOWN – запретить загрузку файервольных правил из конфигурационного скрипта по умолчанию. Файервол никак не настраивается. Будет он пропускать трафик или нет, зависит от конфигурации ядра системы. Используется по умолчанию.
Эту же переменную в значении «filename» – «имя_файла» – можно использовать для задания собственного конфигурационного файла для файервола.
Например:
firewall_type="/etc/rc.firewall.newconfig"
будет загружать настройки из созданного файла /etc/rc.firewall.newconfig.
«firewall_flags=””» – служит для передачи дополнительных аргументов при использовании firewall_type со значением filename.
Наша задача состоит в том, чтобы создать систему, отвечающую следующим критериям:
- Простота администрирования.
- Возможность модификации «на лету», незаметно для пользователей. Поэтому такие операции, как разрыв соединений и тем более перезагрузка для нас нежелательны.
- Гарантия того, что наша система будет работать на большинстве машин.
В нашем примере скрипта все компьютеры локальной сети делятся на две условные группы: одна группа привилегированная – это те, кому разрешен доступ в Интернет, используя наиболее употребительные сервисы, такие как:
- HTTP – порт 80;
- HTTPS – порт 443;
- FTP – порты 20, 21 и от 1025 до 65535;
- SMTP-протокол для пересылки почты – порт 25;
- POP3-протокол для приема сообщений – порт 110.
Есть и другая группа, компьютерам из которой разрешен доступ только к внешнему корпоративному серверу c IP-адресом 83.xxx.xxx.2 (только протоколы SMTP и POP3).
Мы должны добиться, чтобы можно было изменять привилегированную группу, что называется, «на лету», по возможности не разрывая установленных соединений. Для этого мы из нашего скрипта вызываем дополнительный скрипт rc.firewall.local.inet. Достаточно отредактировать и перезапустить этот дополнительный скрипт, не затрагивая всех остальных настроек файервола.
Дополнительно мы должны предусмотреть ситуацию, когда меняются параметры сети, такие как IP-адрес шлюза провайдера. Для этого мы будем использовать в скрипте локальные переменные. Например, при изменении шлюза по умолчанию достаточно изменить значение переменной intgateway и перезапустить скрипт rc.firewall.run.
Вот наш пример скрипта:
# vi rc.firewall.run
#!/bin/sh
extip="83.xxx.xxx.xxx"
intip="192.168.9.2"
intnet="192.168.9.0/24"
mailserver="83.xxx.xxx.2"
intgateway="83.xxx.xxx.1"
/sbin/ipfw -f flush &
/sbin/ipfw add 180 divert natd ip from ${intnet} to any out xmit fxp0
/sbin/ipfw add 190 divert natd ip from any to ${extip}
# ICMP
/sbin/ipfw add 500 allow icmp from any to any
# SSH
/sbin/ipfw add 10000 allow tcp from any to any 22
/sbin/ipfw add 10010 allow tcp from any 22 to any
# DNS
/sbin/ipfw add 11000 allow tcp from any to any 53
/sbin/ipfw add 11010 allow tcp from any 53 to any
/sbin/ipfw add 11020 allow udp from any to any 53
/sbin/ipfw add 11030 allow udp from any 53 to any
# Web FTP
/sbin/ipfw add 12000 allow tcp from me to any 20,21,80,443
/sbin/ipfw add 12010 allow tcp from any 20,21,80,443 to me
/sbin/ipfw add 12020 allow udp from me to any 20,21
/sbin/ipfw add 12030 allow udp from any 20,21 to me
# Script for the privilege group
/bin/sh /etc/rc.firewall.local.inet
# Deny other computer of LAN
/sbin/ipfw add 12960 deny tcp from ${intnet} to any 20,21,80,443
/sbin/ipfw add 12970 deny tcp from any 20,21,80,443 to ${intnet}
/sbin/ipfw add 12980 deny udp from ${intnet} to any 20,21
/sbin/ipfw add 12990 deny udp from any 20,21 to ${intnet}
/sbin/ipfw add 13000 allow tcp from ${intnet} to ${mailserver} 25,110
/sbin/ipfw add 13010 allow tcp from ${mailserver} 25,110 to ${intnet}
/sbin/ipfw add 55010 allow tcp from any to any 1024-65534
/sbin/ipfw add 55020 allow tcp from any 1024-65534 to any
/sbin/ipfw add 55030 allow tcp from any 1024-65534 to any
/sbin/ipfw add 55040 allow tcp from any to any 1024-65534
/sbin/ipfw add 55050 allow udp from any to any 1024-65534
/sbin/ipfw add 55060 allow udp from any 1024-65534 to any
/sbin/ipfw add 55070 allow udp from any 1024-65534 to any
/sbin/ipfw add 55080 allow udp from any to any 1024-65534
# Deny all
/sbin/ipfw add 65534 deny ip from any to any
Создаем и редактируем скрипт rc.firewall.local.inet для работы с привилегированной группой адресов:
# vi /etc/ rc.firewall.local.inet
#!/bin/sh
intnet="192.168.9.0/24"
privgroup={31,32}
/sbin/ipfw delete 12310
/sbin/ipfw delete 12320
/sbin/ipfw delete 12330
/sbin/ipfw delete 12340
/sbin/ipfw add 12310 allow tcp from ${intnet}${privgroup} to any 20,21,80,443,1025-65535
/sbin/ipfw add 12320 allow tcp from any 20,21,80,443,1025-65535 to ${intnet}${privgroup}
/sbin/ipfw add 12330 allow udp from ${intnet}${privgroup} to any 20,21,1025-65535
/sbin/ipfw add 12340 allow udp from any 20,21,1025-65535 to ${intnet}${privgroup}
В скрипте для изменения состава привилегированной группы необходимо отредактировать переменную privgroup, добавив/удалив в ней номер хоста в локальной подсети.
Например, чтобы добавить два компьютера с IP-адресами 192.168.9.33 и 192.168.9.45, нужно записать «privgroup={31-33,45}».
Использовать правила типа «/sbin/ipfw delete NNNNN» при старте системы, когда такого правила не было – немножко некрасиво. При попытке удалить несуществующее правило система выдает на консоль сообщение следующего вида:
ipfw: rule 13031: setsockopt(IP_FW_DEL): Invalid argument |
При этом система продолжает нормально работать.
Если все делать строго, то нужно создавать два скрипта: один запускать при старте, второй – при изменениях на ходу. Но тогда нужно будет вносить соответствующие изменения в оба скрипта.
Поскольку основная цель – создать простую в администрировании систему, то данной проблемой в нашем случае можно пренебречь.
Зато теперь мы можем после внесения соответствующих изменений просто перезапустить скрипт для привилегированной группы.
# /bin/sh rc.firewall.local.inet
Также мы можем вносить изменения и перезапускать скрипт rc.firewall.run, хотя, по замыслу, это нам придется делать гораздо реже, чем в случае со скриптом привелигированной группы.
# /bin/sh rc.firewall.run
Поскольку мы написали свой собственный скрипт, обнуляющий существующие правила и запускающий альтернативную конфигурацию файервола, нужно подумать, как его запустить.
Во FreeBSD есть замечательный механизм запуска пользовательских программ: файл rc.local. По умолчанию он отсутствует в системе.
Раз мы уже создаем данный файл, добавим в него команду запуска демона natd, который отвечает за поддержку NAT.
Демон natd запускается из файла rc.conf. (Опять этот файл, поистине он играет ключевую роль для всей системы FreeBSD в целом!)
Механизм запуска этого файла из rc.conf выполняется посредством следующих переменных:
# -- путь к самому файлу natd
natd_program="/sbin/natd"
# Разрешить NAT (если firewall_enable == YES)
natd_enable="YES"
# Внешний интерфейс или IPaddress для использования
natd_interface=""
# Дополнительный флаги запуска natd
natd_flags=""
Но в этом случае мы будем использовать вызов демона natd посредством rc.local. Команда:
# vi /etc/rc.local
автоматически создает файл /etc/rc.local и открывает его на редактирование.
Добавляем в него следующие строки:
# Команда запуска natd
/sbin/natd -n rl0
# где «-n rl0» - имя интерфейса, на котором запускается NAT
# И запускаем наш скрипт для установки правил для файервола:
/bin/sh /etc/rc.firewall.run
Перезагружаемся и проверяем доступ к нужным ресурсам Интернета с компьютера из локальной сети.
- Эви Немет, Гарт Снайдер, Скотт Сибасс, Трент Р.Хейн. UNIX. Руководство системного администратора. «BHV», «Питер», 2004 г.
- Алексей Федорчук, Алексей Торн. FreeBSD. Установка, настройка, использование. BHV, 2003 г.
- Филипп Торчинский. Практическое пособие администратора UNIX. «Символ», 2003 г.
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
|
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
|
Все хорошо, 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 достигнут.
В связи с появившимся в обилии свободным временем могу подтянуть все свои стародавние статейки относительно различных фрёвых сервисов, которые уже лет 6-7 валялись у меня на диске в ожидании когда же до них наконец то дойдут руки, и вот потихоньку это время настало.
Так что не боясь предстать капитаном очевидность в этот раз я распишу как организовать программный маршрутизатор средствами FreeBSD. И хотя писалось все это еще под 4.2, но тем не менее и под 7.4 все эти же рецепты применимы, разве только с той разницей, что все пакеты отличаются версиями с большую сторону. Сказать откровенно, я предпочитаю программные маршрутизаторы за их дешевизну, простоту и быстроту в настройке, поскольку для программного маршрутизатора сгодится любая древняя машинка, главное чтобы в ней была возможность поставить дополнительные сетевухи. При этом программный маршрутизатор отличается от аппаратных аналогов тем, что произведя один раз настройку маршрутизатора вы следующий настроите уже за полчаса, а не будите копаться в мануалах нового для вас агрегата, купленного клиентом с оказией, не понимая почему це фича вдруг оказалась багой. К тому же вменяемый аппаратный маршрутизатор стоит не малых денег и вполне сопоставим по стоимости с хорошим компом, который помимо того что будет с сотни раз мощнее, также при этом сможет, естественно при желании, стать принт-сервером, фаерволом, проксей, поточным антивирем и еще чем угодно, и что самое основное- это решение маштабируемое, то есть добавление нового интерфейса сопряжено с гораздо меньшими затратами, нежели при попытке расширения аппаратного маршрутизатора, главное подобрать материнку с 2-3 слотами под сетевуху, ибо найти две интегрированные не проблема. И естественно формула скорость работы/цена для программного маршрутизатора будет на порядки ниже аппаратного, так как стоимость гигабитного маршрутизатора уже будет сопоставима с покупкой мощного сервера для офиса. Ну это просто вода относительно того за что я люблю программные рутеры, а теперь собственно перейдем к самой настройке маршрутизатора.
Для начала устанавливаем систему FreeBSD 7.4 и настраиваем её в соответствии с нашими требованиями, то есть можно настроить как если она торчит в инет, или служит для защиты серверной фермы от локалки; ну а ленивцы могут ограничиться просто установкой нужных пакетов, если она будет служить просто для маршрутизации пакетов между сетями внутренней сети предприятия.
Собственно для начала имеем две сетки: 192.168.0.0/24 (основная) и 192.168.10.0/24 (дополнительная) которые нам и надо совокупить посредством нашего настроенного сервера FreeBSD, в который мы же загодя воткнули две-три-четыре и более сетевых карт (максимум который у меня прекрасно существовал было 5 сопряженных сетей, не считая вирутальных интерфейсов). Предположим что для сетевых интерфейсов мы выбрали IP адреса: 192.168.0.1 и 192.168.10.1
Смотрим что за интернерфейсы установлены в системе:
# ifconfig
тут нам главное понять какой интерфейс какой, для чего не плохо было бы ознакомиться с чипами карт. Порядок интерфейсов обычно идет от проца к периферии, а у дополнительных интерфейсов в зависимости от нумерации слотов, возрастая от видюхи. Но проверить все это можно эмперическим путем просто воткнув рабочий кабель в систему, посе чего интерфейс перейдет из статуса status: no carrier в status: active. Предположим у нас в системе два интерфейса rl0 и rl1.
Поняв какие интерфейсы будем сопрягать, идем в /etc/rc.conf и добавляем необходимый интерфейс, так как там уже должен присуствовать один из интерфейсов, если в процессе настройки системы FreeBSD мы поднимали сетку.
##### /etc/rc.conf #####
ifconfig_rl0=”inet 192.168.0.1 netmask 255.255.255.0″
ifconfig_rl1=”inet 192.168.10.1 netmask 255.255.255.0″
#####################
Чтобы поднять теперь интерфейс, выполним
# /etc/netstart
Второй интерфейс rl1 ожил и теперь пингуется из подсети 192.168.10.1, но для того чтобы сервер настроить как маршрутизатор необходимо в ядре разрешить пересылку пакетов между пакетами, за что отвечает парметр net.inet.ip.forwarding. Его значение в системе в данный момент:
# sysctl net.inet.ip.forwarding
net.inet.ip.forwarding: 0
где значение 0 означает что маршрутизация запрещена, поэтому для включения функционала маршрутизации, нам необходимо присвоить этому значению 1, для чего выполняем:
# sysctl net.inet.ip.forwarding=1
net.inet.ip.forwarding: 0 -> 1
Теперь настройка маршрутизации завершена и маршрутизатор будет фурычить до перезагрузки системы, после чего значение net.inet.ip.forwarding переключится обратно в 0. Для того чтобы избежать этого добавляем в файл /etc/rc.conf следующую строку:
gateway_enable=”YES”
после чего уже безбоязненно можем перегрузить машину.
При такой схеме наш маршрутизатор будет рутить только сопряженные с ним сети, представленные интерфейсами, или же алиасами на интерфейсах, в том же случае когда у нас в сети уже существуют маршрутизаторы, прикрывающие еще какие то сети, то тогда поднимаем на нашей машине статическую таблицу маршрутизации. Делается это также в файле /etc/rc.conf
##### /etc/rc.conf #####
route_network1=”-net 10.10.15.0/24 192.168.0.25″
route_network2=”-net 172.168.10.0/24 192.168.0.25″
route_network3=”-net 192.168.168.0/24 192.168.10.111″
#####################
то есть мы задаем названия маршрутов, которые дальше выводим в виде сетки, и внешнего, для нашего маршрутизатора, интерфейса шлюза.
Также в случае использовании настроенного сервера FreeBSD в качестве внутреннего маршрутизатора, необходимо на внешнем шлюзе, заданном для рабочих станций и серверов сети дефолтным маршрутом, поднять маршрутизацию на внутреннюю сеть задав маршрут в 192.168.10.0, через 192.168.0.1. На самом деле тут обычно и возникает самый косячный момент, особенно в случае использования интернет шлюзом аппаратных фаерволов типо D-Link, у которых вроде функционал рутинга имеется, но чтобы настроить удаленный маршрут надо долго и упорно танцевать с бубном, так что гораздо проще для нашего уже настроенного маршрутизатора задать дефолтовым маршрутом интернет-шлюз, а все машины предприятия завернуть на него- это добавит лишний хоп, но уберет проблему настройки маршрутизации на сторонних серверах.
Отзывов: 11 на «Как настроить машрутизатор средствами FreeBSD»
Пожалуйста объясните мне по подробней вот эти строки:
static_routes=”network1 network2 network3″
route_network1=”-net 10.10.15.0/24 192.168.0.25″
route_network2=”-net 172.168.10.0/24 192.168.0.25″
route_network3=”-net 192.168.168.0/24 192.168.10.111″
Что куда и как заворачивается, просто я во FreeBSD новичек и немного не в курсе… Заранее благодарю!
P.S.: Я так понимаю что 192.168.0.25, 192.168.10.111 – адреса свичей, или компьютеров соединяющих подсети одной локальной сети!? А адрес карточки на маршрутизаторе значение имеет????
anchous Reply:
June 27th, 2011 at 6:54 pm
Эти IP адреса (192.168.0.25, 192.168.10.111) адреса сетевых интерфейсов других, имеющихся в сети маршрутизаторов, которые смотрят в сопряженные с вашим рутером сетки.
То есть 0.25 смотрит в сеть 192.168.0.0/24, а 192.168.10.111 в сеть 192.168.10.0/24
Добрый день! Недавно начал изучение FreeBSD и столкнулся со следующей проблемой(простейший пример маршрутизации описанный вами выше):
FreeBSD-сервер НЕ ВЫПОЛНЯЕТ МАРШРУТИЗАЦИЮ из одной сети в другую!
1. Свежеустановленная FreeBSD 9.0
2. Две сетевые карты em0 em1
3. IP-адреса маски, шлюз по умолчанию, опция gateway_enable, net.inet.ip.forwarding прописаны верно!
4. Ping с сервера в сеть №1 и в сеть №2 идет!
5. Ping с компьютеров на em0 и em1 тоже идет!
А ВОТ PING МЕЖДУ КОМЬЮТЕРАМИ ИЗ СЕТИ №1 и №2 не идет!!! В ЧЕМ МОЖЕТ БЫТЬ БЕДА???
anchous Reply:
August 9th, 2012 at 5:58 pm
приветствую.
судя по вашей ситуации у вас проблема с настройками маршрутизации внутри сети, то есть для какой то сети не корректно прописан дефолтный шлюз и пакеты уходят в молоко, по этой причине у вас пингуют интерфейсы рутера и не далее.
Попробуйте дать трейс и поймете куда уходят пакеты.
Огромное спасибо за отклик. Tracert к сожалению помочь мне ничем не может. Вот более подробное описание:
- сеть №1 em0 (192.168.1.0/24) в ней PC Win7 (192.168.1.5/24 default gateway 192.168.1.60)
Сеть №2 em1 (192.168.0.0/24) в ней internet-router (192.168.0.1/24), *так же есть и другие компы… которые через этот шлюз выходят в интернет*.
Freebsd 9.0
——- rc.conf———–:
hostname=”FreeBSD1″
defaultrouter=”192.168.0.1″
gateway_enable=”YES”
ifconfig_em0=” inet 192.168.1.60 netmask 255.255.255.0″
ifconfig_em1=” inet 192.168.0.60 netmask 255.255.255.0″
sshd_enable=”YES”
moused_enable=”YES”
dumpdev=”NO”
——- ifconfig ———–:
em0: flags=8843 metric 0 mtu 1500
options=9b
ether 00:0c:29:df:f3:00
inet 192.168.1.60 netmask 0xffffff00 broadcast 192.168.1.255
inet6 fe80::20c:29ff:fedf:f300%em0 prefixlen 64 scopeid 0×2
nd6 options=29
status: active
em1: flags=8843 metric 0 mtu 1500
options=9b
ether 00:0c:29:df:f3:0a
inet 192.168.0.60 netmask 0xffffff00 broadcast 192.168.0.255
inet6 fe80::20c:29ff:fedf:f30a%em1 prefixlen 64 scopeid 0×3
nd6 options=29
media: Ethernet autoselect (1000baseT)
status: active
——–netstat -rn: ———–
Destination Gateway Flags Refs Use Netif Expire
default 192.168.0.1 UGS 0 0 em1
127.0.0.1 link#7 UH 0 0 lo0
192.168.0.0/24 link#3 U 0 325 em1
192.168.0.60 link#3 UHS 0 0 lo0
192.168.1.0/24 link#2 U 0 22 em0
192.168.1.60 link#2 UHS 0 0 lo0
——————————-
net.inet.ip.forwarding: 1
——————————-
ПИНГ С FREEBSD
ping 192.168.0.1 – OK
ping 192.168.1.5 – OK
——————————-
ПИНГ с WIN7 (192.168.1.5)
ping 192.168.1.60 – OK
ping 192.168.0.60 – OK
ping 192.168.0.1 – FCUK!!! – в смысле НЕТУ!
——————————-
ПИНГ с компов из сети 192.168.0.0 на комп 192.168.1.5 тоже не проходит. (шлюз для компов из этой сети менял на 192.168.0.60)
——————————-
Можно что-то посоветовать?
anchous Reply:
August 10th, 2012 at 2:30 pm
трейс как раз вам и должен был бы помочь, ибо точно бы диагностировал куда идет пакет и где происходит затыка, так как судя по вашей схеме, могу предположить что для машин подсети 192.168.0.0/24 дефолтным шлюзом стоит 192.168.0.1, на котором не прописан маршрут в подсеть 192.168.1.0
Из другой сети так же!!!
Что делать???
anchous Reply:
August 10th, 2012 at 6:13 pm
с 9кой не работал, но вроде в ней никаких кардинальных изменений не было, так что все должно рвботать, посему проверяйте синтаксис файлов, маски, и могу посоветовать только шаманить: добавить на дефолтный рутер маршрут в подсеть; убрать со шлюза дефолтный маршрут- посмотреть без него; сменить адресацию второй подсети где один компутер на какую нить вроде 172.16.0.0, отрубить-врубить шлюзование
Добрый день. Не могли бы помочь.
Сервер одним концом смотрит в 10.114.172.0/24, а другим в 10.114.173.0/24.
———
em0: inet 10.114.172.50 netmask 255.255.255.0
em1: inet 10.114.173.1 netmask 255.255.255.0
IPFW:
————-
cmd=”ipfw -q add”
oif=”em0″
iif=”em1″
oip=”10.114.172.50″
iip=”10.114.173.1″
MyLan=”10.114.173.0/24″
Lan1=”10.114.172.0/24″
Lan2=”10.114.171.0/24″
#netmask=”24″
#netin=”10.114.173.0″
ipfw -q -f flush
$cmd allow ip from $MyLan to $MyLan via $iif
$cmd allow ip from $Lan1 to $MyLan
$cmd allow ip from $MyLan to $Lan1
$cmd fwd 127.0.0.1,3128 tcp from $MyLan to not me 80 in recv $iif
$cmd allow ip from $oip to any out via $oif
$cmd allow ip from any to $oip in via $oif
$cmd allow ip from $MyLan to any in via $iif
$cmd allow ip from $MyLan to any out via $oif
$cmd allow ip from any to $MyLan in via $oif
$cmd allow ip from any to $MyLan out via $iif
————–
С компьютера 10.114.172.35 ping идет в другую сеть, а с 10.114.173.20 теряется на сервере. В чем может быть проблема?
anchous Reply:
October 13th, 2012 at 12:28 pm
приветствую.
попробуйте из сетки пингануть оба интерфейса шлюза, а также трейс- с большой вероятностью проблема в дефолтных маршрутах на конечных хостах, по которым пакеты уходят куда то не туда.
Исходные данные
На машине имеем 2 сетевых интерфейса:
Внешняя сеть (em1) — 192.168.0.0/24
Внутренняя сеть (em0) — 192.168.10.0/24 (сделаем так)
Шлюз во внешней сети — маршрутизатор с IP адресом 192.168.0.1
Систему устанавливаем с исходными текстами, то есть папка /usr/src не должна быть пустая. Если всё же исходные файлы отстутствуют, то , как их выкачать и установить.
Задача такова : настроить доступ в Интернет во внутренней сети средствами данной операционной системы.
Решение.
1. Настроим сетевые интерфейсы
Открываем файл /etc/rc.conf
и пропишем (или исправим) в нём такие строки:
hostname=″router″
defaultrouter=″192.168.0.1″
gateway_enable=″YES″
ifconfig_em0=″inet 192.168.10.1 netmask 255.255.255.0″
Я использовал IP 192.168.0.110, так как он у меня свободен и в диапазон DHCP он не входит.
Если IP-адрес с внешнего интерфейса необходимо получить автоматически, то вместо строки
ifconfig_em1=″inet 192.168.0.110 netmask 255.255.255.0″
напишем 2 такие строчки:
ifconfig_em1=″DHCP″
ifconfig_em1=″SYNCDHCP″
Теперь открываем /etc/resolv.conf и впишем DNS-сервера.
nameserver 192.168.0.1
2. Соберём и установим ядро нашей системы
Переходим в папку /sys/i386/conf
в этой же папке сделаем копию файла GENERIC и назовём её ROUTER
Открываем файл ROUTER
исправим строчку
ident GERERIC
ident ROUTER
и добавим такие строки (опции):
options IPFIREWALL
options IPDIVERT
options IPFIREWALL_VERBOSE
options IPFIREWALL_VERBOSE_LIMIT=5
options IPFIREWALL_NAT
options LIBALIAS
options ROUTETABLES=2
options DUMMYNET
options HZ=″1000″
IPFIREWALL — для включения ipfw
IPDIVERT — необходимо для работы NAT
IPFIREWALL_VERBOSE — для включения логирования работы ipfw
IPFIREWALL_VERBOSE_LIMIT=5 — для ограничения на количество одинаковых логов — защита против атак
IPFIREWALL_NAT — для включения ipfw NAT
LIBALIAS — для включения в ядро необходимых библиотек libalias
ROUTETABLES=2 — чтобы сделать две таблицы маршрутизации
DUMMYNET — для включения функции шейпера трафика
HZ=″1000″ — для ускорения работы гигабитного сетевого адаптера
Соберём ядро
make buildkernel KERNCONF=ROUTER
и установим его
make installkernel KERNCONF=ROUTER
После этого перезагрузим систему
3. Включаем файрволл в автозагрузку и создадим скрипт с правилами ipfw
Открываем файл /etc/rc.conf и пропишем в него следующие строчки:
firewall_enable=″YES″
firewall_nat_enable=″YES″
firewall_script=″/etc/ipfw.conf″
Теперь открываем файл /etc/sysctl.conf и пропишем в него:
для работы ipfw NAT
net.inet.ip.fw.one_pass=1
и для ведения логов ipfw
net.inet.ip.fw.verbose=1
net.inet.ip.fw.verbose_limit=5
Создадим скрипт с правилами ipfw:
Открываем его
и пропишем в него такие строчки:
exface=″em1″
inface=″em0″
in_ip=″192.168.10.1″
cmd=″ipfw -q″
$cmd -f flush
exface и inface — внешний и внутренний интерфейсы шлюза
in_ip — IP адрес внутреннего интерфейсам
cmd — префикс команды ipfw -q
$cmd -f flush — удаляет все существующие правила
$cmd add 100 allow ip from any to any via lo0 — разрешение трафика на петлевом интерфейсе – необходимо для внутренних нужд ОС
$cmd add 200 deny ip from any to 127.0.0.0/8 — запрещает ip трафик от любого источника на всю сеть loopback интерфейса
$cmd add 300 deny ip from 127.0.0.0/8 to any — запрещает ip трафик со всей сети loopback интерфейса на любой источник
$cmd add 400 allow all from any to any via $inface — разрешает беспрепятственному прохождению трафика внутри созданной нами локальной сети
$cmd nat 1 config log if $exface reset same_ports deny_in — включает kernel NAT на интерфейсе em0 с параметрами, сбрасывает таблицу соединений при смене ip-адреса сетевого интерфейса, пытается сохранить порты, по-умолчанию запрещает входящие подключения
$cmd add 1030 nat 1 ip from any to any via $exface — перенаправляет в NAT всё, что проходит через внешний интерфейс
Скрипт можно дописать под определённые нужды сети.
Сделаем скрипт исполняемым
chmod u+x /etc/ipfw.conf
и перезагрузим систему
4. Устанавливаем и конфигурируем ISC DHCP server 4.2.
Для начала необходимо построить дерево портов:
portsnap fetch && portsnap extract
Если оно было построено ранее, обновляем его:
Устанавливаем из портов DHCP-сервер:
cd /usr/ports/net/isc-dhcp42-server
make all install clean
будут вываливаться окошки с выбором компонентов… оставляем всё по умолчанию.
После установки открываем файл /etc/rc.conf и в нём допишем:
dhcpd_enable=″YES″
dhcpd_flags=″-q″
dhcpd_ifaces=″em0″
Затем открываем файл /usr/local/etc/dhcpd.conf и в нём:
раскомментируем
authoritative;
после строчки
log-facility local7;
стираем все (которые ниже)
и пропишем такие:
subnet 192.168.10.0 netmask 255.255.255.0 {
range 192.168.10.21 192.168.10.151;
option routers 192.168.10.1;
option domain-name-servers 8.8.8.8,8.8.4.4;
Стартуем службу dhcpd
service isc-dhcpd start
или перезагружаем машину
Проверяем на другой машине, например с установленной Windows XP. В настройках сети должно быть отмечено «Получить IP-адрес автоматически» и «Получить адрес DNS-сервера автоматически». Когда XP поймает себе настройки сети, можно будет увидеть:
Если Вам помогла статья, вы можете отблагодарить автора:
перечислить на WMR кошелёк (WebMoney): R301575071888
перечислить на Яндекс.Кошелёк: 410011003938168
или на PayPal: