· freebsd jails network networking freebsd server

FreeBSD, jails, network

Первое, с чем я столкнулся, перейдя на FreeBSD - это вопрос “а как тут правильно ограничивать ресурсы на приложение, да желательно так, чтобы всякие запросы типа domain?q=../../../../etc/passwd ничего не отдавали, или отдавали нерелевантные особо данные? Выход известен всем пользователям FreeBSD и тем, кто наслышан об этой ОС - Jails, они же клетки, они же джейлы.

Я, как человек, который довольно сильно искушен в сетках и их настройке, начав изучать этот вопрос, офигел - сколько же непонятных ограничений у всего этого добра есть. Например, при использовании ezjail рекомендуется использовать клонированный lo0, что очень грустно, потому что TTL там равен нулю (что логично, это же локальная петля). Однако в случае использования склонированной локальной петли возникает вопрос маршрутизации между сетками, потому что моя задача - обеспечить сетевой доступ к клеткам так, что сторонний пользователь (сайт, программа, админ) считал, что это как-бы отдельный сервер или виртуалка. И использовать фаервол для этого, как многие рекомендуют, тоже не хочу, потому что считаю это нехилым таким залпом из БФГ по кузнечикам.

Решение пришло в мою голову довольно быстро - tap-интерфейс. В Linux я использовал tap для настройки VPN серверов (site-to-site или клиентских) и tap себя очень хорошо в этом деле зарекомендовал - головной боли было ровно ноль, только настрой нормально адресацию и маршрутизацию. Я решил попробовать сделать подобное в FreeBSD и не прогадал - все работает просто идеально и TTL у пакетов нормальный :).

Тут принимаем, что:

  1. 192.168.0.0/24 - это подсетка от роутера, в которой нам назначен адрес 192.168.0.2.
  2. 192.168.1.0/24 - подсеть для клеток.

Есть, один нюанс - то, что хорошо для хоста, на котором крутятся клетки, не есть хорошо для самих клеток. Например, для клеток придется делать свою отдельную таблицу маршрутизации. В FreeBSD они называются FIBами и по-умолчанию их ровно одна штука. Надо это число увеличить, путем добавления в /boot/loader.conf следующих строк:

net.fibs=2
net.add_addr_allfibs=0

Последняя строка избавляет нас от еще одной головной боли - переделки таблицы маршрутизации перед стартом клеток (удалять ненужные маршруты, например). И после добавления этих строк сервер надо перезапустить.

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

gateway_enable="YES"
cloned_interfaces="tap0"
ifconfig_tap0="inet 192.168.1.1 netmask 255.255.255.0"
local_enable="YES"

Первая строка включает маршрутизацию между интерфейсами (форвардинг), вторая - поднимает интерфейс tap0, который будем использовать для клеток, третья - назначает на него хостовый адрес (что, скорее всего, не нужно, просто я привык так делать под линуксом :)), четвертая - включает выполнение команд из /etc/rc.local.

Зачем же нужна четвертая строка? Чтобы выполнить команды по настройке таблицы маршрутизации для клеток! И вот как это сделал я:

#!/bin/sh

# Routes for jails.
setfib 1 route add 127.0.0.1 -iface lo0
#setfib 1 route add -net 192.168.1.0/24 -iface tap0
setfib 1 route add -net 192.168.0.0/24 -iface re0
setfib 1 route add default 192.168.0.1

Да, клетки настолько суровы, что им надо путь до 127.0.0.1 добавить, иначе возникнут проблемы с приложениями, которые хотят использовать локальную петлю :)

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

Делаем ребут или выполняем эти команды руками, и все - маршрутизация настроена. Кривоватая пока, но я ищу способы решения этой проблемы без привлечения фаервола.

  • LinkedIn
  • Tumblr
  • Reddit
  • Google+
  • Pinterest
  • Pocket