Настройка bridge-интерфейса LXC в Debian 8 для NAT

Мне периодически нужно поднимать контейнеры на ноутбуке под управлением Debian для развертывания различных приложений “попробовать” перед установкой на сервер. Или отладить какой-нибудь скрипт, который работает по сети. В таких случаях самый удобный вариант - использовать NAT, чтобы контейнер был доступен с хоста, но при этом самому контейнеру был доступен Интернет для установки необходимых пакетов. После установки LXC в Debian 8 “Jessie” бридж-интерфейс автоматически не поднимается, поэтому после установки придется еще кое-что сделать.

Установка пакетов

Поставим необходимые пакеты. Самое необходимое - bridge-utils

apt-get install bridge-utils

Если планируете настраивать DHCP для контейнеров, то необходимо установить также dnsmasq, который будет слушать на бридж-интерфейсе

apt-get install dnsmasq

Теперь настраиваем непосредственно бридж

Настройка

  1. Раскомментируем следующую строчку в /etc/sysctl.conf (если ее там нет, до добавляем)
    net.ipv4.ip_forward=1
    
  2. Записываем в /etc/network/interfaces
    auto lxcnat0
    iface lxcnat0 inet static
     bridge_ports none
     bridge_fd 0
     bridge_maxwait 0
     address 10.0.3.1
     netmask 255.255.255.0
     up iptables -t nat -A POSTROUTING -o wlan0 -j MASQUERADE
    

    Это тот самый бридж, через который мы будем коммуницировать с контейнером. Теперь можно поднять этот бридж-интерфейс. Самый простой вариант:

    service networking restart
    

    Теперь вы можете видеть сетевой интерфейс lxcnat0 в выводе команды ifconfig.

  3. Если нужно включить форвардинг до перезагрузки, выполняем команду
    echo 1 > /proc/sys/net/ipv4/ip_forward
    
  4. Теперь настраиваем сеть самого контейнера. В файле настроек контейнера (в моем случае /var/lib/lxc/debian-webserver/config) указываем
    lxc.network.link = lxcnat0
    lxc.network.ipv4 = 10.0.3.10/24
    lxc.network.ipv4.gateway = 10.0.3.1
    

    Теперь после старта контейнера с хоста он будет доступен по своему адресу 10.0.3.10. Это, как вы понимаете, настройка статического адреса, без использования DHCP. Для настройки DHCP поднимается, например, dnsmasq, который будет слушать на бридж-интерфейсе lxcnat0. В таком случае адреса будут выдаваться автоматически и адрес в настройках контейнера будет выглядеть так:

    lxc.network.ipv4 = 0.0.0.0/24
    

    После старта вы можете проверить, действительно ли контейнер доступен по сети. В первую очередь, проверяем вывод команды “lxc-ls –fancy”

    # lxc-ls --fancy
    NAME              STATE    IPV4       IPV6  AUTOSTART  
    -----------------------------------------------------
    debian-webserver  RUNNING  10.0.3.10  -     NO
    

    И теперь вы можете заходить по ssh и выполнять все необходимые операции по настройке системы. По окончании при необходимости можно сделать перенаправление необходимых портов на интерфейс хоста при помощи iptables.

Licensed under GPL v2

Repo link: https://github.com/mnorin/mnorin.github.io