Настройка openvpn в lxc контейнере

VPN в контейнере

Стефан Грабер (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.

Источник: http://vasilisc.com/lxc-vpn-containers

Проброс hasp в lxc

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…

Читайте также:  Zabbix: init_cpu_collector(): cannot make counterpath

                                                      [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 .  

Источник: http://renbuar.blogspot.com/2017/03/lxc_29.html

Настройка LXC окружения на домашнем компьютере

Настройка 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.

Читайте также:  Мониторинг web сайта в zabbix

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

Первоначальная настройка изнутри контейнера

Источник: http://gimmor.blogspot.com/2012/03/lxc.html

Настройка статических ip-адресов для LXC-контейнеров в CentOS 7

Работа с 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

и запускаем контейнеры!

Источник: https://letsclearitup.com.ua/lxc/nastroyka-staticheskih-ip-adresov-dlya-lxc-konteynerov-v-centos-7.html

Маршрутизация LXC и доступ к контейнерам по SSH

В прошлой статье мы познакомились с настройкой окружения для LXC и создали первые контейнеры.

Продолжаем знакомиться с технологией. Из этой статьи вы узнате

  • как перенаправлять трафик на определенные порты
  • как настроить SSH-доступ к контейнерам
  • как можно запретить контейнерам из разных сетей общаться друг с другом

Перенаправляем запросы с порта на порт

Внутри контейнера может быть запущен процесс, работающий с какими-то портами, которые должны быть доступны из интернета. Например, Telegram-бот или сайт на Node.js. В таком случае необходимо направить трафик с внешнего порта основного сервера на определенный порт контейнера. 

Для этого воспользуемся iptables.

iptables -t nat -A PREROUTING -i ens3 -p tcp —dport -j DNAT —to :

В качестве external_port можно выбрать любой свободный порт на основном сервере. Адрес и порт контейнера, куда отправятся запросы, задаем в параметрах host и port. Выбор портов зависит только от ваших задач. 

Рассмотрим пару примеров, где можно воспользоваться этой командой. 

Настройка SSH-доступа

Для того, чтобы иметь возможность подключаться к контейнеру напрямую по 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

Читайте также:  Установка gitlab в lxc контейнер

Теперь можно свернуть эту терминальную сессию, нажав Ctrl+a, d. Процесс будет продолжать работать в фоне.

Открываем в браузере страницу по адресу вашего сервера и указываем порт, например, http://myserver.com:1400

Проксирование запросов также можно сделать с помощью 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 http://10.0.1.2:1337/; } }

Перезагружаем nginx

service nginx restart

Теперь та же страница доступна по адресу http://python-alice.myserver.com

Содержимое директории, где был запущен 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

Источник: https://ifmo.su/lxc-routing

LXC – шпаргалка по командам (утилитам)

Здесь приведены основные команды LXC 1.0 – первого, реально стабильного релиза LXC, который будет поддерживаться 5 лет и поставляется в составе Ubuntu 14.04 LTS.

Установка LXC

Установка 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

Запуск контейнера lxc

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
разморозить все процессы указанного контейнера

Источник: https://www.oslogic.ru/knowledge/560/lxc-shpargalka-po-komandam-utilitam/

LXC debian 8

Материал из Tech_support

Источник

UPD: в бэкпортах есть LXC v2.X По умолчанию LXC v1.X

Настройка GRUB для LXC

В /etc/default/grub изменить параметр

GRUB_CMDLINE_LINUX=»cgroup_enable=memory»

Хотя официально [1] сказано, что делать ничего не надо.

Настройка ядра для LXC

В /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

Настройка сети для LXC

На хост-машине:

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

Настройка параметров сети внутри LXC контейнера

Настраиваем сеть не через конфигурацию, а в контейнере (можно и так, и так) /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

Если нет сети в LXC контейнере

Если интернета в контейнере не появилось, ping отсутствует, то как вариант можно создать локальный репозитарий, подмонтировать его в контейнер, в sources.list добавить ссылку на него и поставить bind9 и resolvconf.

  • качаем один или все три установочные диска с сайта
  • создаем папку на хост-машине /home/debs
  • из каталога pool каждого диска копируем в /home/debs каталоги main и contrib
  • создаем индекс репозитория

cd /home/debs
dpkg-scanpackages . /dev/null | gzip -9c > Packages.gz

  • В sources.list контейнера добавить первой строкой (остальные #)

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 для LXC

Пример для двух vlan. На хост-машине /etc/network/interfaces:

Источник: http://support.qbpro.ru/index.php?title=LXC_debian_8

Ссылка на основную публикацию