29 marca 2015 blog lxc vpn ssh vnc

Jak uruchomić aplikacje z graficznym GUI w przygotowanym konterze w systemie Arch Linux?

Przygotowanie hosta

Instalacja lxc:

pacman -S lxc arch-install-scripts

Konfiguracja bridge network:

brctl addbr br0 && \
    ifconfig br0 10.0.0.1/24 && \
    ifconfig br0

Konfiguracja firewall - oczywiście wlp3s0 zamieniamy na używany interfejs:

iptables -t nat -A POSTROUTING -s 10.0.0.0/24 -o wlp3s0 -j MASQUERADE
sysctl net.ipv4.ip_forward=1 >/dev/null

Utworzenie nowego kontenera

lxc-create -n firefox -t /usr/share/lxc/templates/lxc-archlinux

Konfiguracja znajduje się w /var/lib/lxc/firefox/config, trzeba zmienić lxc.network.type = empty na:

lxc.network.type = veth
lxc.network.link = br0
lxc.network.ipv4 = 10.0.0.105/24
lxc.network.ipv4.gateway = 10.0.0.1
lxc.network.flags = up
lxc.network.name = eth0
lxc.network.mtu = 1500

Ustawienie hasła root:

chroot /var/lib/lxc/firefox/rootfs/
passwd
exit

Start:

lxc-start -n firefox
lxc-attach -n firefox

Instalacja pakietów, np. firefoxa:

pacman -S firefox ttf-dejavu ttf-freefont

Połączenie po SSH

Instalujemy i konfigurujemy demona SSH:

pacman -S openssh

Zmieniamy opcję X11Forwarding w pliku /etc/ssh/sshd_config:

X11Forwarding yes

Uruchomienie demona SSH:

systemctl enable sshd; systemctl start sshd

Połączenie z lokalnej maszyny:

ssh -Y root@10.0.0.105

I możemy odpalić firefoxa:

firefox &

Wersja VNC (opcjonalnie)

Alternatywnie można wykorzystać połączenie VNC.

pacman -S tigervnc lxde
vncserver

Podajemy hasło, zostanie utworzony plik /root/.vnc/xstartup. Edytujemy i zamieniamy twm & na:

/usr/bin/lxsession &

i restartujemy VNC:

vncserver -kill :1; vncserver

Połączenie z lokalnej maszyny:

vncviewer 10.0.0.105:1

VPN (opcjonalnie)

Można skonfigurować połączenie VPN z kontenera. Ważne jest, aby nie zapomnieć załadować modułu jądra na lokalnej maszynie:

modprobe tun

/var/lib/lxc/firefox/config powinien wyglądać tak:

lxc.include = /usr/share/lxc/config/archlinux.common.conf

lxc.network.type = veth
lxc.network.link = br0
lxc.network.ipv4 = 10.0.0.105/24
lxc.network.ipv4.gateway = 10.0.0.1
lxc.network.flags = up
lxc.network.name = eth0
lxc.network.mtu = 1500

lxc.rootfs = /var/lib/lxc/firefox/rootfs
lxc.utsname = firefox
lxc.arch = x86_64

lxc.cgroup.devices.allow = c 10:200 rwm
lxc.hook.autodev = sh -c "modprobe tun; modprobe ipt_MASQUERADE; cd ${LXC_ROOTFS_MOUNT}/dev; mkdir net; mknod net/tun c 10 200; chmod 0666 net/tun"

Ważne są 2 ostatnie (wraz z lxc.hook.autodev) linie oraz ich kolejność. Jeśli umieścimy je w innym miejscu, przy uruchamianiu VPN dostaniemy błędy typu:

ERROR: Cannot open TUN/TAP dev /dev/net/tun: Operation not permitted (errno=1)

Przełączenie do kontenera:

lxc-start -n firefox
lxc-attach -n firefox

Ustawienie wybranych serwerów DNS:

# OpenDNS:
echo -e 'nameserver 208.67.222.222\nnameserver 208.67.220.220' > /etc/resolv.conf

# http://servers.opennicproject.org/
echo -e 'nameserver 185.121.177.177' > /etc/resolv.conf

Potrzebne oprogramowanie:

pacman -S wget unzip openvpn

Na przykładzie darmowej usługi VPNBook:

wget http://www.vpnbook.com/free-openvpn-account/VPNBook.com-OpenVPN-US1.zip
unzip VPNBook.com-OpenVPN-US1.zip
openvpn --config vpnbook-us1-tcp80.ovpn

Aby mieć dostęp do lokalnej sieci z poziomu kontenera:

ip route add 192.168.0.0/16 via 10.0.0.1

All-in-one

# Template used to create this container: /usr/share/lxc/templates/lxc-archlinux
#
# For additional config options, please look at lxc.container.conf(5)

lxc.rootfs = /var/lib/lxc/vpn01/rootfs
lxc.rootfs.backend = dir
lxc.utsname = vpn01
lxc.arch = x86_64
lxc.include = /usr/share/lxc/config/archlinux.common.conf

lxc.network.type = veth
lxc.network.link = br0
lxc.network.ipv4 = 10.0.0.101/24
lxc.network.ipv4.gateway = 10.0.0.1
lxc.network.flags = up
lxc.network.name = eth0
lxc.network.mtu = 1500

lxc.mount.entry=/data/Downloads /var/lib/lxc/ib/vpn01/root/Downloads none bind 0 0

lxc.cgroup.devices.allow = c 10:200 rwm
lxc.hook.autodev = sh -c "modprobe tun; cd ${LXC_ROOTFS_MOUNT}/dev; mkdir net; mknod net/tun c 10 200; chmod 0666 net/tun"
lxc.hook.pre-start = sh -c "ip addr show br0 || ( brctl addbr br0 && ifconfig br0 10.0.0.1/24 && echo br0\ created ); iptables -t nat -A POSTROUTING -s 10.0.0.101/32 -o eth0 -j MASQUERADE; iptables -A PREROUTING -i br0 -t mangle -j MARK --set-mark 178; ip -4 rule add fwmark 178 table main"
lxc.hook.post-stop = sh -c "iptables -t nat -D POSTROUTING -s 10.0.0.101/32 -o eth0 -j MASQUERADE; iptables -D PREROUTING -i br0 -t mangle -j MARK --set-mark 178; ip -4 rule del fwmark 178 table main"

Linki