понедельник, 18 февраля 2013 г.

LXC на Ubuntu Server 12.04 + NAT

Решил ограничить роли на своем сервере мониторинга путем создания контейнеров, создавать отдельные виртуальные машины под каждый сервис посчитал излишним. Да и давно хотелось попробовать виртуализацию на уровне ядра. В начале хотел использовать OpenVZ, но потом склонился к LXC, как более перспективному.

Установка очень проста:
sudo apt-get install lxc lxctl uuid btrfs-tools 
Проверить настройки LXC можно командой
lxc-checkconfig 
Далее создаем контейнер с предустановленной Ubuntu
sudo  /usr/bin/lxc-create -n UBUNTU -t ubuntu
Программа скачивает образ с оф сайта, минут через 10-15 появится сообщение, что все готово.
Для запуска контейнера необходимо сделать
sudo /usr/bin/lxc-start -n UBUNTU 
Логин: ubuntu , пароль: ubuntu .
И попадаем в контейнер.
Теперь надо настроить сеть, чтобы иметь возможность удаленно заходить на свою среду. Изначально, так сказать из коробки, сеть у меня заработала, контейнер оказался за NAT'ом и получил адрес из сети 10.0.3.0/24 и добраться до него можно было лишь с хост-машины. Наша цель включить его в общую сеть.
Информации нормальной пока не нашел, так что вопрос остается открытым. Вопрос удалось решить через проброс портов натом, решается все в 3 строчки:
CACTI
iptables -t nat -A PREROUTING --dst EXTERNAL_INT -p tcp --dport 9002 -j DNAT --to-destination 10.0.3.229:80
RSYSLOG
iptables -t nat -A PREROUTING --dst EXTERNAL_INT -p tcp --dport 9003 -j DNAT --to-destination 10.0.3.83:80
iptables -t nat -A PREROUTING --dst EXTERNAL_INT -p udp --dport 514 -j DNAT --to-destination 10.0.3.83
Последняя строчка делает проброс для логов syslog-сервера, которые получаю на 514 порт по udp.

Так же, чтобы у контейнеров была связь с внешним миром надо настроить NAT:
sudo iptables -A FORWARD -i eth0 -o lxcbr0 -s 10.0.3.0/24 -m conntrack --ctstate NEW -j ACCEPT
sudo iptables -A FORWARD -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
sudo iptables -A POSTROUTING -t nat -j MASQUERADE
где eth0 - внешний интерфейс, lxcbr0 - внутренний интерфейс, 10.0.3.0/24 внутренняя сеть
Для активизации форвардинга между интерфейсами следует добавить
sudo sh -c "echo 1 > /proc/sys/net/ipv4/ip_forward"
и отредактировать sysctl.conf
sudo nano /etc/sysctl.conf
добавив в него две строчки:
net.ipv4.conf.default.forwarding=1 
net.ipv4.conf.all.forwarding=1 
Сохраним текущие настройки:
sudo sh -c "iptables-save > /etc/iptables.up.rules" 
И добавим в автозагрузку, для чего отредактируем файл /etc/network/inerfaces, добавив в раздел auto eth0 строку
pre-up iptables-restore < /etc/iptables.up.rules
Вот и все, теперь на контейнеры можно попадать через external_IP:PORT.

Полезные команды:

lxc-list - просмотр всех контейнеров в системе и их состояний
lxc-destroy -n NAME - уничтожение контейнера
lxc-shutdown -n NAME - корректное выключение контейнера
iptables -t nat -L - список правил iptables
iptables -F - очистка iptables
Для удаления:
iptables -L INPUT --line-numbersiptables -D INPUT номерiptables -t nat -L POSTROUTING --line-numbers iptables -t nat -D POSTROUTING номер 

Комментариев нет:

Отправить комментарий