29 marca 2015 blog lxc vpn ssh vnc
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
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
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 &
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
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
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 "