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 download -- --dist archlinux --release current --arch amd64

Konfiguracja znajduje się w /var/lib/lxc/firefox/config:

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

Ustawienie hasła root:

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

Start:

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

Jeśli po wystartowaniu kontenera nie otrzyma on adresu IP, należy stworzyć plik /etc/systemd/network/eth0.network (przykład niżej).

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. Dzięki temu każdy kontener może być połączony niezależnie z innym serwerem VPN. Ważne jest, aby nie zapomnieć załadować modułów na lokalnej maszynie:

modprobe br_netfilter; modprobe tun

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

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

lxc.net.0.type = veth
lxc.net.0.link = br0
lxc.net.0.flags = up
lxc.net.0.name = eth0
lxc.net.0.mtu = 1500

lxc.rootfs = /var/lib/lxc/firefox/rootfs
lxc.uts.name = firefox
lxc.arch = x86_64

lxc.cgroup.devices.allow = c 10:200 rwm
lxc.hook.autodev = sh -c "modprobe br_netfilter; 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 sieci w kontenerze, plik /etc/systemd/network/eth0.network:

[Match]
Name=eth0

[Network]
Address=10.0.0.105/24
Gateway=10.0.0.1
DNS=208.67.222.222

i restartujemy systemctl restart systemd-networkd.

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

lxc.rootfs = /var/lib/lxc/vpn01/rootfs
lxc.uts.name = vpn01
lxc.arch = x86_64
lxc.include = /usr/share/lxc/config/common.conf

lxc.net.0.type = veth
lxc.net.0.link = br0
lxc.net.0.flags = up
lxc.net.0.name = eth0
lxc.net.0.mtu = 1500

lxc.mount.entry=/data/Downloads /var/lib/lxc/vpn01/rootfs/root/Downloads none bind 0 0
lxc.mount.entry=/var/cache/pacman/pkg /var/lib/lxc/vpn01/rootfs/var/cache/pacman/pkg none bind 0 0

lxc.cgroup.devices.allow = c 10:200 rwm
lxc.hook.autodev = sh -c "modprobe br_netfilter; 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 ; iptables -I FORWARD -s 10.0.0.0/24 -o eth0 -j ACCEPT ; iptables -I FORWARD -d 10.0.0.0/24 -o br0 -j ACCEPT "
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 ; iptables -D FORWARD -s 10.0.0.0/24 -o eth0 -j ACCEPT ; iptables -D FORWARD -d 10.0.0.0/24 -o br0 -j ACCEPT "

Linki