Введение
В предыдущих статьях мы разобрали базовые элементы конфигурации PF. Создали конфигурации, способные защитить сервер в Интернет и простейший офис.
В этой статье разберем возможности PF и FreeBSD в части продвинутой маршрутизации. Policy Based Routing (PBR), Source Based Routing (SBR), условная маршрутизация, маршрутизация на основе политик, все эти понятия, по сути, равнозначны и описывают одну возможность. Выбирать маршруты, либо таблицы маршрутизации для трафика на основе правил фаервола.
Можно, к примеру, отправить разные локальные сети через разных провайдеров, либо устроить распределение трафика между ВПН каналами. Рассмотрим оба эти варианта.
Для уменьшения файлов конфигурации и большей наглядности, в этой статье правила фильтрации будут максимально упрощены.
Дополнительные материалы по Freebsd
Онлайн курс «DevOps практики и инструменты»
Если у вас есть желание научиться строить и поддерживать высокодоступные и надежные системы, научиться непрерывной поставке ПО, мониторингу и логированию web приложений, рекомендую познакомиться с онлайн-курсом «DevOps практики и инструменты» в OTUS. Курс не для новичков, для поступления нужны базовые знания по сетям и установке Linux на виртуалку. Обучение длится 5 месяцев, после чего успешные выпускники курса смогут пройти собеседования у партнеров.
Проверьте себя на вступительном тесте и смотрите программу детальнее по .
Рекомендую полезные материалы по 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 нет метрик маршрутов, так что дефолтный маршрут действительно может быть только один. Соответственно, наш роутер попытается ответить именно с того интерфейса, куда указывает этот маршрут. То есть, получили пакет на re1 и отправили с re0 ответ. Так работать не будет.
Решается вопрос очень легко. У правила pass в PF есть опция reply-to (Interface ), которая указывает, куда отправить ответный пакет. Все опции маршрутизации лучше указывать на входящих правилах.
Как это работает:
- Приходит первый пакет, проходит по правилу.
- PF создаёт стейт, соединение, по которому пакеты пойдут как в одну, так и в другую сторону.
- Пакет отправляется по адресу. На него приходит ответ.
- И вот этот ответ маршрутизируется туда, куда указано в опции reply-to.
Разрешающие правила из Интернет.
И для второго интерфейса:
Этого достаточно, чтобы полученные на 22 порту со второго провайдера соединения работали.
Добавим icmp
И разрешения для проброшенных портов, тэг позволит обойтись минимальным количеством правил для любого количества проброшенных портов:
Теперь разрешения ходить к нам со второго филиала:
Этого достаточно, чтобы входящие сессии строились симметрично. Ответный пакет будет всегда отправлен через тот же интерфейс, через который получен первый пакет сессии.
Устанавливаем php и phpextensions
Дальше устанавливаем php, настройки оставляем настройки по-умолчанию:
# cd /usr/ports/lang/php5 # make config-recursive # make install clean
После установки создаем файл конфигурации:
# cp /usr/local/etc/php.ini-production /usr/local/etc/php.ini
Устанавливаем расширения:
# cd /usr/ports/lang/php5-extensions # make config-recursive
Помимо настроек по-умолчанию, обязательно добавляем CURL, DOM, POSIX, FTP, GD, HASH, ICONV, XML, JSON, MBSTRING, MYSQL, MYSQLI, OPENSSL, SOCKETS, TOKENIZER, XMLREADER, ZLIB, EXIF, GETTEXT,
# make install clean
Теперь поставим модуль php для apache. Он теперь стал почему-то отдельным портом. Я не сразу первый раз сообразил, куда делся модуль, который всегда ставился вместе с портом php. В общем, ставим отдельно:
# cd /usr/ports/www/mod_php5 # make install clean
Для того, чтобы apache правильно обрабатывал php файлы, необходимо в конфиг httpd.conf добавить следующие строки:
<IfModule mod_php5.c> AddType application/x-httpd-php .php AddType application/x-httpd-php-source .phps DirectoryIndex index.php index.html </IfModule>
Теперь можно запустить apache и проверить, все ли у нас в порядке. Сначала проверим, нет ли у нас ошибок в конфигурации:
# apachectl -t AH00526: Syntax error on line 15 of /usr/local/etc/apache24/extra/httpd-vhosts.conf: Invalid command 'RewriteEngine', perhaps misspelled or defined by a module not included in the server configuration
У нас ошибка, модуль mod_rewrite не подключен. Чтобы это исправить, раскомментируем в конфиге апача строку
LoadModule rewrite_module libexec/apache24/mod_rewrite.so
Проверяем снова:
# apachectl -t AH00557: httpd: apr_sockaddr_info_get() failed for websrv.local AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 127.0.0.1. Set the 'ServerName' directive globally to suppress this message Syntax OK
Снова ошибка, но не критичная, можно работать и с ней, но мы все равно ее исправим. В фале httpd.conf находим строку со значением ServerName и приводим ее к виду:
ServerName websrv.local:80
Сохраняем файл, проверяем конфигурацию:
# apachectl -t Syntax OK
Все в порядке, можно стартовать apache:
# /usr/local/etc/rc.d/apache24 start
Проверяем, все ли запустилось:
# ps ax | grep httpd 60555 - Ss 0:00.06 /usr/local/sbin/httpd -DNOHTTPACCEPT 60556 - I 0:00.00 /usr/local/sbin/httpd -DNOHTTPACCEPT 60557 - I 0:00.00 /usr/local/sbin/httpd -DNOHTTPACCEPT 60558 - I 0:00.00 /usr/local/sbin/httpd -DNOHTTPACCEPT 60559 - I 0:00.00 /usr/local/sbin/httpd -DNOHTTPACCEPT 60560 - I 0:00.00 /usr/local/sbin/httpd -DNOHTTPACCEPT
Если получаете что-то подобное, значит все в порядке. Сейчас можно в браузере набрать http://ip-сервера/ и увидеть страничку с одной единственной надписью:
It works!
Это означает, что веб сервер apache работает, все в порядке.
Анализ сетевой активности в freebsd с помощью iftop
Иногда хочется посмотреть, что происходит на роутере и кто использует интернет в данный момент. По-умолчанию, в системе нет готового средства для получения этой информации. На помощь нам придет простая программа iftop, которая позволяет в режиме реального времени посмотреть активность на сетевом интерфейсе.
Устанавливаем iftop на настроенный Freebsd шлюз:
Запускаем iftop с указанием интерфейса и отображением используемых портов:
Видим любопытную картину — кто, куда, по какому порту и с какой скоростью лезет.
Я для примера на одном из компьютеров запустил генератор трафика интернета. Он занял почти весь канал и это стало отлично видно на роутере с помощью iftop. Конечно, эта простая утилита не решает всех вопросов по мониторингу сетевой активности, но для представления текущей картины подходит, если вам не нужно что-то большее.
Задачи
Возьмем офис из прошлой статьи и добавим туда второго провайдера.
- Нужно отправить трафик от одной локальной сети через одного провайдера.
- Вторую локальную сеть — через второго провайдера.
- Так же нужно пробросить веб-порты сервера через обоих провайдеров так, чтобы были доступны оба IP адреса.
В эту схему добавим второй офис, у которого так же 2 провайдера. Между офисами есть 2 туннеля.
- Нужно пустить трафик до второго офиса через ВПН1
- кроме сервера, который должен работать через ВПН2
Решим эти задачи средствами исключительно PF и отдельно — средствами множественных таблиц маршрутизации.
Получается вот такая схема окончательной настройки:
Обновление портов
Основные настройки сделали. Теперь подготовим нашу систему к установке софта. обновим дерево портов с помощью утилиты portsnap. При первом запуске используем команду:
# portsnap fetch extract
Утилита скачает и распакует порты в папку /usr/ports. Последующее обновление будет производиться командой:
# portsnap fetch update
Добавим ее в cron для регулярного обновления портов раз в сутки. Для этого идем в /var/cron/tabs и создаем там файл root.
# touch /var/cron/tabs/root
Файл должен быть следующего содержания:
SHELL=/bin/sh PATH=/etc:/bin:/sbin:/usr/bin:/usr/sbin 0 3 * * * portsnap cron
Обращаю внимание, что команда в планировщике записана не так, как мы запускали из консоли. Это сделано специально, чтобы не грузить сервера обновлений по крону в одно и то же время
Для обновления через планировщик используется специальная команда porsnap cron, которая делает небольшой случайный разброс по времени для обновления, чтобы все клиенты обновлялись в разное время, а не строго по часам.
На этом наша настройка системы закончена, переходим к следующей части, в которой займемся настройкой непосредственно компонентов web-сервера.
Установка и настройка ipfw
Настройка фаервола сервера это тема отдельной статьи, тут я подробно останавливаться на этом не буду. Мы просто запустим фаервол на нашей freebsd 10, установим скрипт для безопасного редактирования правил. А дальше каждый уже сам по своему желанию сможет безопасно настраивать удаленно фаервол, не боясь потерять доступ к серверу.
Для работы ipfw необходимо либо пересобрать ядро с нужными функциями, любо подгружать модуль во время загрузки. Второй вариант проще и быстрее, воспользуемся им. Добавим в /etc/rc.conf строку:
firewall_enable="YES"
Если нам не нужен NAT, forward портов, то больше ничего делать не нужно, ipfw подключится во время загрузки сервера. Если мы оставим только эту строку и перезагрузим сервер, то удаленно мы к нему больше не подключимся, фаервол заблокирует все соединения. Чтобы того не произошло, указываем путь к файлу с правилами:
firewall_script="/usr/local/etc/ipfw/rc.firewall"
Идем в указанную папку и создаем файл следующего содержания:
#!/bin/sh - fwcmd="/sbin/ipfw" ${fwcmd} -f flush ${fwcmd} -f queue flush ${fwcmd} -f pipe flush ${fwcmd} add allow ip from any to any
Это полностью открытый фаервол, который разрешает все подключения. Делаем файл исполняемым. Перезагружаем сервер. После перезагрузки подключаемся удаленно. Проблем не должно возникнуть, фаервол у нас ничего не блокирует. Убеждаемся в этом, запустив команду:
# ipfw show
В ответ получаем:
00100 115 15052 allow ip from any to any 65535 0 0 deny ip from any to any
На первом месте наше правило, которое все разрешает, на втором, запрещающее. Все пакеты попадают под первое правило. В Freebsd есть замечательный скрипт, с помощью которого можно безопасно настраивать ipfw. Работает он просто. Вы запускаете скрипт, редактируете правила, потом сохраняете их и принимаете изменения. Скрипт после применения правил выводит сообщение о том, что все ли в порядке, записываем правила или нет. Если вы где-то ошиблись и вас отключило от сервера, вы не сможете положительно ответить на вопрос. Скрипт ждет 30 секунд ответа и если его не получает, откатывается на предыдущую версию правил. Вы спокойно подключаетесь и смотрите, где ошиблись.
Копируем себе скрипт:
# cp /usr/share/examples/ipfw/change_rules.sh /usr/local/etc/ipfw_change_rules
и делаем его исполняемым:
# chmod 0700 ipfw_change_rules
Теперь можно экспериментировать. При запуске скрипта будет открываться файл с правилами ipfw. После сохранения файла и выхода из него, скрипт спросит, применить или нет новые правила. Дальше я уже описал его логику.
Шаг 1. Подготовьте вашу систему FreeBSD к установке FAMP
Прежде чем мы начнем установку, лучше убедиться, что наша система обновлена.
Чтобы узнать, какую версию вы используете, введите:
$ freebsd-version
Если версия устарела, введите команду ниже, чтобы обновить ее:
$ freebsd-update fetch install
$ pkg update && pkg upgrade -y
Затем установите поддерживающие зависимости:
$ pkg install -y sudo vim bash curl
Затем добавьте нового пользователя с помощью следующей команды:
$ adduser
Вам будет предложено ввести учетные данные пользователя и информацию об учетной записи.
# Username: younis # Full name: Younis Said # Uid (Leave empty for default): # Login group : # Login group is younis. Invite younis into other groups? []: wheel # Login class : # Shell (sh csh tcsh nologin) : bash # Home directory [/home/younis]: # Home directory permissions (Leave empty for default): # Use password-based authentication? : # Use an empty password? (yes/no) : # Use a random password? (yes/no) : # Enter password: your_secure_password # Enter password again: your_secure_password # Lock out the account after creation? : # OK? (yes/no): yes # Add another user? (yes/no): no # Goodbye!
Наконец, выполните команду visudo, как показано ниже, чтобы делегировать командные привилегии администратора всем пользователям группы wheel:
$ visudo # Uncomment by removing hash (#) sign # %wheel ALL=(ALL) ALL
Используйте команду su, за которой следует новое имя пользователя, чтобы изменить учетную запись на ту, которую вы только что создали:
$ su - younis
Также обновите часовой пояс:
$ sudo tzsetup
Маршрутизация средствами PF
Нам нужно отправить трафик от первой локальной сети через первого провайдера, а от второй через второго. Для этого у правила pass есть опция route-to (Interface ). Указывает, куда отправлять трафик, прошедший по этому правилу.
Правило, для маршрутизации к серверу через второй туннель:
Разрешаем ходить в Интернет первой сети:
И второй, указывая, что нужно пойти через второго провайдера:
Если есть необходимость, можно сменить шлюз на выходе из интерфейса правилом такого вида:
Маршрутизация средствами PF — очень гибкий инструмент
Однако, следует использовать его осторожно, потому что легко запутаться: куда, что и зачем идет. Правила следует аккуратно оптимизировать во избежание «распухания» конфигурационного файла
Также нужно заботиться о правильной последовательности правил, что обычно для любого фаервола.
Шаг 2. Установите сервер Apache HTTPS 2.4
Из всех используемых сегодня веб-серверов HTTPS-сервер Apache является самым популярным и используется во всем мире для размещения как статических, так и динамических веб-страниц и приложений.
Pkg, менеджер пакетов FreeBSD по умолчанию, позволяет удобно установить сервер Apache HTTPS из репозитория FreeBSD. Введите команду ниже, чтобы установить Apache с помощью pkg:
$ sudo pkg install -y apache24
Посмотрите, какая версия установлена, с помощью команды ниже:
$ httpd -v
Перед загрузкой Apache необходимо включить его:
$ sudo sysrc apache24_enable=yes
Затем введите команду ниже, чтобы запустить Apache:
$ sudo service apache24 start
Проверьте запуск с помощью следующей команды:
$ sudo service apache24 status
В выводе должно быть четко указано, работает ли он.
Вы также можете убедиться, что все работает правильно, указав свой общедоступный IP-адрес в поле поиска вашего веб-браузера. Если установка прошла гладко и все работает правильно, вы должны быть перенаправлены на веб-страницу, подтверждающую вашу установку.