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 [email protected].
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 .
Источник: 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.
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 [email protected] -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 [email protected] -p 1000
Создаем терминальную сессию, которую можно будет свернуть
screen
При первом запуске screen вы увидите подобное окно. Нажмите пробел или enter.
Откроется терминальная сессия, как если бы вы просто подключились к серверу
Запустим простой python-сервер, который будет показывать содержимое текущей директории.
python3 -m http.server 1337
Теперь можно свернуть эту терминальную сессию, нажав 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