Я использую Docker для управления контейнерами LXC. В настоящий момент Docker настраивает базовый контейнер LXC с маршрутизацией только на хост, а затем использует iptables/DNAT для пробивания дырок в контейнере, делая его доступным через IP-адрес хоста и "случайный" порт.
Это не будет работать для нас по ряду причин. Мы бы хотели, чтобы каждый контейнер был доступен через свой собственный (маршрутизируемый) IP. Так что я играл с использованием таблиц IP для этого. У меня он отлично работает дома (работает на Ubuntu Raring), но не на работе (работает на Ubuntu Precise). Я предполагаю, что есть какая-то конфигурация ядра по умолчанию, которая мне не известна.
Вот что я делаю:
1) Настройка нового виртуального интерфейса macvlan, чтобы я мог использовать DHCP для получения IP:
ip link add container1 link eth0 type macvlan
dhclient container1
ip link set container1 up
На данный момент у меня есть новый интерфейс с собственным IP-адресом и шлюзом по умолчанию, маской подсети и т.д., Соответствующими базовому физическому интерфейсу (eth0
).
2) Настройте таблицы IP для входящего трафика DNAT с IP-адреса нового интерфейса. Допустим, новый интерфейс имеет IP 10.10.10.88
а контейнер LXC, управляемый Docker, имеет IP 172.17.0.20.
iptables -t nat -N CONTAINER1
iptables -t nat -A PREROUTING -p all -d 10.10.10.88/32 -j CONTAINER1
iptables -t nat -A CONTAINER1 -p tcp -m tcp --dport 80 -j DNAT --to-destination 172.17.0.20:8080
(Здесь я также NAT'ing порт с 80 до 8080).
Как уже упоминалось, это отлично работает дома. Теперь я могу получить доступ к этому контейнеру с хоста как 172.17.0.20:8080 и с другого компьютера в моей локальной сети как 10.10.10.88:80. (Интересно, что я не могу достичь этого 10.10.10.88:80 изнутри хоста, но я думаю, что мне нужно другое правило, возможно, в цепочке OUTPUT, чтобы поймать это.) Но это не работает на работе.
На работе, когда я пытаюсь добраться до этого контейнера, используя его маршрутизируемый IP (10.10.10.88 в этом примере), я вижу, что пакеты прибывают и соответствуют правилам iptables вплоть до правила DNAT. Я могу наблюдать это, используя как счетчики пакетов, напечатанные с помощью iptables -L, так и цель TRACE на необработанной таблице и просматривая журнал ядра. Но после сопоставления с правилом DNAT пакеты просто исчезают. На моей домашней машине (которая работает) после DNAT я вижу пакеты, проходящие через цепочку INPUT в таблице фильтров с новым (NAT) -эдиперечисленным IP-адресом назначения. На моей рабочей машине этот шаг не происходит.
На обеих машинах включена переадресация IP.