null

Устанавливаем FTP-сервер в LXC-контейнере Debian 7 Wheezy

Изоляция сетевых сервисов - это полезная для безопасности тема, а учитывая, что иногда разработчики 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

К списку статей

 

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

Основная сфера моей деятельности связана с поддержкой Solaris и оборудования Sun/Oracle, хотя в последнее время к ним прибавились технологии виртуализации (линейка Citrix Xen) и всякое разное от IBM - от xSeries до Power. Учусь на кафедре Вычислительной Техники НИУ ИТМО.

See you...out there!

http://www.facebook.com/profile.php?id=100001947776045
https://twitter.com/AnnoyingBugs