- Автор: daniil
- Распечатать
Оцените статью: Поделитесь с друзьями!
- 5
- 4
- 3
- 2
- 1
(0 голосов, среднее: 0 из 5)
Стефан Грабер (Stéphane Graber) работает в Canonical в Ubuntu Foundations Team и вместе с Сержем (Serge Hallyn) являются главными мантейнерами LXC.
Сейчас в мире ИТ такие слова как виртуализация, LXC и Docker находятся в тренде и тем более приятно, что разработчики не только радуют нас новыми версиями своих продуктов, но и описывают новомодные фичи или нестандартные кейсы использования.
Стефан Грабер публикует цикл статей для популяризации LXC и вот пополнение в строю. Стефан в своей новой статье описывает интересное использование клиент VPN в контейнере, так как сам активно использует виртуальные частные сети для подсоединения к корпоративной или собственной сети для управления серверами.
Многие из тех, кто активно использует VPN, знают как быстро в реальной жизни админа заканчиваются разрешённые подсети, описанные в rfc1918.
На практике частенько бывает, что сто́ит подсоединиться к VPN серверу, как часть сети вашего компьютера-клиента-VPN становится не доступной из-за перекрывающихся конфигураций.
Если нужно подсоединяться одновременно к более чем одному VPN серверу, то ситуация только усугубляется.
В новых ядрах Linux есть крутые штуки вроде пространства имён (namespaces), которые позволяют вытворять сумашедшие вещи вроде собственного сетевого стека. Стефан сваял старый, добрый shell скрипт в 100 строк. Его можно взять с помощью git – git clone git://github.com/stgraber/vpn-container
А использовать для своих нужд нужно, вызывая скрипт с параметрами:
./start-vpn VPN-NAME CONFIG
У скрипта есть зависимости: socat, openvpn, byobu, lxc и ядро старше 3.13.
Скрипт вызывает socat (SOcket CAT) для проброса VPN TCP socket в UNIX socket. Создаются необходимые пространства имён: user namespace, network namespace, mount namespace и uts namespace. Ваш аккаунт будет root'ом в этих пространствах имён и можно запускать openvpn, создавать сетевые интерфейсы и маршруты.
При запуске скрипта вы должны увидеть что-то подобное:
stgraber@dakara:~/vpn$ ./start-vpn stgraber.net ../stgraber-vpn/stgraber.conf WARN: could not reopen tty: No such file or directory lxc: call to cgmanager_move_pid_abs_sync(name=systemd) failed: invalid request Fri Sep 26 17:48:07 2014 OpenVPN 2.3.2 x86_64-pc-linux-gnu [SSL (OpenSSL)] [LZO] [EPOLL] [PKCS11] [eurephia] [MH] [IPv6] built on Feb 4 2014 Fri Sep 26 17:48:07 2014 WARNING: No server certificate verification method has been enabled. See openvpn.net/howto.html#mitm for more info. Fri Sep 26 17:48:07 2014 NOTE: the current –script-security setting may allow this configuration to call user-defined scripts Fri Sep 26 17:48:07 2014 Attempting to establish TCP connection with [AF_INET]127.0.0.1:1194 [nonblock] Fri Sep 26 17:48:07 2014 TCP connection established with [AF_INET]127.0.0.1:1194 Fri Sep 26 17:48:07 2014 TCPv4_CLIENT link local: [undef] Fri Sep 26 17:48:07 2014 TCPv4_CLIENT link remote: [AF_INET]127.0.0.1:1194 Fri Sep 26 17:48:09 2014 [vorash.stgraber.org] Peer Connection Initiated with [AF_INET]127.0.0.1:1194 Fri Sep 26 17:48:12 2014 TUN/TAP device tun0 opened Fri Sep 26 17:48:12 2014 Note: Cannot set tx queue length on tun0: Operation not permitted (errno=1) Fri Sep 26 17:48:12 2014 do_ifconfig, tt->ipv6=1, tt->did_ifconfig_ipv6_setup=1 Fri Sep 26 17:48:12 2014 /sbin/ip link set dev tun0 up mtu 1500 Fri Sep 26 17:48:12 2014 /sbin/ip addr add dev tun0 172.16.35.50/24 broadcast 172.16.35.255 Fri Sep 26 17:48:12 2014 /sbin/ip -6 addr add 2001:470:b368:1035::50/64 dev tun0 Fri Sep 26 17:48:12 2014 /etc/openvpn/update-resolv-conf tun0 1500 1544 172.16.35.50 255.255.255.0 init dhcp-option DNS 172.16.20.30 dhcp-option DNS 172.16.20.31 dhcp-option DNS 2001:470:b368:1020:216:3eff:fe24:5827 dhcp-option DNS nameserver dhcp-option DOMAIN stgraber.net Fri Sep 26 17:48:12 2014 add_route_ipv6(2607:f2c0:f00f:2700::/56 -> 2001:470:b368:1035::1 metric -1) dev tun0 Fri Sep 26 17:48:12 2014 add_route_ipv6(2001:470:714b::/48 -> 2001:470:b368:1035::1 metric -1) dev tun0 Fri Sep 26 17:48:12 2014 add_route_ipv6(2001:470:b368::/48 -> 2001:470:b368:1035::1 metric -1) dev tun0 Fri Sep 26 17:48:12 2014 add_route_ipv6(2001:470:b511::/48 -> 2001:470:b368:1035::1 metric -1) dev tun0 Fri Sep 26 17:48:12 2014 add_route_ipv6(2001:470:b512::/48 -> 2001:470:b368:1035::1 metric -1) dev tun0 Fri Sep 26 17:48:12 2014 Initialization Sequence Completed To attach to this VPN, use: byobu -S /home/stgraber/vpn/stgraber.net.byobu To kill this VPN, do: byobu -S /home/stgraber/vpn/stgraber.net.byobu kill-server or from inside byobu: byobu kill-server
Не пугайтесь того, что вы root внутри созданного пространства! “Внутренний” root сопоставляется с uid и gid вашей учётной записи. Другими словами, это вы и есть, только с другим именем и полными правами в контейнере.
Теперь можно использовать VPN без каких-либо конфликтов и без перекрытий адресных пространств компьютера-клиента-VPN с одновременным подсоединением ко множеству VPN серверов. Вы можете быть абсолютно уверены в безопасности – нет никакой возможности другой учётной записи вашего компьютера-клиента-VPN получить доступ к созданным пространствам имён для соединения с конкретным VPN сервером.
Связанные одной цепью:
Цикл статей LXC 1.0. Оглавление.
Графические программы внутри контейнера или делаем свой Qubes
LXC 1.0: Безопасность.
Создание VPN соединения в Ubuntu.
Elastix4onCentos7vz
Монтирование каталогов хост-системы в LXC контейнер
Setting up a OpenVPN server
Sysadmin Cookbook
Настройка OpenVPN (шпаргалка)
Sentinel HASP LDK Ubuntu, DEB Run-time Installer
mount -t usbfs none /proc/bus/usb
How to use convert an KVM image into a LXC container
Secure OpenVPN Server on
LXC для разработчика
USB passthrough to lxc #29
USB Passthrough with LXC
How to connect a /dev USB modem in an LXC container?
[SOLVED] usb device access from lxc container Созадать контейнер: !!!# lxc-create -t ubuntu -n precise_lxc — -r precise -a amd64 # lxc-create -t ubuntu -n trusty_lxc — -r trusty -a amd64 !## !# The default user is 'ubuntu' with password 'ubuntu'! !# Use the 'sudo' command to run tasks as root in the container. !## Сохранение контейнера trusty_lxc : # cd /var/lib/lxc/
# tar -cvzf trusty_lxc.tar.gz ./trusty_lxc
Клонировать контейнер # lxc-clone -o trusty_lxc -n hasp_lxc # nano /var/lib/lxc/hasp_lxc/rootfs/etc/hosts 127.0.0.1 localhost 127.0.0.1 hasp_lxc Сохранить. Старт контейнера # lxc-start -n hasp_lxc -d Посмотреть ip # lxc-ls -f Зайти по ssh # ssh ubuntu@192.168.0.
69 $ sudo -i # apt-get update # apt-get upgrade # apt-get install mc samba nano wget Настроим ipv6 # nano /etc/sysctl.conf В конец файла: net.ipv6.conf.all.disable_ipv6 = 1 net.ipv6.conf.default.disable_ipv6 = 1 net.ipv6.conf.lo.disable_ipv6 = 1 Сохранить.
# sysctl -p Проверка: # cat /proc/sys/net/ipv6/conf/all/disable_ipv6 # poweroff Сохранение контейнера hasp_lxc : # cd /var/lib/lxc/
# tar -cvzf hasp_lxc.tar.gz ./hasp_lxc
На хосте: # lsusb root@i7:/var/lib/lxc# lsusb Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub Bus 001 Device 004: ID 0529:0001 Aladdin Knowledge Systems HASP copy protection dongle Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.
0 root hub (лицензия 1с) # ls -la /dev/bus/usb/004/001 root@i7:/dev/bus/usb# ls -la /dev/bus/usb/001/004 crw-rw-r– 1 root root 189, 3 апр 10 16:16 /dev/bus/usb/001/004 Поправим конфиг: # nano /var/lib/lxc/hasp_lxc/config lxc.mount.entry = /dev/bus/usb/001/004 /dev/bus/usb/001/004 none bind,optional,create=dir # hasp lxc.cgroup.devices.allow = c 189:* rwm Сохранить.
Старт контейнера # lxc-start -n hasp_lxc -d Просмотр: # lxc-ls -f
[SOLVED] usb device access from lxc container
Подключимся: # ssh ubuntu@hasp_lxc $ sudo -i # apt-get install usbutils # lsusb root@hasp_lxc:/dev# lsusb unable to initialize libusb: -99 # mkdir -p /dev/bus/usb/002/001 # lsusb root@hasp_lxc:/dev# lsusb Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.
0 root hub Bus 001 Device 002: ID 0529:0001 Aladdin Knowledge Systems HASP copy protection dongle Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub ————————————————————————————————– Для работы файловой версии нужно установить hasp Берем здесь: ftp://updates.etersoft.
ru/pub/Etersoft/HASP/stable/x86_64/Ubuntu/12.04/ # mkdir /home/ubuntu/hasp_64 # cd /home/ubuntu/hasp_64 !!!# wget -c ftp://updates.etersoft.ru/pub/Etersoft/HASP/stable/x86_64/Ubuntu/12.04/haspd-modules_7.40-eter10ubuntu_amd64.deb # wget -c ftp://updates.etersoft.ru/pub/Etersoft/HASP/stable/x86_64/Ubuntu/14.04/haspd-modules_7.40-eter10ubuntu_amd64.deb !!!# wget -c ftp://updates.
etersoft.ru/pub/Etersoft/HASP/stable/x86_64/Ubuntu/12.04/haspd_7.40-eter10ubuntu_amd64.deb # wget -c ftp://updates.etersoft.ru/pub/Etersoft/HASP/stable/x86_64/Ubuntu/14.04/haspd_7.40-eter10ubuntu_amd64.
deb # dpkg -i haspd_* # apt-get -f install Проверяем работу модуля и подключить, а также выключить и включить, передернуть по питанию # service haspd restart root@hasp_lxc:/home/ubuntu/hasp_64# service haspd restart Stopping hasplmd… [PASSED] Stopping hasplm…
[PASSED] Stopping winehasp… [PASSED] Stopping aksusbd… [PASSED] Stopping skeyd… [PASSED] Stopping usbsentinel…
[PASSED] Stopping SntlKeysSrvrlnx… [PASSED] Unloading HASP LPT kernel module… [PASSED] Loading HASP LPT kernel module… modprobe: ERROR: ../libkmod/libkmod.c:556 kmod_search_moddep() could not open moddep file '/lib/modules/4.8.
0-46-generic/modules.dep.bin' (/dev/lp0 device has not found) [PASSED] Check kernel for CONFIG_USB_DEVICEFS… [PASSED] Enable workaround for /proc/bus/usb (bind from /dev/bus/usb) [ DONE ] ln: не удалось создать символьную ссылку «/proc/bus/usb/devices»: Отказано в доступе Running aksusbd…
[ DONE ] Running winehasp… [ DONE ] Running hasplm… [ DONE ] Running hasplmd…
[ DONE ] # ln –symbolic /proc/bus/usb /dev/bus/usb # service haspd restartroot@hasp_lxc:/home/ubuntu/hasp_64# service haspd restart
Stopping hasplmd… . [ DONE ]
Stopping hasplm… [ DONE ]
Stopping winehasp… [ DONE ]
Stopping aksusbd… [ DONE ]
Stopping skeyd… [PASSED]
Stopping usbsentinel…
[PASSED]
Stopping SntlKeysSrvrlnx… [PASSED]
Unloading HASP LPT kernel module… [PASSED]
Loading HASP LPT kernel module… modprobe: ERROR: ../libkmod/libkmod.c:556 kmod_search_moddep() could not open moddep file '/lib/modules/4.8.0-46-generic/modules.dep.bin' (/dev/lp0 device has not found) [PASSED]
Check kernel for CONFIG_USB_DEVICEFS… [ DONE ]
Mounting usbdevfs to /proc/bus/usb (it can be insecure)… mount: неизвестный тип файловой системы 'usbfs' [FAILED] [ DONE ]
Running aksusbd… [ DONE ]
Running winehasp… [ DONE ]
Running hasplm… [ DONE ]
Running hasplmd… [ DONE ]
# poweroff # lxc-ls -f
Удалить контейнер:# rm -R /var/lib/lxc/hasp_lxc
Восстановление контейнера: # cd /var/lib/lxc
# tar xvzf /var/lib/lxc/hasp_lxc.tar.gz
На хосте: # lsusb root@i7:/var/lib/lxc# lsusb Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub Bus 001 Device 002: ID 0529:0001 Aladdin Knowledge Systems HASP copy protection dongle Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.
0 root hub (лицензия 1с) # ls -la /dev/bus/usb/002/001 root@i7:/var/lib/lxc# ls -la /dev/bus/usb/002/001 crw-rw-r– 1 root root 189, 128 апр 10 10:24 /dev/bus/usb/002/001 Поправим конфиг: # nano /var/lib/lxc/hasp_lxc/config lxc.mount.entry = /dev/bus/usb/001 dev/bus/usb/001 none bind, optional, create=dir # hasp lxc.cgroup.devices.
allow = c 189:* rwm Сохранить.
!!!# nano /var/lib/lxc/hasp_lxc/rootfs/etc/rc.local
!!!mkdir -p /dev/bus/usb/001 || true
Сохранить. Старт контейнера # lxc-start -n hasp_lxc -d Просмотр: # lxc-ls -f
[SOLVED] usb device access from lxc container
Подключимся: # ssh ubuntu@hasp_lxc $ sudo -i # apt-get install usbutils # lsusb root@hasp_lxc:/dev# lsusb unable to initialize libusb: -99 !!!# mkdir -p /dev/bus/usb/002/001 # mkdir -p /dev/bus/usb/002 # lsusb # ls -la /dev/bus/usb/001 root@hasp_lxc:/dev# lsusb Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub Bus 001 Device 002: ID 0529:0001 Aladdin Knowledge Systems HASP copy protection dongle Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub Попробуем другие дрова: # mkdir /home/ubuntu/hasp # cd /home/ubuntu/hasp # wget ftp://ftp.cis-app.com/pub/hasp/Sentinel_HASP/Runtime_(Drivers)/7.54/Sentinel_LDK_Ubuntu_DEB_Run-time_Installer.tar.gz # dpkg –add-architecture i386 # apt-get update # apt-get install libc6:i386 # dpkg -i –force-architecture aksusbd_7.54-1_i386.deb # apt-get -f install # service aksusbd restart # /etc/init.d/aksusbd status
Настройка драйвера HASP ключа
root@hasp_lxc:/home/ubuntu/hasp# /etc/init.d/aksusbd status AKSUSB is running. WINEHASP is running. HASPLM is running. # netstat -anp | grep hasp root@hasp_lxc:/home/ubuntu/hasp# netstat -anp | grep hasp tcp 0 0 0.0.0.0:1947 0.0.0.0:* LISTEN 2107/hasplmd udp 0 0 0.0.0.0:1947 0.0.0.0:* 2107/hasplmd udp 0 0 127.0.0.1:2790 0.0.0.0:* 2105/winehasp udp 0 0 0.0.0.0:52336 0.0.0.0:* 2107/hasplmd unix 2 [ ] DGRAM 52486 2107/hasplmd unix 3 [ ] STREAM CONNECTED 49597 2107/hasplmd unix 2 [ ] DGRAM 47877 2105/winehasp # /etc/init.d/aksusbd restartБраузер подключаем через прокси SOCKS5 127.0.0.1:1080 .
Настройка LXC окружения на домашнем компьютере с ОС Ubuntu 11.10 Статья тестовая, незавершенная, исключительно для сохранения опыта. LXC – LinuX Containers. Контейнеры Linux – технология виртуализации программного обеспечения на уровне операционной системы.
Контейнеры Linux поддерживаются на уровне ядра. Преимущества контейнерной технологии lxc для меня лично. 1. Не требуется поддержка виртуализации vt-x процессором. Intel Celeron 420 ее не поддерживает. 2. Легко устанавливается из репозиториев ubuntu. 3.
Легко формируется минимальный сервер ubuntu в контейнере. 4. Работает 5. В силу особенностей технологии, унифицирует программное окружение контейнеров и хост-системы. Условно говоря – “везде ubuntu”. 6. Присутствуют решаемые трудности.
Что получиться в результате настройки
1. Будет установлена на хост-системе (домашнем компьютере) инфраструктура lxc 2. Будет создан контейнер с минимальной версией ubuntu 11.10. 3. Проведена локализация и первоначальная настройка контейнера. 4. Управление контейнером будет осуществляться стандартными средствами lxc и ОС.
Установка поддержки инфраструктуры LXC в хост-системе Ubuntu 11.10
$ sudo apt-get update $ sudo apt-get install lxc Установка сопутствующих пакетов в хост-системе Комплект утилит для управления мостовыми(bridge) соединениями. Дело в том, что сетевое подключение контейнера к локальной сети и интернет, выполняется через сетевой мост. $ sudo apt-get install bridge-utils Операции с контейнерами выполняются в пользовательском окружении root хост-системы. Перейти в пользовательское окружении суперпользователя root $ sudo -s
Создание контейнера, команда lxc-create
Создание контейнера с выбранным именем syncserver, на основе встроенного шаблона ubuntu 11.10 $ sudo lxc-create -n syncserver -t ubuntu Более правильно, вначале создать файл конфигурации, а потом на его основе создать контейнер. Это часто используется для копирования настроек сети в конфигурационный файл контейнера.
Конфигурационный файл config, относящийся к создаваемому контейнеру, создается в папке /var/lib/lxc/syncserver/ Корневая файловая система контейнера создается в папке /var/lib/lxc/syncserver/rootfs Производится загрузка пакетов минимальной версии Ubuntu 11.10 (или текущей версии) и сохранение ее в кэше, дополнительно в хост-систему установился пакет lxcguest.
Были какие-то трудности с локализацией. Возможно мелкая трудность, решится, с помощью генерации “C” локали.В некоторых системах, исправляется следующим образом: $ sudo locale-gen ru_RU.UTF-8 $ sudo dpkg-reconfigure locales и еще $ export LC_ALL=ru_RU.UTF-8 Также можно отредактировать /etc/default/locale и внести строку вида LC_ALL=ru_RU.
UTF-8 это можно сделать перед генерацией сервера.
Настройка сети контейнера
Прописать в файл конфигурации контейнера следующее, для статического ipv4-адреса: # Настройка сети lxc.network.type = veth lxc.network.flags = up lxc.network.link = br0 lxc.network.ipv4 = 192.168.100.2/24 192.168.100.
255
Опционально.
Удаление контейнера, команда lxc-destroy Если какие-то настройки неудачны, то можно удалить созданный контейнер $ lxc-destroy -n syncserver
Первая правка конфигурации контейнера для подключение к локальной сети
Выбор способа сетевого подключения. Настройка локальной сети контейнеров, самая сложная часть в данном изложении.
Мостовое подключение, при наличии собственной внутренней домашней локальной сети за роутером, позволяет обращаться к контейнеру как обычному компьютеру, с любых домашних компьютеров. Этот вариант нам подходит, т.к.
позволит обеспечить синхронизацию контактов между всеми домашними компьютерами и телефонами, подключенными к домашней сети, без выхода в интернет.
Роутер раздает IP-адреса из диапазона “серых” адресов и обеспечивает выход в Интернет посредством трансляции адресов на роутере (NAT gateway).
Вариант с трансляцией ip-адресов (NAT) непосредственно на хост-системе (домашнем компьютере) дает иные возможности, но ограничивает доступ к контейнеру из локальной сети, позволяя обращаться к нему только с хост-системы.
Вариант, когда нет домашней локальной сети, а компьютер напрямую подключен к локальной сети провайдера и к сети Интернет через VPN – мой временный вариант.
Итак, настройка вариантов.
Вариант – через мост. Настройка мостового соединения
Сборка моста – создание интерфейса моста br0 (иное название допустимо)
$ sudo brctl addbr br0
Вариант – через NAT на хост-системе. Ручная настройка в режиме пошагового тестирования и проверки Определим что контейнере будут располагаться в отдельном сегменте, 192.168.100.
xxx: На хост-системе выполняем: Сборка моста – создание интерфейса моста br0 (иное название допустимо) $ sudo brctl addbr br0 Присвоение “серого” статического IPv4 адреса, мосту, он будет как-бы шлюзом, для наших контейнеров: $ sudo ifconfig br0 192.168.100.1 netmask 255.255.255.
0 promisc up Включение NAT Выполнить sudo -s , затем echo 1 > /proc/sys/net/ipv4/ip_forward $ sudo iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE $iptables -I FORWARD -p tcp –tcp-flags SYN,RST SYN -j TCPMSS –clamp-mss-to-pmtu В контейнере выполняем: $ sudo ifconfig eth0 192.168.100.2 netmask 255.255.255.
0 up если статический адрес не был присвоен ранее, в конфигурационном файле контейнера. смотрим $ sudo ifconfig Выясним доступен ли бридж $ ping 192.168.100.1 Бридж должен быть доступен. На хосте выполняем: $ ping 192.168.100.2 Контейнер должен быть доступен. Добавление в контейнере маршрута по умолчанию $ route add default gw 192.168.100.
1 После этого, при наличии сети Интернет на хост-системе, он будет доступен и в контейнере. Т.е. NAT включен, но до момента выключения контейнера. Чтобы настройки сети сохранились надо сделать следующее. Указать сетевые настройки в конфигурационном файле контейнера.
Отредактировать файл /etc/network/interfaces в корневой файловой системе контейнера, можно изнутри контейнера $ sudo nano /etc/network/interfaces auto eth0 iface eth0 inet static address 192.168.100.2 netmask 255.255.255.0 gateway 192.168.100.1 Чтобы шлюз по-умолчанию добавлялся автоматически, надо что-то сделать. Какой-то баг. может добавить в interfaces # post-up route add default gw 192.168.100.1
Локализация (поддержка русского языка) в консоли контейнера
После появления интернета в контейнере, выполнить обновление репозиториев ubuntu и доустановить локализацию сервера.
$ sudo apt-get update $ sudo apt-get install language-pack-ru-base $sudo nano /etc/default/locale Добавляем строку, если нет: LANG=ru_RU.UTF-8 $ sudo dpkg-reconfigure locales Выходим и входим заново в контейнере.
По идее, перезагружаться не надо. Команда покажет текущие настройки локали: $ locale
Справочно. Перезагрузка lxc-контейнера изнутри
$ sudo shutdown -r nowМой вариант. В моем случае осложняется еще и тем, что интернет передается через VPN, интерфейс ppp0. В общем случае, существует трудности совместимости менеджера сети среды Gnome (Network Manager) и мостовых утилит (bridge-utils)
Частое решение – отключение менеджера сети и управление сетевыми подключениями производить вручную через командную строку.
Еще одно решение – добавить дополнительную сетевую карту. Это позволит “Менеджеру сети ” управлять одной картой, а вторая карта – будет в мосту, для контейнеров. Что обеспечит сервис пользователю.
Можно автоматизировать отключение менеджера сети, поднятие моста и запуск сервера и остановку сервера, разборка моста, отключение моста, включение менеджера сети.
Первый запуск, команда запуска контейнера lxc-start
$ sudo lxc-start -n syncserver
Первоначальная настройка изнутри контейнера
Работа с Linux Containers и установленным внутри них софтом значительно упрощается, если использовать статику в настройках сети.
Существует несколько вариантов настройки статических ip-адресов для LXC-контейнеров — давайте разберемся!
Предложенные варианты тестировались в ОС CentOS 7, но должны успешно работать и в других дистрибутивах Linux.
Считаем, что все предварительные действия по настройке сети для LXC-контейнеров в Debian Jessie, CentOS 7 и Fedora 21 уже выполнены.
Вариант 1. При выключенном LXC-контейнере редактируем конфигурационный файл /var/lib/lxc/{имя_контейнера}/config, добавляя в него следующие строки:
…
lxc.network.ipv4 = 10.0.3.31/24
lxc.network.ipv4.gateway = auto
В конфигурационном файле /var/lib/lxc/{имя_контейнера}/rootfs/etc/sysconfig/network-scripts/ifcfg-eth0 параметр BOOTPROTO изменяем на none, должно получиться примерно следующее:
DEVICE=eth0
BOOTPROTO=none
ONBOOT=yes
HOSTNAME={имя_контейнера}
NM_CONTROLLED=no
TYPE=Ethernet
MTU=
DHCP_HOSTNAME=`hostname`
На хост-компьютере перезапускаем сервисы, обеспечивающие корректную работу сети для LXC-контейнеров:
systemctl restart lxc-net.service
systemctl restart lxc-dhcp.service
systemctl restart iptables
Далее можно запускать контейнер командой lxc-start -n {имя_контейнера} -d.
Вариант 2. На хост-компьютере открываем на редактирование конфигурационный файл /etc/lxc/dnsmasq.conf и добавляем в него необходимые строки (по одной для каждого LXC-контейнера, который вы хотите запустить) в следующем формате:
dhcp-host={имя_контейнера_1},10.0.3.21
dhcp-host={имя_контейнера_2},10.0.3.22
dhcp-host={имя_контейнера_3},10.0.3.31
Убедимся, что в настройках юнита lxc-dhcp.service присутствует (а если нет, то добавим) следующая строка –conf-file=/etc/lxc/dnsmasq.conf :
cat /etc/systemd/system/lxc-dhcp.service
[Unit]
Requires=lxc-net.service
Requires=sys-devices-virtual-net-lxcbr0.device
After=sys-devices-virtual-net-lxcbr0.device [Service]
ExecStart=/sbin/dnsmasq –dhcp-leasefile=/var/run/lxc-dnsmasq.leases –user=nobody –group=nobody –keep-in-foreground –conf-file=/etc/lxc/dnsmasq.conf –listen-address=10.0.3.1 –except-interface=lo –bind-interfaces –dhcp-range=10.0.3.2,10.0.3.254 [Install]
WantedBy=default.target
Если в настройки юнита вносились изменения, то необходимо применить их командой:
systemctl daemon-reload
Далее перезапускаем сервисы отвечающие за корректную работу сети LXC-контейнеров:
systemctl restart lxc-net.service
systemctl restart lxc-dhcp.service
systemctl restart iptables
и запускаем контейнеры!
В прошлой статье мы познакомились с настройкой окружения для LXC и создали первые контейнеры.
Продолжаем знакомиться с технологией. Из этой статьи вы узнате
Внутри контейнера может быть запущен процесс, работающий с какими-то портами, которые должны быть доступны из интернета. Например, Telegram-бот или сайт на Node.js. В таком случае необходимо направить трафик с внешнего порта основного сервера на определенный порт контейнера.
Для этого воспользуемся iptables.
iptables -t nat -A PREROUTING -i ens3 -p tcp –dport -j DNAT –to :
В качестве external_port можно выбрать любой свободный порт на основном сервере. Адрес и порт контейнера, куда отправятся запросы, задаем в параметрах host и port. Выбор портов зависит только от ваших задач.
Рассмотрим пару примеров, где можно воспользоваться этой командой.
Для того, чтобы иметь возможность подключаться к контейнеру напрямую по SSH, необходимо перенаправлять запросы с какого-нибудь порта основного сервера на 22 порт этого контейнера.
Создадим правило, по которому все запросы к 1000 порту основного сервера будут направлены на 22 порт container-alice (10.0.1.2).
iptables -t nat -A PREROUTING -i ens3 -p tcp –dport 1000 -j DNAT –to 10.0.1.2:22
Сохраняем параметры iptables
iptables-save > /etc/iptables/rules.v4
Если вы не знакомы с тем, как подключаться к серверу с использованием rsa-ключей, то рекомендуем ознакомиться со статьей «Беспарольный доступ по SSH».
Подключаемся контейнеру, чтобы поместить в него свой публичный ключ
lxc exec container-alice /bin/bash
Добавляем ключ в файл authorized_keys
nano ~/.ssh/authorized_keys
Сохраняем файл, выходим из nano и отключаемся от контейнера.
exit
Теперь можно подключиться напрямую к container-alice из терминала вашего компьютера. Вместо myserver.com подставьте доменное имя или адрес сервера.
ssh root@myserver.com -p 1000
Таким образом можно открывать доступ к конкретным контейнерам для администрирования.
К примеру, нам нужно запустить в контейнере с адресом 10.0.1.2 какой-нибудь процесс, который будет слушать порт 1337. При этом мы хотим сделать так, чтобы к этому процессу шли все запросы, которые идут на порт 1400 основного сервера. Тогда нужно выполнить команду с такими параметрами.
iptables -t nat -A PREROUTING -i ens3 -p tcp –dport 1400 -j DNAT –to 10.0.1.2:1337
Порты могут быть и одинаковые, потому что относятся к разным системам. То есть нам ничего не мешает отправлять запросы с порта 1337 основного сервера на порт 1337 контейнера, чтобы схема роутинга была более очевидной.
Сохраним новые параметры iptables с помощью следующей команды
iptables-save > /etc/iptables/rules.v4
Подключимся по ssh к контейнеру, чтобы запустить процесс в фоне с помощью screen.
ssh root@myserver.com -p 1000
Создаем терминальную сессию, которую можно будет свернуть
screen
При первом запуске screen вы увидите подобное окно. Нажмите пробел или enter.
Откроется терминальная сессия, как если бы вы просто подключились к серверу
Запустим простой python-сервер, который будет показывать содержимое текущей директории.
python3 -m http.server 1337
Теперь можно свернуть эту терминальную сессию, нажав Ctrl+a, d. Процесс будет продолжать работать в фоне.
Открываем в браузере страницу по адресу вашего сервера и указываем порт, например,
Проксирование запросов также можно сделать с помощью nginx, если вам нужно задать адрес сайта с помощью поддомена без указания специфичного порта. Для этого на основном сервере нужно отредактировать nginx-конфиг этого контейнера.
nano /etc/nginx/sites-available/container-alice
Добавим в ещё одну секцию server в конец конфига
server { listen 80; server_name python-alice.myserver.com; include proxy_params; location / { proxy_pass ; } }
Перезагружаем nginx
service nginx restart
Теперь та же страница доступна по адресу
Содержимое директории, где был запущен python-скрипт
Из соображений безопасности стоит сделать невозможным общение контейнеров из разных сетей между собой. Сейчас первый контейнер может пинговать второй и наоборот.
Прописываем ограничения для сети alice-br
iptables -A FORWARD -s 10.0.1.0/24 -i alice-br -o ens3 -j ACCEPT iptables -A FORWARD -i alice-br -j DROP
И для сети bob-br
Здесь приведены основные команды LXC 1.0 – первого, реально стабильного релиза LXC, который будет поддерживаться 5 лет и поставляется в составе Ubuntu 14.04 LTS.
Установка LXC 1.0 осуществляется одной командой
sudo apt-get install lxc
которая подтягивает все необходимые пакеты. После установки можно проверить корректность:
sudo lxc-checkconfig
При правильной установке и корректных параметрах системы должно выдаться что-то типа:
Kernel configuration not found at /proc/config.gz; searching… Kernel configuration found at /boot/config-3.13.0-44-generic — Namespaces — Namespaces: enabled Utsname namespace: enabled Ipc namespace: enabled Pid namespace: enabled User namespace: enabled Network namespace: enabled Multiple /dev/pts instances: enabled— Control groups — Cgroup: enabled Cgroup clone_children flag: enabled Cgroup device: enabled Cgroup sched: enabled Cgroup cpu account: enabled Cgroup memory controller: enabled Cgroup cpuset: enabled— Misc — Veth pair device: enabled Macvlan: enabled Vlan: enabled File capabilities: enabledNote : Before booting a new kernel, you can check its configuration usage : CONFIG=/path/to/config /usr/bin/lxc-checkconfig
Файлы доступных шаблонов находятся в каталоге /usr/share/lxc/templates/.
Контейнеры будут размещаться в /var/lib/lxc/.
Можно создавать контейнеры LXC двух видов – привилегированном, с запуском команд lxc от пользователя root; или непривилегированном, с запуском команд lxc от обычного пользователя.
Непривилегированные контейнеры более ограничены, например они не могут создавать файлы устройств или монтировать файловые системы на блочных устройствах.
Однако они менее опасны для хост-компьютера, так как идентификатору пользователя root контейнера сопоставляется идентификатор обычного пользователя хост-компьютера. Здесь описана работа с привилегированным контейнером.
sudo lxc-create -t -n
например:
sudo lxc-create -t ubuntu -n my_first_lxc
Вместо имени шаблона можно использовать download, тогда будут интерактивно заданы вопросы о том, какой тип корневой файловой системы для контейнера нужно загрузить; в частности, какие требуются дистрибутив, версия и архитектура.
sudo lxc-create -t download -n my_first_lxc
Доступные шаблоны находятся на сайте авторов: https://images.linuxcontainers.org/images/. Остальные параметры можно посмотреть по
sudo lxc-create -h
sudo lxc-start -n
По этой команде запускается контейнер и мы сразу же попадаем в консоль этой системы.
sudo lxc-start -n -d
Запуск контейнера в режиме демона.
sudo lxc-console -n
подключиться к консоли указанного контейнера. Выйти, отключиться от консоли можно комбинацией клавиш ctrl-a q.
lxc-attach
запустить bash в указанном контейнере от root. Выход по exit.
lxc-destroy
удалить контейнер
lxc-stop
остановить контейнер
lxc-ls
показать список контейнеров в системе
lxc-ps
показать список процессов внутри определённого контейнера
lxc-info
показать информацию о заданном контейнере
lxc-freeze
заморозить все процессы указанного контейнера
lxc-unfreeze
разморозить все процессы указанного контейнера
Материал из Tech_support
UPD: в бэкпортах есть LXC v2.X По умолчанию LXC v1.X
В /etc/default/grub изменить параметр
GRUB_CMDLINE_LINUX=”cgroup_enable=memory”
Хотя официально [1] сказано, что делать ничего не надо.
В /etc/sysctl.conf [2]
net.ipv4.ip_forward=1
net.ipv4.conf.all.forwarding=1
net.ipv4.conf.all.proxy_arp=1
grub_updare, reboot
На хост-машине:
apt-get install bridge-utils
Если планируется использовать виртуальные сети, дополнительно:
apt-get install vlan
В /etc/network/interfaces:
#allow-hotplug eth0
#auto eth0
#iface eth0 inet static auto br0
iface br0 inet static address 192.168.150.30 netmask 255.255.255.0 network 192.168.150.0 broadcast 192.168.150.255 gateway 192.168.150.1 dns-nameservers 192.168.150.1 bridge_ports eth0 bridge_fd 0 bridge_maxwait 0
Создаем контейнер [3]
lxc-create -t debian -n nodejs
Сразу меняем пароль root на свой.
старт в режиме консоли (не очень удобно, точнее вообще неудобно) lxc-start -n nodejs или старт в режиме демона и присоединяется к консоли контейнера, для выхода из консоли exit lxc-start -dn nodejs
lxc-attach -n nodejs
Конфигурируем контейнер /var/lib/lxc/nodejs/config. Обязательно обратить внимание на lxc.network.veth.pair [4] – это имя интерфейса в хост машине. Здесь про это не сказано, и работать с сетью сможет только один контейнер.
lxc.rootfs = /var/lib/lxc/nodejs/rootfs
lxc.include = /usr/share/lxc/config/debian.common.conf
lxc.mount = /var/lib/lxc/nodejs/fstab
lxc.utsname = nodejs
lxc.arch = amd64
lxc.autodev = 1
lxc.kmsg = 0 #Количество /dev/tty
lxc.tty = 6 # Autostart
lxc.start.auto = 1
lxc.start.delay = 5
lxc.start.order = 100 # eth0 lxc.network.type = veth
lxc.network.flags = up
lxc.network.link = br0
lxc.network.veth.pair= br0-1
lxc.network.name = eth0
lxc.network.hwaddr = 00:11:12:00:88:99 #mount папка на хост-машине папка в контейнере, относительно хост-машины
#lxc.mount.entry = /home/debs /var/lib/lxc/nodejs/rootfs/home/debs none bind 0 0
Настраиваем сеть не через конфигурацию, а в контейнере (можно и так, и так) /var/lib/lxc/nodejs/rootfs/etc/network/interfaces
# The loopback network interface
auto lo
iface lo inet loopback # The primary network interfac allow-hotplug eth0
auto eth0
iface eth0 inet static address 192.168.150.33 netmask 255.255.255.0 network 192.168.150.0 broadcast 192.168.150.255 gateway 192.168.150.1 dns-nameservers 192.168.150.1
Правим /var/lib/lxc/nodejs/rootfs/etc/apt/sources.list
#deb file:/home/debs /
deb http://mirror.mephi.ru/debian/ jessie main
deb-src http://mirror.mephi.ru/debian/ jessie main deb http://security.debian.org/ jessie/updates main contrib
deb-src http://security.debian.org/ jessie/updates main contrib # jessie-updates, previously known as 'volatile'
deb http://mirror.mephi.ru/debian/ jessie-updates main contrib
deb-src http://mirror.mephi.ru/debian/ jessie-updates main contrib deb http://ftp.ru.debian.org/debian/ jessie main contrib non-free
deb http://http.debian.net/debian jessie-backports main contrib non-free #deb http://www.deb-multimedia.org jessie main non-free
#deb http://www.deb-multimedia.org jessie-backports main
Изначально контейнер пустой (установлено 136 пакетов). Даже ping отсутствует.
apt-get update
apt-get install aptitude apt-utils mc ssh iputils-ping iptables cron wget rsyslog
Если интернета в контейнере не появилось, ping отсутствует, то как вариант можно создать локальный репозитарий, подмонтировать его в контейнер, в sources.list добавить ссылку на него и поставить bind9 и resolvconf.
cd /home/debs
dpkg-scanpackages . /dev/null | gzip -9c > Packages.gz
deb file:/home/debs /
lxc.mount.entry = /home/debs /var/lib/lxc/nodejs/rootfs/home/debs none bind 0 0
lxc-start -dn nodejs
lxc-attach -n nodejs
apt-get update
apt-get install aptitude apt-utils mc ssh iputils-ping iptables cron wget rsyslog resolvconf
apt-get install bind9
exit
lxc-stop -n nodejs
lxc-start -dn nodejs
После этого, при правильном конфигурировании gateway и dns-nameservers все должно заработать
Пример для двух vlan. На хост-машине /etc/network/interfaces:
Możemy tutaj spędzić ferie z dzieckiem na nartach, przemierzająс liczne trasy zjazdowe. wczasy z dziećmi…
Dewi11 Login Sah dan Link Opsi Slots Gacor Terakhir Hari Ini Dewi11 Login Sah serta…
The cost to sponsor La Liga BBVA can vary widely depending on the type and…
After comparing multiple agencies (and honestly trying to figure out who's actually good vs just…
Discovering Your Residence Under the Mediterranean Sun The territory of Cyprus draws newcomers in respects…
Автомобиль на заказ в Краснодаре: удобно, с выгодой и надежно Авто под заказ в Краснодаре…
This website uses cookies.