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