Изоляция сетевых сервисов - это полезная для безопасности тема, а учитывая, что иногда разработчики ProFTPd иногда нас радуют уязвимостями и актуальная. Посмотрим как это сделать в Debian 7 (Wheezy)
Ставим и настраиваем lxc
Первым делом нужно установить пакеты lxc на сервер:
# aptitude install lxc bridge-utils
В ходе инсталляции он попросит ввести root-пароль, используемый для контейнеров и директорию, где должны располагаться контейнеры (по умолчанию это /var/lib/lxc). Пакет bridge-utils обеспечивает управление виртуальным мостом (вариант с Open vSwitch я пока не осилил). Создадим виртуальный мост:
# brctl addbr br0
В файл /etc/network/interfaces нужно добавить следующие строки:
allow-hotplug br0
iface br0 inet static
address 192.168.25.1
netmask 255.255.255.0
network 192.168.25.0
broadcast 192.168.25.255
Возможно также потребуется изменить конфигурацию некоторых сервисов, например разрешить запросы DNS с новой сети в конфигурации BIND9
Если вы собрали свое ядро Linux, а не использовали штатное из пакетных репозиториев Debian, нужно будет также запустить утилиту lxc-checkconfig, чтобы проверить корректность конфигурации ядра.
Создаем домен
Теперь можно создавать первый домен:
# lxc-create -n ftpserver -t debian
К сожалению, шаблон debian в Wheezy сломан, так что придется скачать его правленную версию, например отсюда https://github.com/simonvanderveldt/lxc-debian-wheezy-template Скачайте файл из репозитория и положите его на место файла /usr/share/lxc/templates/lxc-debian Если этого не сделать, первый же запущенный контейнер вывалит много ругани на недоступность /dev/ptmx, ошибки mount и невозможность изменить hwclock (!)
В /var/lib/lxc появится поддиректория ftpserver, а в ней rootfs, содержащая образ нашего контейнера и файл с говорящим названием config. Последний нам нужно будет дополнить: во-первых виртуальным сетевым интерфейсом:
lxc.network.type = veth
lxc.network.flags = up
lxc.network.link = br0
lxc.network.hwaddr = 4a:49:43:49:79:bf
lxc.network.ipv4 = 192.168.25.2/24
К слову, если исключить конфигурацию сети из конфигурации, он пробросит в контейнер все сетевые интерфейсы хост-системы с правами изменять IP-адреса.
И файловой системой, которая должна быть проброшена в контейнер через bind-монтирование:
lxc.mount.entry = /share /var/lib/lxc/ftpserver/rootfs/share none bind 0 0
Точку монтирования придется создать ручками.
Теперь запускаем домен:
# lxc-start -n ftpserver
Если указать также опцию -d, он будет запущен в режиме демона, а присоединиться к нему можно будет посредством утилиты lxc-console. Погасить домен извне можно с помощью утилиты lxc-halt, а выйти из консоли комбинацией "Ctrl-A Q"
Сделать контейнер стартующим при запуске системы, можно создав симлинк его конфига в директории /etc/lxc/auto:
# ln -s /var/lib/lxc/ftpserver/config /etc/lxc/auto/ftpserver
Доставить пакеты до конфигурации сети можно при желании и через chroot:
# chroot /var/lib/lxc/ftpserver/rootfs/ /usr/bin/apt-get install dnsutils
После того, как домен готов можно конфигурировать в нем сеть, устанавливать пакет FTP-сервера и настраивать его, эту тему я оставлю за рамками статьи, тем более что у меня настройка потребовала копирование старого конфига на новое место.
Настраиваем iptables
Осталась самая малость - выпустить наш ftp-сервер во внешний мир: нужно прописать соответствующее правило в цепочках nat и filter для управляющих соединений (я использую iptables-save и iptables-restore):
*nat
...
# proftpd control connection -> ftp
-A PREROUTING -p tcp -d <Публичный IP> --dport 21 -j DNAT --to-destination <IP контейнера>
*filter
...
# ftp(21)
-A INPUT -p tcp -s 0/0 -d <
Публичный IP
> --dport 21 --syn -j ACCEPT
-A FORWARD -p tcp -s 0/0 -d
<IP контейнера>
--dport 21 --syn -j ACCEPT
Что же касается соединений для данных в пассивной конфигурации ftp, нам потребуются загрузить два модуля ядра: nf_conntrack_ftp и nf_nat_ftp:
# modprobe nf_conntrack_ftp nf_nat_ftp
Эту и зеркальную ей modprobe -r для выгрузки модулей команду нужно будет добавить в init.d или ifup скрипт для iptables
Также у вас должны быть разрешены TCP-соединения не только со статусом ESTABLISHED, но и RELATED
Ссылки
https://wiki.debian.org/LXC - Debian Wiki об LXC
https://github.com/simonvanderveldt/lxc-debian-wheezy-template