Дистрибутив фрюхи часто называют самым подходящим для решения прикладных сетевых задач в локальной сети. Сегодня мы займемся решением одной из сетевых задач - настройкой шлюза на Freebsd 10 для доступа в интернет из локалки. Это простой, популярный и востребованный функционал сервера, который можно расширять дополнительными возможностями.
На углубленном курсе "Архитектура современных компьютерных сетей" вы с нуля научитесь работать с Wireshark и «под микроскопом» изучите работу сетевых протоколов. На протяжении курса надо будет выполнить более пятидесяти лабораторных работ в Wireshark.
Содержание:
Введение
Будем использовать следующую версию системы для решения нашей задачи по настройке шлюза:
# 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.
Копируем скрипт безопасного редактирования правил и делаем его исполняемым:
# 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 show
Если доступ к роутеру не потеряли, значит все в порядке. Можно перезагрузить сервер и все добавленные параметры в 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 и проверяем работу интернета.
Информацию о выданных 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, тем дольше оно собирается, несмотря на то, что скорости железа существенно возрастают.
Пройдемся по пунктам и разберемся с тем, что конкретно мы сделали:
- Подготовили сервер к настройке шлюза.
- Пересобрали ядро с необходимыми параметрами.
- Настроили ipfw и nat, включили маршрутизацию.
- Установили и настроили dnsmasq для раздачи сетевых настроек по dhcp и dns сервера.
- Установили iftop для простейшего анализа сетевой активности на внешнем интерфейсе.
Этого достаточно для полноценной работы шлюза на Freebsd 10. Если есть необходимость подсчета пользовательского траффика или ограничения доступа к определенным ресурсам, можно настроить прокси сервер squid и sams2 к нему.
Помогла статья? Подписывайся на telegram канал автора
Анонсы всех статей, плюс много другой полезной и интересной информации, которая не попадает на сайт.Дополнительные материалы по Freebsd
Научиться настраивать MikroTik с нуля или систематизировать уже имеющиеся знания можно на углубленном онлайн-курcе по администрированию MikroTik. Автор курcа – сертифицированный тренер MikroTik Дмитрий Скоромнов. Более 40 лабораторных работ по которым дается обратная связь. В три раза больше информации, чем в MTCNA.
Рекомендую полезные материалы по Freebsd: |
Описание установки 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. Пошаговая установка и настройка каждого компонента.
|
FreeBSD 13. Повторил всю настройку до слов "На этом основная настройка шлюза на Freebsd 10 окончена. Клиенты смогут выходить в интернет."
C таким конфигом ipfw сервер даже для себя не может dns запросы отправлять, не то что для клиентов. Клиенты вообще никуда не роутятся.
Скажите пожалуйста, делал все по Вашей инструкции, но интернет на роутере (подключенном к порту lan) так и не заработал, хотя айпи и шлюз роутер получает правильные, на ipfw стоит все разрешено. С роутера пингуется мой айпи с wan, значит роутер его видит. Но у меня провайдер дает серый айпи, за NAT'ом, видимо поэтому роутер не видит интернета, хотя днс я прописывал тоже правильные. Может подскажете? Даже за вознаграждение, не проблема. Мой контакт Telegram: @DeFerres
спасибо!
Добрый день!
Не подскажете как сделать пробросать портов на шлюзе на FreeBSD - сам я очень далек от FreeBSD, админ который настраивал исчез?
Какой фаревол используется? Это может быть как pf, так и ipfw. От этого зависит настройка.
А как узнать какой файрвол?
Вы все умные ппц я не спорю но хоть бы кто нибудь описал процесс подключения к такому роутеру с ос вин! Как этот роутер видит ос вин какой Сид роутера как установить пароль для входа ну и т д
пробовал на FreeBSD 12. собирал 2 раза и работает все очень криво. так и не понял почему(((
Что именно криво работает?
Приветствую!
По инструкции сделал шлюз, в общем-то все достаточно понятно, есть одно затруднение.
У меня не идут вол внешку пинги из локалки.
Добавлял правило:
allow icmp from any to any
Не помогло.
ДНС определяет ИП хоста и блочит воединение.
Что не так?
Универсальное правило при отладке любого фаервола - включит логирование всего, что запрещено и смотреть запрещенное.
# 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 неверный адрес
Не знаю, негде проверить. Если сами нашли, прошу поделиться информацией.
https://svnweb.freebsd.org/base/release/11.1.0/
svn co https://svn.freebsd.org/base/stable/11 /usr/src
Переходите на git.
еще вопрос по этому моменту /usr/local/etc/rc.d/dnsmasq start , у меня не запускается, нужно пройти по этому пути и оттуда запустить dnsmasq? и второй вопрос такой. не в тему но все таки. настроил я эту фряху на виртуалке vmware workstation, теперь хочу что бы виндовый клиент выходил в нет через этот фряшный шлюз, это реально реализовать? или в масштабе виртуалки это сделать невозможно?
приветствую! я новичок, дошел до момента когда нужно подгрузить конфигурационный файл rc.firewall, как это сделать? как его положить в систему? отредактировать то понятно, нужно после того как куда то положил, пройти к нему и отредактировать. в винде если что то нужно куда то положить ты его кладешь скажем на диск С в папку с системой или куда нибудь в другое место, а потом запускаешь его или открываешь в проводнике. А как обстоят дела с фряхой? куда мне его положить?
я это делаю с помощью WinSCP
C десятки FreeBSD напоминает Windows 7. Я думаю что к стабильности и качеству подойдет не раньше 12-й версии, и то под вопросом будет ли . Начали "убивать" единственную ОС.
options IPFIREWALL_NAT # для nat
options LIBALIAS - # нужен, чтобы скомпилился IPFIREWALL_NAT.
Вопрос автору, зачес 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 можно будет спокойно бродить по вашей сети.
Фаир поможет отчасти.
как писать эту строку если у меня версия 11 ?
svn checkout https://svn0.ru.freebsd.org/base/release/10.2.0 /usr/src
когда в ядро /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
когда я его убрал эту строку ->>>>
$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
Вообще не понял как работает это правило
Это у вас ->>
$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 порт.
3) Вот здесь какие то ещё файлы собираються /usr/local/etc/ipfw/rc.firewall кроме rc.firewall есть ещё файлы в них не чье нету а имена примерно таки rc.firewall.201701281652 можно их удалить или?
Это сохраненные версии предыдущих настроек. После каждого изменения фаервола создается архивный файл с прошлыми настройками. Если они не нужны, можно удалить.
Привет! Братан Я тебя очень благодарен за то, что ты мужик. За то что ты приведешь в статье это РЕАЛЬНО есть и когда делаю у меня получается. Я тебя уважаю.
Советую всем новичкам, что это актуальная статья.
Но я как новичок кое чье не понял или понял карочи сам не знаю :)
1) Что такое проброс портов, кстати когда я его убрал из ipfw после перезагрузки сервера клиент не смог подключиться к интернету. Было бы хорошо, если автор посоветовал меня кое чье.
2) У меня клиенты выходят в Интернет, но не пингуют например, 8.8.8.8 или ya.ru почему ???
Я использую FreBSD 11
ядро была собрано и поднято вот из этой статьи http://mediaunix.com/prostoj-sposob-razdachi-interneta-v-seti/
1. Проброс портов нужен, когда необходимо из интернета получить доступ к какому-то сервису в локальной сети. Тогда пробрасывают порт к этому сервису через шлюз прям на нужный компьютер.
2. Значит ping заблокирован на firewall.
как можно торенты по скорости ограничить при такой настройке?
к моему коменту выше, поподробнее настройки фаерволла, поглядеть решения по ограничению скорости.