Роутер на Freebsd 10 для доступа в интернет

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

Углубленный онлайн-курс по MikroTik

Научиться настраивать MikroTik с нуля или систематизировать уже имеющиеся знания можно на углубленном онлайн-курcе по администрированию MikroTik. Автор курcа – сертифицированный тренер MikroTik Дмитрий Скоромнов. Более 40 лабораторных работ по которым дается обратная связь. В три раза больше информации, чем в MTCNA.

Введение

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

# 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

Если вы еще не установили систему, то рекомендую мою статью с подробным описанием установки 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 я рассмотрел отдельно. Рекомендую ознакомиться с материалом. Здесь я не буду останавливаться на нюансах, а просто приведу команды, которые нам необходимы, без комментариев и подробных пояснений.

Любую настройку я предпочитаю начинать с обновления системы. Выполним его:

# freebsd-update fetch
# freebsd-update install

Теперь установим mc, я привык работать в нем:

# pkg install mc

Включаем синхронизацию времени. Для этого добавляем в /etc/rc.conf

ntpd_enable="YES"

И запускаем демон ntpd:

# service ntpd start

Теперь проверим сетевые настройки. Первый сетевой интерфейс я настроил еще во время установки, поэтому доступ в интернет на сервере уже есть. Вот мой конфиг сети:

hostname="freebsd"
ifconfig_hn0="SYNCDHCP"
ifconfig_hn1="inet 10.20.30.1 netmask 255.255.255.0"
defaultrouter="192.168.1.1"

Не забываем добавить dns сервер в /etc/resolv.conf.

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

Настройка ipfw и ядерного nat на Freebsd 10

Для того, чтобы включить firewall и nat на будущем freebsd маршрутизаторе можно просто подгрузить необходимые модули ядра. Так сделать проще всего и быстрее, но есть нюанс. Как только вы загружаете модуль ipfw, вы теряете доступ к серверу. Если вы работаете не за консолью, а скорее всего это так, тем более если у вас вообще нет доступа к консоли сервера, то делать так не рекомендуется по понятным причинам. Поэтому мы поступим по-другому. Добавим необходимые опции в ядро, в том числе и опцию, которая делает по-умолчанию фаервол открытым, соберем новое ядро и установим его. Так мы не потеряем удаленный доступ к серверу.

Перед сборкой ядра обновим исходники системы. Я предпочитаю это делать через svn. Если он у вас не установлен, то установите:

# pkg install subversion

Теперь обновляем исходники:

# svn checkout https://svn0.ru.freebsd.org/base/release/10.2.0 /usr/src

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

# cp /usr/src/sys/amd64/conf/GENERIC /usr/src/sys/amd64/conf/GATE
options IPFIREWALL # включаем ipfw
options IPFIREWALL_DEFAULT_TO_ACCEPT # делаем по-умолчанию ipfw открытым
options IPFIREWALL_VERBOSE # включение логирования ipfw
options IPFIREWALL_VERBOSE_LIMIT=50 # ограничение на количество записей в лог от одного правила
options IPDIVERT # для форварда пакетов
options IPFIREWALL_NAT # для nat
options LIBALIAS # просто надо, не помню зачем

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

# cd /usr/src
# make kernel -s -j4 KERNCONF=GATE

Добавляем в файл /boot/loader.conf строку:

# mcedit /boot/loader.conf
net.inet.ip.fw.one_pass=1

Перезагружаем сервер:

# reboot

Добавляем в /etc/rc.conf следующие строки (комментарии уберите):

gateway_enable="YES" # разрешаем пересылку пакетов между сетевыми интерфейсами
firewall_nat_enable="YES" # включаем ядерный nat
firewall_nat_interface="hn0" # указываем внешний интерфейс для nat
firewall_enable="YES" # включаем ipfw
firewall_script="/usr/local/etc/ipfw/rc.firewall" # указываем путь, где будут лежать настройки ipfw

Идем в указанную папку и создаем там файл для правил ipfw:

# mkdir /usr/local/etc/ipfw && touch /usr/local/etc/ipfw/rc.firewall

Содержание этого конфига приведу в виде ссылки на скачивание уже готового файла с подробными комментариями. Думаю, вы без проблем разберетесь в настройках. Здесь не хочу на этом подробно останавливаться, все же тема настройки ipfw это отдельный разговор, у нас задача настроить роутер. Вот готовый набор правил - rc.firewall. Не забудьте указать свои интерфейсы и ip адреса. Если ошибетесь, потеряете доступ к серверу. Когда все настроите, отключите логирование. Там по-умолчанию стоит запись логов на правила nat и deny all.

Я не рекомендую настраивать firewall, не имея доступа к консоли сервера. Насколько бы вы ни были опытными администраторами, шанс ошибиться есть всегда. Хотя у меня многие вещи доведены до автоматизма и я настраиваю по отработанным шаблонам, все равно иногда возникают ситуации, когда я ошибаюсь и теряю доступ к серверу. Так что в любом случае, при конфигурировании фаервола, убедитесь, что сможете подключиться к серверу и исправить ошибку в случае необходимости.

Копируем скрипт безопасного редактирования правил и делаем его исполняемым:

# cp /usr/share/examples/ipfw/change_rules.sh /usr/local/etc/ipfw_change_rules
# chmod 0700 /usr/local/etc/ipfw_change_rules

Подробно о том, что это за скрипт и как он работает я рассказал в теме по настройке freebsd, ссылку на которую давал в начале. Активируем новые правила запуском скрипта:

# /usr/local/etc/ipfw_change_rules

Откроется список правил в редакторе по-умолчанию. Там уже будут все правила. Можете еще раз их проверить и если все в порядке, сохраняете файл и выходите из редактора. В консоли вы увидите следующее:

редактирование правил ipfw

Проверим примененные правила:

# ipfw show

список правил ipfw

Если доступ к роутеру не потеряли, значит все в порядке. Можно перезагрузить сервер и все добавленные параметры в rc.conf активируются. Сделайте это и попробуйте на каком-нибудь компьютере в сети пропинговать адрес в интернете по ip, к примеру 8.8.8.8. Если пинги пройдут, значит все в порядке.

Поле того, как убедитесь, что ipfw настроен корректно, правила применятся и доступ к серверу есть, можете перевести его из открытого режима работы (последнее правило автоматически устанавливается allow all from any to any) в закрытый. Для этого в файл /boot/loader.conf добавьте строку и перезагрузите сервер:

net.inet.ip.fw.default_to_accept=0

На этом основная настройка шлюза на Freebsd 10 окончена. Клиенты смогут выходить в интернет. Но для удобства необходимо на шлюз установить и настроить dhcp и dns сервер, для обслуживания запросов пользователей. Иначе придется вручную забивать сетевые параметры и использовать сторонний dns сервер.

Установка и настройка dnsmasq

Для нашего роутера на freebsd подойдет любой dns и dhcp сервер. Можно использовать традиционные named и dhcp-server. Но для простоты и удобства, когда не нужен дополнительный функционал, я предпочитаю использовать простой и быстрый в настройке dnsmasq.

Устанавливаем dnsmasq на Freebsd шлюз:

# pkg install dnsmasq

Приводим конфиг к следующему виду:

# mcedit /usr/local/etc/dnsmasq.conf
domain-needed
bogus-priv
interface=hn1
resolv-file=/etc/resolv.conf
dhcp-range=10.20.30.100,10.20.30.200,24h

Добавляем в /etc/rc.conf:

dnsmasq_enable="YES"

Запускаем программу:

# /usr/local/etc/rc.d/dnsmasq start

Все, теперь наш шлюз полностью готов. Настраиваем на клиентах получение настроек по dhcp и проверяем работу интернета.

настройка сетевых параметров по dhcp на клиенте

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

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

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

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

# pkg install iftop

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

# iftop -i hn1 -P

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

просмотр сетевой активности на шлюзе freebsd

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

Заключение

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

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

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

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

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

Помогла статья? Подписывайся на telegram канал автора

Анонсы всех статей, плюс много другой полезной и интересной информации, которая не попадает на сайт.

Дополнительные материалы по Freebsd

Онлайн-курс по устройству компьютерных сетей.

На углубленном курсе "Архитектура современных компьютерных сетей" вы с нуля научитесь работать с Wireshark и «под микроскопом» изучите работу сетевых протоколов. На протяжении курса надо будет выполнить более пятидесяти лабораторных работ в Wireshark.
Рекомендую полезные материалы по Freebsd:
  • Установка
  • Настройка
  • Обновление
  • Шлюз
  • Прокси сервер
  • Веб сервер NGINX
  • Веб сервер Apache
Описание установки Freebsd 11 на одиночный диск, либо на софтовый raid1, сделанный средствами zfs, которые поддерживает стандартный установщик.
Базовая настройка Freebsd, которую можно выполнить после установки сервера общего назначения. Представлены некоторые рекомендации по повышению удобства пользования и безопасности.
Описание и нюансы обновления системы Freebsd с помощью утилиты freebsd-update. Показано пошагово на конкретном примере обновления.
Настройка Freebsd шлюза для обеспечения выхода в интернет. Используется ipfw и ядерный нат, dnsmasq в качестве dhcp и dns сервера. Мониторинг сетевой активности с помощью iftop.
Подробная настройка на Freebsd прокси сервера squid + sams2 - панели управления для удобного администрирования.
Настройка максимально быстрого web сервера на базе Freebsd и nginx + php-fpm. Существенный прирост производительности по сравнению с классическим apache.
Настройка web сервера на Freebsd в связке с apache, nginx, php и mysql. Пошаговая установка и настройка каждого компонента.

Автор Zerox

Владимир, системный администратор, автор сайта. Люблю настраивать сервера, изучать что-то новое, делиться знаниями, писать интересные и полезные статьи. Открыт к диалогу и сотрудничеству. Если вам интересно узнать обо мне побольше, то можете послушать интервью. Запись на моем канале - https://t.me/srv_admin/425 или на сайте в контактах.

34 комментария

  1. Вальдемар

    FreeBSD 13. Повторил всю настройку до слов "На этом основная настройка шлюза на Freebsd 10 окончена. Клиенты смогут выходить в интернет."
    C таким конфигом ipfw сервер даже для себя не может dns запросы отправлять, не то что для клиентов. Клиенты вообще никуда не роутятся.

  2. Богдан

    Скажите пожалуйста, делал все по Вашей инструкции, но интернет на роутере (подключенном к порту lan) так и не заработал, хотя айпи и шлюз роутер получает правильные, на ipfw стоит все разрешено. С роутера пингуется мой айпи с wan, значит роутер его видит. Но у меня провайдер дает серый айпи, за NAT'ом, видимо поэтому роутер не видит интернета, хотя днс я прописывал тоже правильные. Может подскажете? Даже за вознаграждение, не проблема. Мой контакт Telegram: @DeFerres
    спасибо!

  3. Алексей

    Добрый день!

    Не подскажете как сделать пробросать портов на шлюзе на FreeBSD - сам я очень далек от FreeBSD, админ который настраивал исчез?

  4. Кирилл

    Вы все умные ппц я не спорю но хоть бы кто нибудь описал процесс подключения к такому роутеру с ос вин! Как этот роутер видит ос вин какой Сид роутера как установить пароль для входа ну и т д

  5. Сергей

    пробовал на FreeBSD 12. собирал 2 раза и работает все очень криво. так и не понял почему(((

  6. Приветствую!
    По инструкции сделал шлюз, в общем-то все достаточно понятно, есть одно затруднение.
    У меня не идут вол внешку пинги из локалки.
    Добавлял правило:
    allow icmp from any to any
    Не помогло.
    ДНС определяет ИП хоста и блочит воединение.
    Что не так?

    • Универсальное правило при отладке любого фаервола - включит логирование всего, что запрещено и смотреть запрещенное.

  7. # svn checkout https://svn0.ru.freebsd.org/base/release/10.2.0 /usr/src
    Какая строка будет для релиза 11.1?
    # svn checkout https://svn0.ru.freebsd.org/base/release/11.1 /usr/src неверный адрес

  8. еще вопрос по этому моменту /usr/local/etc/rc.d/dnsmasq start , у меня не запускается, нужно пройти по этому пути и оттуда запустить dnsmasq? и второй вопрос такой. не в тему но все таки. настроил я эту фряху на виртуалке vmware workstation, теперь хочу что бы виндовый клиент выходил в нет через этот фряшный шлюз, это реально реализовать? или в масштабе виртуалки это сделать невозможно?

  9. андрей

    приветствую! я новичок, дошел до момента когда нужно подгрузить конфигурационный файл rc.firewall, как это сделать? как его положить в систему? отредактировать то понятно, нужно после того как куда то положил, пройти к нему и отредактировать. в винде если что то нужно куда то положить ты его кладешь скажем на диск С в папку с системой или куда нибудь в другое место, а потом запускаешь его или открываешь в проводнике. А как обстоят дела с фряхой? куда мне его положить?

  10. Аноним

    C десятки FreeBSD напоминает Windows 7. Я думаю что к стабильности и качеству подойдет не раньше 12-й версии, и то под вопросом будет ли . Начали "убивать" единственную ОС.

  11. options IPFIREWALL_NAT # для nat

    options LIBALIAS - # нужен, чтобы скомпилился IPFIREWALL_NAT.

  12. Вопрос автору, зачес gateway_enable="YES" ?

    Этим методом же открывается прямой проброс (route) между интерфейсами и если снаружи прописать маршрут можно попасть в вашу локалку?

    • Этим методом не открывается проброс, а разрешается маршрутизация пакетов между сетевыми интерфейсами. Доступ к локальной сети из интернета контроллируется фаерволом.

      • комп имеет два интерфейса, по одному в каждой сети
        это будет маршрутизация
        главное что бы в sysctl было:

        net.inet.ip.forwarding=1

        Это можно сделать 2-мя способами:

        1. в файл /etc/rc.conf добавить строчку:
        gateway_enable=”YES”

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

        и что бы не перегружать сервер выполнить команду:
        sysctl net.inet.ip.forwarding=1

        Это вам как пример с gateway_enable=”YES”

        прописав снаружи шлюзом ваш внешний ip можно будет спокойно бродить по вашей сети.
        Фаир поможет отчасти.

  13. как писать эту строку если у меня версия 11 ?
    svn checkout https://svn0.ru.freebsd.org/base/release/10.2.0 /usr/src

  14. когда в ядро /usr/src/sys/i386/conf/mykern чьё то добавляешь каждый раз нужно персобрать ядро???
    И всё таки у меня два сетевых карт который первый смотрит в интернет, а второй в локалку после ввода команды netstat -nr шлюз для первой сетевой карты прописан, а шлюз для клиентов нет
    Destination Gateway Flags Netif Expire
    default 192.168.0.5 UGS re0
    127.0.0.1 link#3 UH lo0
    192.168.0.0/24 link#1 U re0
    192.168.0.241 link#1 UHS lo0
    192.168.1.0/24 link#2 U rl0
    192.168.1.1 link#2 UHS lo0

  15. когда я его убрал эту строку ->>>>
    $cmd nat 1 config log if $wan reset same_ports deny_in redirect_port tcp 192.168.1.2:443 443 redirect_port tcp 192.168.1.2:80 80
    из ipfw после перезагрузки сервера клиент не смог подключиться к интернету
    Я просто скопировал файл настроек, который вы готовили и менял только свои адреса и не чего больше, а тогда почему у вас идет пинг а у меня нет. Вот листинг
    #!/bin/sh

    #### Переменные ####

    wan="re0"
    wan_ip="192.168.0.224"
    lan="rl0"
    lan_ip="192.168.1.1"

    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
    $cmd add 300 deny ip from 127.0.0.0/8 to any

    # Разрешаем подключение по ssh
    $cmd add 400 allow tcp from any to $wan_ip 22 in via $wan
    $cmd add 410 allow tcp from $wan_ip 22 to any out via $wan established

    # Разрешаем DNS запросы
    $cmd add 500 allow udp from any to $wan_ip 53 in via $wan
    $cmd add 510 allow udp from $wan_ip 53 to any out via $wan established

    # Разрешаем UDP (для синхронизации времени - 123 порт)
    $cmd add 600 allow udp from any to $wan_ip 123 in via $wan
    $cmd add 610 allow udp from $wan_ip 123 to any out via $wan established

    # Разрешаем ftp снаружи (если необходимо)
    #$cmd add 700 allow tcp from any to $wan_ip 20,21 in via $wan
    #$cmd add 710 allow tcp from $wan_ip 20,21 to any out via $wan established
    #$cmd add 720 allow tcp from any to $wan_ip 49000-55000 in via $wan

    # Разрешаем некоторые типы ICMP траффика - эхо-запрос, эхо-ответ и время жизни пакета истекло
    $cmd add 800 allow icmp from any to any icmptypes 0,8,11

    # Разрешаем все соединения на локальном интерфейсе
    $cmd add 900 allow all from any to any via $lan

    # Пример проброса портов 3389 и 80 в локальную сеть на два разных компьютера
    $cmd nat 1 config log if $wan reset same_ports deny_in redirect_port tcp 192.168.1.2:3389 3389 redirect_port tcp 192.168.1.2:80 80

    # Включаем NAT
    $cmd add 1000 nat 1 log ip from any to any via $wan

    # Запрещаем все, что не разрешено
    $cmd add 65534 deny log all from any to any

  16. Вообще не понял как работает это правило
    Это у вас ->>
    $cmd nat 1 config log if $wan reset same_ports deny_in redirect_port tcp 10.20.30.2:3389 3389 redirect_port tcp 10.20.30.55:80 80
    А это у меня -->>
    $cmd nat 1 config log if $wan reset same_ports deny_in redirect_port tcp 192.168.1.2:443 443 redirect_port tcp 192.168.1.2:80 80

    • При обращении на 443 порт шлюза, соединение будет перенаправлено на ip 192.168.1.2 на тот же 443 порт.

  17. 3) Вот здесь какие то ещё файлы собираються /usr/local/etc/ipfw/rc.firewall кроме rc.firewall есть ещё файлы в них не чье нету а имена примерно таки rc.firewall.201701281652 можно их удалить или?

    • Это сохраненные версии предыдущих настроек. После каждого изменения фаервола создается архивный файл с прошлыми настройками. Если они не нужны, можно удалить.

  18. Привет! Братан Я тебя очень благодарен за то, что ты мужик. За то что ты приведешь в статье это РЕАЛЬНО есть и когда делаю у меня получается. Я тебя уважаю.
    Советую всем новичкам, что это актуальная статья.
    Но я как новичок кое чье не понял или понял карочи сам не знаю :)
    1) Что такое проброс портов, кстати когда я его убрал из ipfw после перезагрузки сервера клиент не смог подключиться к интернету. Было бы хорошо, если автор посоветовал меня кое чье.
    2) У меня клиенты выходят в Интернет, но не пингуют например, 8.8.8.8 или ya.ru почему ???

    Я использую FreBSD 11
    ядро была собрано и поднято вот из этой статьи http://mediaunix.com/prostoj-sposob-razdachi-interneta-v-seti/

    • 1. Проброс портов нужен, когда необходимо из интернета получить доступ к какому-то сервису в локальной сети. Тогда пробрасывают порт к этому сервису через шлюз прям на нужный компьютер.
      2. Значит ping заблокирован на firewall.

  19. как можно торенты по скорости ограничить при такой настройке?

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Нажимая кнопку "Отправить комментарий" Я даю согласие на обработку персональных данных.
Используешь Telegram? Подпишись на канал автора →
This is default text for notification bar