Роутер на Freebsd 10 для доступа в интернет
Дистрибутив фрюхи часто называют самым подходящим для решения прикладных сетевых задач в локальной сети. Сегодня мы займемся решением одной из сетевых задач — настройкой шлюза на Freebsd 10 для доступа в интернет из локалки. Это простой, популярный и востребованный функционал сервера, который можно расширять дополнительными возможностями.
Введение
Будем использовать следующую версию системы для решения нашей задачи по настройке шлюза:
Если вы еще не установили систему, то рекомендую мою статью с подробным описанием установки Freebsd 10 с видео в конце. Если вдруг будете устанавливать в качестве виртуальной машины на Hyper-V, то у меня есть отдельная заметка на эту тему с описанием поддержки ядром freebsd гипервизора Hyper-V.
На сервере установлены 2 сетевые карты:
- hn0 — внешний интерфейс, получает интернет от провайдера, настройки по dhcp
- hn1 — локальная сеть, адрес 10.20.30.1, установлен вручную
В нашу задачу по настройке программного freebsd роутера будет входить настройка маршрутизации на сервере, установка и настройка ipfw, включение nat, настройка локального dhcp и dns сервера.
Если у вас недостаточно опыта и вы не чувствуете в себе сил разобраться с настройкой шлюза самому с помощью консоли сервера — попробуйте дистрибутив на основе centos для организации шлюза и прокси сервера в локальной сети — clearos. С его помощью можно через браузер настроить весь необходимый функционал. В отдельной статье я подробно рассказал о настройке и установке clearos.
Подготовка сервера к настройке шлюза
Подробно вопрос настройки сервера Freebsd 10 я рассмотрел отдельно. Рекомендую ознакомиться с материалом. Здесь я не буду останавливаться на нюансах, а просто приведу команды, которые нам необходимы, без комментариев и подробных пояснений.
Любую настройку я предпочитаю начинать с обновления системы. Выполним его:
Теперь установим mc, я привык работать в нем:
Включаем синхронизацию времени. Для этого добавляем в /etc/rc.conf
И запускаем демон ntpd:
Теперь проверим сетевые настройки. Первый сетевой интерфейс я настроил еще во время установки, поэтому доступ в интернет на сервере уже есть. Вот мой конфиг сети:
Не забываем добавить dns сервер в /etc/resolv.conf.
Настройка ipfw и ядерного nat на Freebsd 10
Для того, чтобы включить firewall и nat на будущем freebsd маршрутизаторе можно просто подгрузить необходимые модули ядра. Так сделать проще всего и быстрее, но есть нюанс. Как только вы загружаете модуль ipfw, вы теряете доступ к серверу. Если вы работаете не за консолью, а скорее всего это так, тем более если у вас вообще нет доступа к консоли сервера, то делать так не рекомендуется по понятным причинам. Поэтому мы поступим по-другому. Добавим необходимые опции в ядро, в том числе и опцию, которая делает по-умолчанию фаервол открытым, соберем новое ядро и установим его. Так мы не потеряем удаленный доступ к серверу.
Перед сборкой ядра обновим исходники системы. Я предпочитаю это делать через svn. Если он у вас не установлен, то установите:
Теперь обновляем исходники:
Копируем стандартное ядро и добавляем туда новые строки:
Собираем и устанавливаем новое ядро:
Добавляем в файл /boot/loader.conf строку:
Добавляем в /etc/rc.conf следующие строки (комментарии уберите):
Идем в указанную папку и создаем там файл для правил ipfw:
Содержание этого конфига приведу в виде ссылки на скачивание уже готового файла с подробными комментариями. Думаю, вы без проблем разберетесь в настройках. Здесь не хочу на этом подробно останавливаться, все же тема настройки ipfw это отдельный разговор, у нас задача настроить роутер. Вот готовый набор правил — rc.firewall. Не забудьте указать свои интерфейсы и ip адреса. Если ошибетесь, потеряете доступ к серверу. Когда все настроите, отключите логирование. Там по-умолчанию стоит запись логов на правила nat и deny all.
Копируем скрипт безопасного редактирования правил и делаем его исполняемым:
Подробно о том, что это за скрипт и как он работает я рассказал в теме по настройке freebsd, ссылку на которую давал в начале. Активируем новые правила запуском скрипта:
Откроется список правил в редакторе по-умолчанию. Там уже будут все правила. Можете еще раз их проверить и если все в порядке, сохраняете файл и выходите из редактора. В консоли вы увидите следующее:
Проверим примененные правила:
Если доступ к роутеру не потеряли, значит все в порядке. Можно перезагрузить сервер и все добавленные параметры в rc.conf активируются. Сделайте это и попробуйте на каком-нибудь компьютере в сети пропинговать адрес в интернете по ip, к примеру 8.8.8.8. Если пинги пройдут, значит все в порядке.
Поле того, как убедитесь, что ipfw настроен корректно, правила применятся и доступ к серверу есть, можете перевести его из открытого режима работы (последнее правило автоматически устанавливается allow all from any to any) в закрытый. Для этого в файл /boot/loader.conf добавьте строку и перезагрузите сервер:
На этом основная настройка шлюза на Freebsd 10 окончена. Клиенты смогут выходить в интернет. Но для удобства необходимо на шлюз установить и настроить dhcp и dns сервер, для обслуживания запросов пользователей. Иначе придется вручную забивать сетевые параметры и использовать сторонний dns сервер.
Установка и настройка dnsmasq
Для нашего роутера на freebsd подойдет любой dns и dhcp сервер. Можно использовать традиционные named и dhcp-server. Но для простоты и удобства, когда не нужен дополнительный функционал, я предпочитаю использовать простой и быстрый в настройке dnsmasq.
Устанавливаем dnsmasq на Freebsd шлюз:
Приводим конфиг к следующему виду:
Добавляем в /etc/rc.conf:
Все, теперь наш шлюз полностью готов. Настраиваем на клиентах получение настроек по dhcp и проверяем работу интернета.
Информацию о выданных leases dhcp сервера dnsmasq можно посмотреть в файле /var/db/dnsmasq.leases.
Анализ сетевой активности в freebsd с помощью iftop
Иногда хочется посмотреть, что происходит на роутере и кто использует интернет в данный момент. По-умолчанию, в системе нет готового средства для получения этой информации. На помощь нам придет простая программа iftop, которая позволяет в режиме реального времени посмотреть активность на сетевом интерфейсе.
Устанавливаем iftop на настроенный Freebsd шлюз:
Запускаем iftop с указанием интерфейса и отображением используемых портов:
Видим любопытную картину — кто, куда, по какому порту и с какой скоростью лезет.
Я для примера на одном из компьютеров запустил генератор трафика интернета. Он занял почти весь канал и это стало отлично видно на роутере с помощью iftop. Конечно, эта простая утилита не решает всех вопросов по мониторингу сетевой активности, но для представления текущей картины подходит, если вам не нужно что-то большее.
Заключение
Подведем итог того, что сделали. За короткое время настроили полноценный шлюз (по сути программный роутер) на базе Freebsd 10 для обеспечения выхода в интернет клиентов за сервером. При этом обеспечили автоматическое получение настроек. Даже на скромном виртуальном сервере такой шлюз способен переварить достаточно большой траффик.
Вся настройка занимает буквально 10-15 минут. Основное время уходит на сборку ядра. Чем выше версия Freebsd, тем дольше оно собирается, несмотря на то, что скорости железа существенно возрастают.
Пройдемся по пунктам и разберемся с тем, что конкретно мы сделали:
- Подготовили сервер к настройке шлюза.
- Пересобрали ядро с необходимыми параметрами.
- Настроили ipfw и nat, включили маршрутизацию.
- Установили и настроили dnsmasq для раздачи сетевых настроек по dhcp и dns сервера.
- Установили iftop для простейшего анализа сетевой активности на внешнем интерфейсе.
Этого достаточно для полноценной работы шлюза на Freebsd 10. Если есть необходимость подсчета пользовательского траффика или ограничения доступа к определенным ресурсам, можно настроить прокси сервер squid и sams2 к нему.
Строим маршрутизатор на FreeBSD №1
У тебя есть своя собственная локальная сеть,
ты решил, что тебе пора ее подключать к Интернету по выделенной лини. Ну, что же дело хорошее, сегодня я постараюсь тебе
помочь немного с этим 🙂 Начнем с установки 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 #Данную опцию тоже следует включить
После того как ты добавил и исправил все как надо,
сохрани файл под любым именем 🙂 К примеру proxy. После того как ты сохранил файл, ты даешь несколько команд:
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 #Запрещаем вход пользователей с пустым паролем
После того как разобрались, преступим к файрволу.





