Меню Рубрики

Установка freebsd на маршрутизатор

Роутер на 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

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

Не забываем добавить 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 шлюз:

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

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

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

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

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

Читайте также:  Установка водосчетчиков подводные камни

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

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

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

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

Заключение

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

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

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

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

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

источник

Freebsd 11.1. Шлюз (роутер), DNS и DHCP сервер, IPFW, kernel NAT.

Я долго искал в интернете много разных how to по настройке шлюза на FreeBSD 11 и IPFW NAT, но ни один вариант мне не подходил, всегда что-то не работало, пришлось изобрести свой велосипед, может кому-то пригодится. Настоятельно рекомендую дочитать статью до конца, прежде чем выполнять какие-либо действия. На момента данного апдейта статьи я уже выполнил все те же действия на физической машине и она успешно работает в качестве шлюза и раздаёт домашним устройствам интернет. Писалось всё для себя, по мере выполнения и реализации каждого шага, но в итоге (imho) получилась вполне себе годная how to.

Все манипуляции производились на виртуальных машинах FreeBSD 11.1-RELEASE amd64, Ubuntu Desktop 17.04 x32 установленных на VmWare под управлением Windows 10. На VmWare необходимо настроить сеть следующим образом:

1. Идем Edit => Virtual Network Editor, не все опции доступны под обычным пользователем, поэтому нажимаем внизу кнопку Change Settings для того чтобы открылись необходимые настройки.

2. Там может быть уже настроено что-то, либо Вы уже сами что-то пытались настроить, поэтому перед настройкой рекомендую нажать Restore Defaults.

3. Нам нужно всего два интерфейса vmnet0 и vmnet1.

4. vmnet0 ставим опцию Bridged и в строке Bridged to выбрать тот интерфейс, через который Ваш основной ПК ходит в интернет и нажать Apply. Всё!

5. vmnet1 ставим опцию Host-only и галочку Connect a host virtual adapter to this network и нажимаем Apply. Ниже могут быть прописаны какие-то адреса, но для нас это не важно.

6. Настроив оба интерфейса нажимаем OK и выходим из редактора виртуальных сетей.

7. В настройках FreeBSD удаляем все сетевые адаптеры и добавляем новый, ставим галочку Connect at power on, выбираем пункт Custom: Specific virtual network и выбираем адаптер VMnet0.

8. Для второго адаптера все те же шаги, но на последнем этапе выбираем VMnet1.

9. Для Ubuntu необходимо аналогично добавить единственный адаптер VMnet1.

10. У меня на FreeBSD vmnet0 был как em0, а vmnet1 как em1, если у Вас иначе правьте все конфиги где это встречается.

После настроек сети можете установить обе гостевые системы, обновить их и начинать манипуляции по инструкции ниже. Установка FreeBSD и Ubuntu не самый сложный процесс, особенно Ubuntu, но даже по FreeBSD полно guide и how to (в-первую очередь рекомендую handbook), так что не буду тратить время, может быть как-нибудь потом.

В rc.conf должна быть строчка:

Настроить конфиг /etc/ssh/sshd_config:

раскомментировать и поменять стандартный порт на свой любимый, я КРАЙНЕ НЕ РЕКОМЕНДУЮ использовать стандартный 22 порт, я на себе прочувствовал когда мой первый шлюз лег от brute force.

После этого у Вас появится возможность подключаться по SSH. Можете использовать такую классику как Putty, а мне нравится Bitvise SSH Client, очень удобно в нём работать: простейший копипаст любых конфигов, а также удобный sftp. Но это дело вкуса.

Под root работать плохая практика:

установим и настроим sudo:

открываем конфиг по адресу /usr/local/etc/sudoers и даём разрешение действовать от имени root пользователям из группы wheel и уберем комментарий строки

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

%wheel ALL=(ALL) NOPASSWD: ALL

Обновляем исходники системы:

Error validating server certificate for ‘ https://svn.freebsd.org:443 ‘:

— The certificate is not issued by a trusted authority. Use the

fingerprint to validate the certificate manually!

— Valid: from May 1 20:26:50 2018 GMT until Jul 30 20:26:50 2018 GMT

— Issuer: Let’s Encrypt Authority X3, Let’s Encrypt, US

(R)eject, accept (t)emporarily or accept (p)ermanently?

вводим t и всё продолжится

Читайте также:  Установка радиатора печки на филдер

Копируем стандартное ядро:

sudo cp /usr/src/sys/amd64/conf/GENERIC /usr/src/sys/amd64/conf/GATEWAY

Открываем в любом редакторе копию ядра, а именно /usr/src/sys/amd64/conf/GATEWAY и добавим строки:

IPFIREWALL — включение IPFW

IPFIREWALL_DEFAULT_TO_ACCEPT — по умолчанию последнее правило IPFW будет разрешать всё

IPFIREWALL_VERBOSE — включаем логирование правил

IPFIREWALL_VERBOSE_LIMIT=50 — лимит количества записей для одного правила

IPFIREWALL_NAT — NAT уровня ядра

LIBALIAS — опция также требуется для работы NAT уровня ядра

IPDIVERT — пересылка (форвард) пакетов

IPSTEALTH — перенаправление портов (NAT и пр.), используем совместно с IPDIVERT

DUMMYNET — ограничение пропускной способности интернет на клиентах или шейпер траффика

DEVICE_POLLING — опрос сетевой карточки по таймеру (периодические опросы позволяют быстрее обрабатывать пакеты), имеет смысл включать на сетевых Intel (em, igb), на других мы либо не получим прироста либо можем получить баги. Поэтому будьте внимательны при включении.

HZ=»1000″ — частота срабатывания планировщика, чем больше, тем чаще срабатывает планировщик рекомендуют ставить не меньше 1000

ROUTETABLES=2 — поддержка нескольких таблиц маршрутизации, в данном случае 2, максимально 16

MROUTING — поддержка пакетов с multicast-адресами, необходимо для маршрутизации

coretemp — модуль ядра для мониторинга температуры ЦП

Здесь сразу добавлю: я указываю какие опции я включаю в ядро и для чего они предназначены, но это вовсе не означает, что Вам они тоже нужны, есть спорные моменты, например: IPFIREWALL_NAT и LIBALIAS — в одном источнике видел следующее, цитата «И всё … никаких IPFIREWALL_NAT и LIBALIAS не надо! В релизе 10R libalias.ko загружается по умолчанию», но такую информацию я увидел лишь в одном месте, пока неохота и некогда изучить подробнее. Моё решение: включить эти опции в ядро, опять же если есть какие-то серьезные противоречия, то перед сборкой ядра система будет ругаться, но, кажется, это не в каждом случае работает.

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

sudo make kernel -s -j4 KERNCONF=GATEWAY

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

net.inet.ip.fw.one_pass=1 — при её установке в 0 пакет, выходящий из dummynet, продолжит свое путешествие по правилам firewall, в противном случае pipe действует, как allow, значение по умолчанию — 1

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

gateway_enable=»YES» # разрешаем пересылку пакетов между сетевыми интерфейсами

firewall_nat_enable=»YES» # включаем ядерный nat

firewall_nat_interface=»em0″ # указываем внешний интерфейс для nat

firewall_enable=»YES» # включаем ipfw

firewall_script=»/usr/local/etc/ipfw/rc.firewall» # указываем путь, где будут лежать настройки ipfw

Создаем папку и файл с правилами для IPFW:

sudo mkdir /usr/local/etc/ipfw

sudo touch /usr/local/etc/ipfw/rc.firewall

Настройка DHCP и DNS сервера:

На данном этапе у меня перестал работать интернет и сразу не установился dnsmasq, разбираться буду позже поэтому обнуляем правила IPFW командой: sudo ipfw flush

Сохраним оригинал конфигурационного файла:

sudo mv /usr/local/etc/dnsmasq.conf /usr/local/etc/dnsmasq.conf.default

sudo touch /usr/local/etc/dnsmasq.conf

Добавим в него следующие строки:

Редактируем правила для IPFW:

Во Freebsd есть замечательный скрипт, с помощью которого можно безопасно настраивать ipfw. Работает он просто. Вы запускаете скрипт, редактируете правила, потом сохраняете их и принимаете изменения. Скрипт после применения правил выводит сообщение о том, что все ли в порядке, записываем правила или нет. Если вы где-то ошиблись и вас отключило от сервера, вы не сможете положительно ответить на вопрос. Скрипт ждет 30 секунд ответа и если его не получает, откатывается на предыдущую версию правил. Вы спокойно подключаетесь и смотрите, где ошиблись. Копируем скрипт:

sudo cp /usr/share/examples/ipfw/change_rules.sh /usr/local/etc/ipfw_change_rules

sudo chmod 0700 ipfw_change_rules

# Allow localhost internal activity

$cmd add 00200 allow ip from any to any via lo0

# don’t allow localhost to send packets outside

$cmd add 00300 deny ip from any to 127.0.0.0/8

$cmd add 00310 deny ip from 127.0.0.0/8 to any

#$cmd add 00400 deny ip from any to 10.0.0.0/8 in via $wan

#$cmd add 00410 deny ip from any to 172.16.0.0/12 in via $wan

#$cmd add 00420 deny ip from any to 192.168.0.0/16 in via $wan

#$cmd add 00430 deny ip from any to 0.0.0.0/8 in via $wan

# BLOCKED autoconfig private network

#$cmd add 00500 deny ip from any to 169.254.0.0/16 in via $wan

#$cmd add 00600 deny ip from any to 240.0.0.0/4 in via $wan

# Deny fragmented icmp packets

#$cmd add 00700 deny icmp from any to any frag

# Deny connections to internal network from external network.

#$cmd add 00800 deny ip from any to $lan in via $wan

# Deny broadcast icmp on external interface

#$cmd add 00900 deny log icmp from any to 255.255.255.255 in via $wan

#$cmd add 00910 deny log icmp from any to 255.255.255.255 out via $wan

#$cmd add 01000 deny < tcp or udp >from any to any dst-port 135-139,445 via $wan

# Do NAT for internal network — FOR NATD

#$cmd 02000 divert natd ip from $lan to any out via $wan

#$cmd 02100 divert natd ip from any to any in via $wan

# Allow established connects

$cmd add 03000 allow tcp from any to any established

# Allow SSH connection to server

$cmd add 04000 allow tcp from any to me 2299 in via $wan

$cmd add 05000 allow udp from any to $wanip 53 in via $wan

$cmd add 05100 allow udp from $wanip 53 to any out via $wan established

$cmd add 06000 allow udp from any to $wanip 123 in via $wan

$cmd add 06100 allow udp from $wanip 123 to any out via $wan established

$cmd add 07000 allow ip from any to any out xmit $wan

#Allow Steam&GTAOnline connection 10.0.0.10

$cmd add 08000 allow udp from any to any 4444, 4445, 6672, 1988, 61455, 61457, 61456, 61458, 27000, 27015, 27030, 27014, 27050 in via $wan

Читайте также:  Установка гидростоек на багажник

$cmd add 08100 allow udp from any to 10.0.0.10 4444, 4445, 6672, 1988, 61455, 61457, 61456, 61458, 27000, 27015, 27030, 27014, 27050 via $lan

$cmd add 09000 allow tcp from any to 10.20.30.50 2233 via $wan

$cmd add 09100 allow tcp from any to 10.20.30.50 2233 via $lan

$cmd add 10000 allow tcp from any to 10.20.30.70 2244 via $wan

$cmd add 11000 allow tcp from any to 10.20.30.70 2244 via $lan

$cmd add 12000 allow tcp from any to 10.20.30.75 2006 via $wan

$cmd add 12100 allow tcp from any to 10.20.30.75 2006 via $lan

#Allow TORRENTS connection 10.0.0.10

$cmd add 13000 allow udp from any to any 30341 in via $wan

$cmd add 13100 allow udp from any to 10.20.30.10 30341 via $lan

# Allow HTTP connection to the server

$cmd add 14000 allow tcp from any to me 80, 9000-31000, 1900, 2827, 4444, 4445, 7652, 7653, 7654, 7656, 7657, 7658, 7659, 7660, 8998, 32000 in via $wan

# Allow FTP connection to the server

$cmd add 15000 allow tcp from any to me 20,21,64000-64999 via $wan

# Allow icmp echo request, echo reply and expire packet TTL

$cmd add 16000 allow icmp from any to any icmptypes 0,8,11

$cmd add 17000 allow tcp from any to me 80 via $wan

# Allow connects from localnetwork

$cmd add 18000 allow all from any to any via $lan

$cmd add 19000 nat 1 log ip from any to any via $wan

$cmd add 65534 deny log logamount 10000 ip from any to any

Дебажим неработающий IPFW или отсутствие интернета в LAN за шлюзом.

Интернет не работает, на шлюзе работает и всё пингует, на клиенте нет, расстроен, я в который раз пытался осилить NAT уровня ядра и снова неудача. Но я решил в этот раз протоколировать все свои действия, дабы потом не вспоминать что, где, когда и как я лихорадочно писал в конфигах, менял конфиги на другие, добавлял\удалял опции в rc.conf, sysctl.conf и так далее, решил в данной ситуации я не хочу решить проблему просто надавив всеми средствами, а именно мне хочется знать в чём же таки, проблема и моя невнимательность, а я уверен, что проблема именно в невнимательности. В поисках решения я попал на страницу форума bsdportal и там у пользователя была схожая проблема, так вот ему предложили стартануть с использованием такого набора правил:

$ add allow all from any to any via lo0

$ add deny all from any to 127.0.0.0/8

$ add deny all from 127.0.0.0/8 to any

$ add allow tcp from any to any $ via $

$ add allow tcp from any $ to any via $

$ nat 1 config if $ same_ports reset log

$ add nat 1 ip from «table(0)» to any out via $

$ add nat 1 ip from any to any in via $

$ add allow ip from any to any

# добавить в таблицу 0 сеть для НАТа

sudo mv /usr/local/etc/ipfw/rc.firewall /usr/local/etc/ipfw/rc.firewall.290518

sudo touch /usr/local/etc/ipfw/rc.firewall

sudo service ipfw restart

Я сразу лезу в виртуалку с ubuntu, открываю yandex.ru и он загрузил страницу!

00100 0 0 allow ip from any to any via lo0

00200 0 0 deny ip from any to 127.0.0.0/8

00300 0 0 deny ip from 127.0.0.0/8 to any

00400 0 0 allow tcp from any to any dst-port 2299 via em1

00500 0 0 allow tcp from any 1223 to any via em1

00600 4561 535130 nat 1 ip from table(0) to any out via em0

00700 8593 9325806 nat 1 ip from any to any in via em0

00800 13845 9920496 allow ip from any to any

65535 6 1358 allow ip from any to any

и с восторгом наблюдаю, как бодро пакеты побежали через NAT. Надо признаться, что первый конфиг IPFW я скопипастил из боевого шлюза на 9.1, который до сих пор работает, только там у меня такая связка: NATD, BIND, DHCPD. Я просто убрал оттуда divert natd и задействовал ipfw nat, но что-то пошло не так. Мораль такова, что не стоит вот так запросто копипастить конфиги и надеяться, что всё будет работать, особенно, если реализован тот же NAT разными способами, возможно не стоит если версии FreeBSD разные. Предполагаю, что конфигурация с которой стоит начать — это та самая на которой у меня благополучно всё взлетело, но мне на хватит смелости утверждать, что она идеальная для начала, но тем не менее в ней минимум правил, а значит её дебажить куда легче, чем мою. Дальше я просто пошёл по всем своим правилам из старой конфигурации и начал их по одному добавлять, каждый раз перезапуская IPFW и проверяя работу интернета на клиентской ubuntu, как только меня выкидывало по ssh или отваливался интернет на клиенте, я заходил в vmware и руками ставил комментарий на правило и дальше с ним работал, пробуя различные варианты. Проблемные оказались правила:

$ add 63800 allow ip from any to any out xmit $

# Allow established connects

$ add 63900 allow tcp from any to any established

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

Переводим IPFW из открытого режима в закрытый:

источник

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

Adblock
detector