Intro
Ik ben laatst overgestapt van ubuntu naar debian jessie. Daar wil de ik ook lxc gebruiken met vagrant, echter merkte ik dat het netwerk gedeelte het niet deed.
De container kreeg geen ip adres en toen dat eindelijk werkte, kon ik geen paketten ophalen omdat ik een “can not resolv” dns error kreeg.
Na 1 week aan het zoeken, lezen en uitproberen zat de de duvel in de details. Mijn opzet is als volgt:
- lxc
- bridge-utils
- iptables
- dnsmasq
- vagrant
De opzet maakt gebruik van nat.
Opzetten van de bridge:
Wat me opviel bij lxc was dat er geen lxcbr0 bridge was, wat bij ubuntu wel het geval is. Deze wordt door ubuntu opgezet door een script lxc-net, maar die is er niet bij debian aangezien het een wrapper script is. Voor zover ik heb begrepen heb je een bridge nodig, omdat je eth0 van je host niet kan gebruiken, want deze zit in een andere namespace en er kan maar 1 namespace per nic gebruikt worden. Ik neem aan dat het voor beveiligingsdoeleinden zo is ingesteld. Het opzetten van de bridge heb ik gedaan via een systemd service. Systemd is de defacto standaard op debian jessie en nu ook in ubuntu 15.04.
Systemd instellingen
De service staat bij mij in:
/etc/systemd/system en heet lxc-net.service
en heeft volgende inhoud
[Unit]
Description=Bridge interface for LXC Containers
[Service]
Type=oneshot
# Bring up bridge interface
ExecStart=/sbin/brctl addbr lxcbr0
ExecStart=/sbin/ip address add 10.0.3.1/24 dev lxcbr0
ExecStart=/sbin/ip link set lxcbr0 up
RemainAfterExit=yes
# Bring bridge interface down
ExecStop=/sbin/ip link set lxcbr0 down
ExecStop=/sbin/brctl delbr lxcbr0
[Install]
WantedBy=multi-user.target
Daarnaast gebruik ik dnsmasq om te zorgen dat de container via dhcp een ip adres krijgt en dat dns verzoeken worden afgehandeld.
Bestand /etc/systemd/system/lxc-dhcp.service met inhoud
[Unit]
Description=Dnsmasq for LXC
Requires=lxc-net.service
Requires=sys-devices-virtual-net-lxcbr0.device
After=sys-devices-virtual-net-lxcbr0.device
After=lxc-net.service
[Service]
ExecStart=/usr/sbin/dnsmasq \
–dhcp-leasefile=/var/run/lxc-dnsmasq.leases \
–user=dnsmasq \
–keep-in-foreground \
–listen-address=10.0.3.1 \
–strict-order \
–except-interface=lxcbr0 \
–bind-interfaces \
–log-dhcp \
–log-queries \
–dhcp-range=10.0.3.2,10.0.3.254,4h
[Install]
WantedBy=multi-user.target
Daarna enable je de boel
#systemctl enable lxc-net.service
#systemctl enable lxc-dhcp.service
Ik heb de dnsmasq.service uitgeschakeld aangezien het conflicten kan geven met de instellingen voor dnsmasq in lxc-dhcp.service.
#systemctl disable dnsmasq.service
Met enable geef je aan, dat de service de volgende keer bij het booten weer moet worden gestart. Om de service handmatig te starten:
#systemctl start lxc-net.service
#systemctl start lxc-dhcp.service
Met ifconfig checken of je lxcbr0 hebt en dan een lxc container aanmaken met vagrant (vagrant-lxc plugin).
Iptables
Vagrant even laten rammelen en ….. potverdikkeme een error. Iets met netwerk, grrrr. Dan maar even handmatig in de container inloggen
#lxc-attach -n naam van container
Hmmm, ifconfig…. en geen ip adres. Hoe kan dat nou? Blijkt dat de firewall een stokje steekt voor dhcp request. Dhcp draait op poort 67 en die moet je vrijgeven.
#!/bin/bash
iptables -I INPUT -i lxcbr0 -p udp –dport 67 -j ACCEPT
iptables -I INPUT -i lxcbr0 -p tcp –dport 67 -j ACCEPT
iptables -I INPUT -i lxcbr0 -p tcp –dport 53 -j ACCEPT
iptables -I INPUT -i lxcbr0 -p udp –dport 53 -j ACCEPT
iptables -I FORWARD -i lxcbr0 -j ACCEPT
iptables -I FORWARD -o lxcbr0 -j ACCEPT
iptables -t nat -A POSTROUTING -s 10.0.3.0/24 ! -d 10.0.3.0/24 -j MASQUERADE
iptables -t mangle -A POSTROUTING -o lxcbr0 -p udp -m udp –dport 68 -j CHECKSUM –checksum-fill
Aangezien ik nat gebruik, komen er nog wat regels bij.
Waar ik de hele tijd tegen aan liep was dat ik inmiddels wel een ip adres kreeg, maar dat apt-get update nog steeds een resolve error gaf.
Zoals gezegd zit de duvel in de details en de mijne was –strict-orderin lxc-dhcp.service. Toen ik die erin had gezet ging het goed. Met deze instructie geef je aan dat er in een bepaalde volgorde gezocht moet worden om een adres naar ip adres te resolven en niet de eerste de beste server maar nemen.