Авторские статьи

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.

Дата последней правки: 2014-11-12 09:41:33

RSS vasilisc.com   


Разделы

Главная
Новости
Ворох бумаг
Видео Linux
Игры в Linux
Безопасность
Статьи об Astra Linux
Статьи о FreeBSD
Статьи об Ubuntu
Статьи о Snappy
Статьи об Ubuntu Phone
Статьи о Kubuntu
Статьи о Xubuntu
Статьи о Lubuntu
Статьи об Open Source
Карта сайта