FreeBSD как router или как заставить FreeBSD маршрутизировать пакеты из одной сети в другую. Настраиваем шлюз в Интернет на базе FreeBSD Настройка шлюза на freebsd 11

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

В этой статье мы рассмотрим сетевые интерфейсы в FreeBSD 11.1 , покажем настройку сети через файл конфигурации /etc/rc.conf , а именно назначение статических настроек и получение их по DHCP. Пропишем адреса DNS -серверов, настроем hosts и рассмотрим указание временных настроек сети .

Просмотр сетевых интерфейсов.

Для начала проясним: Есть два состояния сетевой карты UP (задействована) и DOWN (не задействована).

Первым делом стоит посмотреть наши сетевые интерфейсы, смотреть будем командой ifconfig .(Рис.1) Вывод команды показывает все интерфейсы UP и DOWN.

Ifconfig

ifconfig -a покажет вам тоже самое.

Ifconfig -a

Вот тут есть некоторые отличия от ifconfig в Ubuntu server .(в Ubuntu server "ifconfig" показывает только интерфейсы UP , "ifconfig -a" показывает все интерфейсы и UP и DOWN )

Рис.1 - Результат ввода команды ifconfig.

И так что же мы видим:

  • em0 - наша сетевая карта, с IP адресом 192.168.3.11 .
  • em1 - вторая сетевая карта, не настроенная.
  • lo - локальная петля, она у всех присутствует по умолчанию.

Для того чтобы посмотреть интерфейсы только UP , используется команда ifconfig -u (Рис.2):

Ifconfig -u

а для просмотра интерфейсов только DOWN , используется команда ifconfig -d (Рис.3):

Ifconfig -d
Рис.2 - Результат ввода команды ifconfig -u.
Рис.3 - Результат ввода команды ifconfig -d.

В дальнейшем я буду показывать примеры настройки на интерфейсе "em0" .

Для включения интерфейса используется команда ifconfig "НАЗВАНИЕ-ИНТЕРФЕЙСА " up.

Ifconfig em0 up

Для выключения интерфейса используется команда ifconfig "НАЗВАНИЕ-ИНТЕРФЕЙСА " down.

Ifconfig em0 down

"Поиграйтесь" с интерфейсом, если вы конечно же не подключены по ssh , и оставьте его в состоянии UP .

Настройка сети через файл конфигурации.

Для настройки статического или динамического IP адреса нам надо отредактировать файл конфигурации сетевых интерфейсов - /etc/rc.conf мы будем редактировать его с помощью текстового редактора vi .(Рис.4) Сразу скажу, для того чтобы редактировать в vi нужно нажать букву "i" , а чтобы сохранить и закрыть документ надо нажать "Esc" ввести ":wq!" и нажать "Enter" .

Рис.4 - vi /etc/rc.conf.

Получение настроек сети по DHCP.

Чтобы назначить получение настроек по DHCP, нужно вписать(или изменить существующую) строчку в файл /etc/rc.conf .(Рис.5)

ifconfig_ НАЗВАНИЕ-ИНТЕРФЕЙСА ="DHCP"

Ifconfig_em0="DHCP"
Рис.5 - Получение сетевых настроек по DHCP.

Перезапускаем сетевую службу netif .(Рис.6)

/etc/rc.d/netif restart Рис.6 - Перезапуск сетевой службы FreeBSD.

Смотрим активные сетевые интерфейсы, видим, полученный по DHCP, IP адрес интерфейса em0 - 192.168.3.6 (Рис.7)

Ifconfig -u

Ping 8.8.8.8
Рис.7 - Проверка активных интерфейсов и доступа к сети.

Пинги идут. Всё отлично!

Указание настроек сети вручную.

Чтобы назначить статичный адрес для нашей Freebsd нужно в файл /etc/rc.conf вписать две строки(Рис.8)

ifconfig_ НАЗВАНИЕ-ИНТЕРФЕЙСА ="inet IP-АДРЕС-FREEBSD netmask МАСКА-СЕТИ "

defaultrouter=" IP-АДРЕС-ШЛЮЗА "

Ifconfig_em0="inet 192.168.3.11 netmask 255.255.255.0" defaultrouter="192.168.3.1"
Рис.8 - Статичные настройки сетевого интерфейса.

Перезапускаем сетевую службу.

/etc/rc.d/netif restart

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

Ifconfig -u

Проверяем выход в интернет пингуем гугловские восьмёрки.

Ping 8.8.8.8

Настройка DNS.

IP адреса DNS серверов хранятся в файле /etc/resolv.conf (Рис.9)

Открываем resolv.conf в редакторе vi .

Vi /etc/resolv.conf

Вписываем IP адрес DNS сервера. (Можно указать сколько угодно адресов.)

Nameserver 192.168.3.1 nameserver 8.8.8.8 nameserver 8.8.4.4

Если у вас нет файла resolv.conf то создайте его в каталоге /etc

Touch /etc/resolv.conf
Рис.9 - Содержимое файла resolv.conf.

Файл /etc/hosts.

Файл /etc/hosts содержит таблицы сопоставления DNS имен с IP адресами. В первую очередь ваш сервер будет обращаться к файлу hosts , а потом уже к DNS-серверу.

Лично для себя я отметил полезным внести в hosts запись этого freebsd (IP адрес локальной сети - имя сервера). Теперь мы можем во всех конфигурационных файлах указывать DNS имя, а не IP адрес, а в случае необходимости за кротчайшее время изменить свой IP адрес поправив hosts и настройки интерфейса в /etc/rc.conf .

Это просто для примера вам этого делать не обязательно .

Приступаю к редактированию(Рис.10):

Vi /etc/hosts

Вписываю:

192.168.3.11 freebsd.itdeer.loc Рис.10 - Содержимое файла hosts.

Проверю попинговав имена из hosts .(Рис.11)

Ping localhost ping freebsd.itdeer.loc
Рис.11 - Пингуем имена из hosts.

Временное назначение ip адреса.

Честно говоря я не знаю для чего может пригодиться временное назначение сетевых настроек. Разве что допустим у вас какой-нибудь сервер который предназначен только для вашей локальной сети и вы вдруг решили быстренько обновить ПО через интернет на этом сервере, чтобы не ходить к шлюзу не раздавать интернет на нужный IP адрес итд. Вы можете обойтись парой команд.

Например, мы знаем что на 192.168.3.109 точно есть доступ в интернет, назначаем этот IP адрес нашему интерфейсу, так же нужно указать маску сети(Рис.12):

Ifconfig em0 192.168.3.109 netmask 255.255.255.0

или командой с короткой записью маски сети.

Ifconfig em0 192.168.3.109/24
Рис.12 - Указание временных настроек для сетевого интерфейса em0.

Интернет может не появиться, так как не указан шлюз по умолчанию. Прописываем его и пингуем гугловкие восьмёрки.(Рис.13)

Route add default 192.168.3.1 ping 8.8.8.8
Рис.13 - Указываем шлюз по умолчанию. Проверяем ping.

Правильно ли мы прописали наш шлюз по умолчанию можно посмотреть в таблице маршрутизации. Она выводится с помощью команды "netstat -rn" , Шлюз по умолчанию будет обозначен флагом UG .(Рис.14)

Netstat -rn
Рис.14 - Вывод таблицы маршрутизации.

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

Route del default

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

Добавляем маршрут в сеть 192.168.0.0/16 (Маска 255.255.0.0) через основной шлюз(gateway) 192.168.3.1/24

Route add 192.168.0.0/16 192.168.3.1

Вариант добавления маршрута с указанием полной маски.

Route add -net 192.168.0.0 -netmask 255.255.0.0 192.168.3.1

Переименовываем интерфейс em0 в wan0.

Для удобства некоторые админы переименовывают интерфейсы, чтобы сразу видеть для чего предназначен интерфейс. Допустим у нас шлюз с двумя сетевыми интерфейсами em0 (интернет) и em1 (локальная сеть) и работать с такими названиями неудобно, так как имея большое количество интерфейсов можно запутаться. Гораздо удобнее работать с интерфейсами wan0 и lan1 .

Мы покажем пример переименования интерфейса em0 в wan0 в файле /etc/rc.conf .(Рис.15)

Ifconfig_em0="inet 192.168.3.11 netmask 255.255.255.0"

Заменяем двумя строками:

Ifconfig_em0 _name="wan0 " ifconfig_wan0 ="inet 192.168.3.11 netmask 255.255.255.0"
Рис.15 - Переименовываем интерфейсы в файле /etc/rc.conf.

Не забываем перезапустить сетевую службу:

/etc/rc.d/netif restart

Проверю, введу команду ifconfig -u . Видим наш wan0 с нужным IP адресом .(Рис.16)

Ifconfig -u
Рис.16 - Проверяем новое название интерфейса. ifconfig -u.

Использование FreeBSD на небольших роутерах для связи с внешним миром уже давно перестало быть чем-то выдающимся. Эта простая в использовании, нетребовательная к ресурсам и обслуживанию операционная система почти идеально подходит для решения подобных задач.

Нам понадобится

Аппаратное обеспечение . Чтобы вывести внутреннюю сеть в Интернет, достаточно компьютера Pentium III 600 МГц, 256 Мб RAM, 10 Гб HDD, 2 сетевые карты. Конфигурация взята с запасом, для полноценной работы сети малого офиса (около 50 пользователей) вполне хватило бы Pentium II 400 МГц, c 128 Мб RAM. Но в дальнейшем может возникнуть желание установить на этот же шлюз, к примеру, прокси-сервер, лучше выбрать конфигурацию более высокого уровня.

Операционная система : FreeBSD 5.5 или 6.1.

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

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

Настройка сетевых интерфейсов

Необходимо уточнить имена интерфейсов сетевых карт, под которыми их распознает операционная система.

Должно появиться что-то подобное:

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) Но поскольку нам известны все необходимые параметры, то для упрощения процесса и экономии времени мы будем задавать параметры путем редактирования соответствующих конфигурационных файлов.

Для редактирования будем использовать текстовый редактор vi, присутствующий практически в любой системе UNIX. Для администраторов, пока незнакомых с редактором, могу порекомендовать замечательную статью Максима Мошкова http://www.lib.ru/unixhelp/vi.txt и http://www.lib.ru/unixhelp/vibegin.txt.

Настройки сетевых интерфейсов во 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"

После чего перезагружаем компьютер:

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

После загрузки проверяем:

Вывод команды 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:

и добавляем следующие опции:

#
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

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

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

Для организации работы файервола используются следующие переменные, добавляемые при необходимости в файл 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

Перезагружаемся и проверяем доступ к нужным ресурсам Интернета с компьютера из локальной сети.

1. Эви Немет, Гарт Снайдер, Скотт Сибасс, Трент Р.Хейн. UNIX. Руководство системного администратора. «BHV», «Питер», 2004 г.
2. Алексей Федорчук, Алексей Торн. FreeBSD. Установка, настройка, использование. BHV, 2003 г.
3. Филипп Торчинский. Практическое пособие администратора UNIX. «Символ», 2003 г.


Маршрутизатор – устройство, которое обеспечивает доступ компьютеров объединенных в локальную сеть к сети интернет. При помощи FreeBSD можно построить подобный маршрутизатор и это делается совершенно просто, рассмотрим вариант построения маршрутизатора для небольшой локальной сети в 20…30 рабочих мест.

Исходные данные – ПК с двумя сетевыми картами с установленной FreeBSD (на данный момент использую FreeBSD 8.4 STABLE), внешний ip-адрес предоставленный нашим провайдером, ip-адрес шлюза провайдера и ip-адрес DNS-сервера.

Для превращения в маршрутизатор в файл конфигурации rc.conf достаточно добавить всего лишь одну строку:

# echo gateway_enable=”YES” > /etc/rc.conf

Которая разрешит прохождение ip-пакетов с одного сетевого интерфейса на другой. Командой ifconfig узнаем информацию о сетевых интерфейсах и определим, какой из них будет «внешним» (ему назначим ip-адрес провайдера), а какой «внутренним» (ему присвоим не занятый ip-адрес внутренней локальной сети). Смотрим, что мы получим:


Определяем “em0” как внешний интерфейс (с присвоенным ip 192.168.5.39), “em1” как внутренний редактированием файла rc.conf (присвоем ему, к примеру, ip 192.168.0.240), в этот же файл необходимо прописать шлюз нашего провайдера

# echo defaultrouter=”xxx.xxx.xxx.xxx” > /etc/rc.conf

Где xxx.xxx.xxx.xxx -- ip-адрес шлюза провайдера.

В итоге у меня получился следующий вид файла rc.conf


Затем необходимо прописать ip-адрес DNS-сервера провайдера, чтобы мы могли обращаться к сайту по их именам. Сделаем запись в конфигурационном файле resolv.conf

# echo nameserver xxx.xxx.xxx.xxx > /etc/resolv.conf

Где xxx.xxx.xxx.xxx ip-адрес DNS-сервера.

Если DNS серверов несколько, желательно перечислить их все, каждый с новой строчки.


В нашем случае это ip-адреса серверов 192.168.5.200 и 192.168.5.201. Адрес 8.8.8.8 DNS-сервер великого Google, в крайнем случае, можно пользоваться им.

Делаем перезагрузку...

# shutdown –r now

Всё, начальная настройка маршрутизатора готова (можно настраивать ПК локальной сети). Далее будем рассматривать настройку сетевого экрана (firewall), включение трансляции сетевых адресов (NAT), всевозможные схемы маршрутизации.

Смотрим настройку рабочих станций под ОС «Windows» для сети интернет (как и где прописать ip-адрес ПК, маршрутизатора и DNS). Как приложение, так на всякий случай, вдруг кому понадобится.

Смотрим продолжение настройки маршрутизатора (часть 2).

Дистрибутив фрюхи часто называют самым подходящим для решения прикладных сетевых задач в локальной сети. Сегодня мы займемся решением одной из сетевых задач — настройкой шлюза на 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. Если есть необходимость подсчета пользовательского траффика или ограничения доступа к определенным ресурсам, можно к нему.