Использование iptables для предоставления контейнеру LXC маршрутизируемого IP

3273
dty

Я использую 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.

0
Я в замешательстве, вы говорите № 1, что вы не можете добраться до контейнера, работающего дома с работы? Или вы говорите # 2, что у вас есть два отдельных экземпляра Docker + их контейнеры; один на работе, один дома; настроен ли тождественно отдельно от разных версий Ubuntu, которые вы используете? James Webster 10 лет назад 0
# 2 - за исключением того, что это одна и та же версия Linux! dty 10 лет назад 0

0 ответов на вопрос

Похожие вопросы