LXC, Bridge, Dnsmasq, Iptables en Vagrant
5 March, 2021 by
LXC, Bridge, Dnsmasq, Iptables en Vagrant
Administrator
| No comments yet

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.

Sign in to leave a comment