LINUX.ORG.RU
ФорумAdmin

Развертывания Docker контейнера с драйвером IPVlan L3 mode с nginx

 , , , ,


0

1

Всем добрый вечер уважаемые!

Пытаюсь развернуть контейнер nginx с драйвером ipvlan l3 на интерфейсе enp6s0 с внешний IP адресом.

  1. Создал сеть sudo docker network create -d ipvlan --subnet 192.168.6.0/24 -o parent=enp6s0 -o ipvlan_mode=l3 l3net6

  2. Далее запускаю контейнер sudo docker run -dit --rm --network l3net6 --ip 192.168.6.10 --name n1 nginx

Как направить трафик tcp:80 поступающий на внешний IP хх.ххх.ххх.х интерфейса enp6s0 на 192.168.6.10? Создавать nat правило в iptables?

Заранее премного благодарен! С уважением и наилучшими пожеланиями!


Погоди, enp6s0 - это сетевуха с внешним ip? Как у нее может быть subnet 192.168.6.0/24?

Тебе нужно создать сетку без vlan’ов и parent и просто порт выкинуть через -p 80:80

adn ★★★★
()
Последнее исправление: adn (всего исправлений: 1)
Ответ на: комментарий от adn

Насколько я понимаю при использовании драйвера ipvlan mode l3 порты уже не мапятся через -p согласно:

https://docs.docker.com/network/drivers/ipvlan/#ipvlan-l3-mode-example

При этом subnet полностью изолирована и общаться только через L3. То есть до subnet 192.168.6.0/24 можно достучаться через gateway=IP docker host, либо создать виртуальный интерфейс mynet@enp6s0 в режиме ipvlan l3 и через него пакеты будут ходить в subnet 192.168.6.0/24

Но вопрос мапинга портов все еще открыт. Учитывая что docker host является для subnet 192.168.6.0/24 неким роутером (шлюзом) то других вариантов как NAT для проброса портов не вижу.

Может ошибаюсь, поправьте меня если так.

hitec
() автор топика
Ответ на: комментарий от adn

Что то не могу понять почему не работает.

Исходные данные:

enp5s0 192.168.10.10 (он же docker host)

enp6s0 x.x.x.x (внешний IP)

Стартую для проверки nginx

sudo docker run -dit --rm --network l3net5 --ip 192.168.5.11 --name n1 nginx

где l3net5 это IPVlan L3

Настраиваю NAT:

sudo iptables -t nat -A POSTROUTING -o enp5s0 -p tcp --dport 80 -j SNAT --to-source 192.168.10.10:80

sudo iptables -t nat -A PREROUTING -d 192.168.10.10 -p tcp --dport 80 -j DNAT --to-destination 192.168.5.11:80

sudo iptables -A FORWARD -i enp5s0 -d 192.168.10.10 -p tcp --dport 80 -j ACCEPT

Захожу в контейнер

sudo docker exec -it n1 bash

далее

tcpdump port 80 в контейнере вообще тишина

Что не так делаю? Может маршруты сначала нужно настроить route-ы, что бы трафик ходил из локальной сети 192.168.10.0/24 via 192.168.10.10 в 192.168.5.0/24 ?

hitec
() автор топика
Ответ на: комментарий от hitec

Я совсем запутался. Ты же делал сетку, которая по факту становится alias’ом на внешнем интерфейсе, а nat’ишь другой интерфейс?

Если тебе хочется ходить с 192.168.10.0/24 на 192.168.5.0/24, то просто пропиши роутинг между этими сетями. Без всякого nat’а.

Если же тебе хочется прокинуть этот порт в интернет, то тебе к этому роутингу еще нужен dnat и маскарадинг (и включить net.ipv4.ip_forward)


iptables -t nat -A PREROUTING --dst $INET_IP -p tcp --dport 80 -j DNAT --to-destination 192.168.5.11
iptables -t nat -A POSTROUTING -o enp6s0 -j MASQUERADE

adn ★★★★
()
Ответ на: комментарий от adn

Прошу прощения что неясно описываю ситуацию. Моя схема:

интеренет_какнал_1 <–> маршрутизатор <–> enp5s0(192.168.10.10) <–???–> l3net5(nginx1 192.168.5.11)[ipvlan mode L3]

интеренет_какнал_2 <————————> enp6s0(xxx.xxx.xx.xx) <–???–> l3net6(nginx2 192.168.6.11)[ipvlan mode L3]

Сервер имеет два интерфейса enp5s0 (IP локальной сети) и enp6s0 (внешний IP). Я настроил policy routing в netplan для того, что бы пакеты выходили с тех интерфейсов, на какие они поступили. Контейнеры в сети l3net5(nginx1,mysql1,… 192.168.5.0/24) я планирую использовать как внутренний ресурс для разработки сайтов, а контейнеры в сети l3net6(nginx2,mysql2,… 192.168.6.0/24) я планирую использовать в продакшене.

Соединить сети enp5s0(192.168.10.0/24) и l3net5 (192.168.5.0/24) я могу создав маршрут на маршрутизаторе типа: все пакеты на 192.168.5.0/24 отправлять через gateway 192.168.10.10. И это работает. Но данный вариант не подходит для enp6s0(xxx.xxx.xx.xx)<–???–>l3net6, тут мне нужно организовать хождение пакетов напрямую с интерфейса enp6s0 в l3net6.

Как я пытался решить задачу:

ip link add net6 link enp6s0 type ipvlan mode l3
ip link set net6 up
ip addr add 192.168.106.0/24 dev net6 
ip route add 192.168.106.0/24 dev net6

но контейнеры (например busybox) запущенный в сети l3net6 не пигруются c docker host:

ping 192.168.0.12 -i enp6s0

пакеты не ходят! Так же ip route add пытался создавать учитывая policy routing, но это тоже не работает.

Ну и раз маршрутизации между:

enp5s0(192.168.10.10)<–???–>l3net5

enp6s0(xxx.xxx.xx.xx)<–???–>l3net6

нет, то пробросить порты по средствам NAT я не могу.

Что я делаю не так?

hitec
() автор топика
Ответ на: комментарий от hitec

Ты же с хоста пингуешь обе сетки? Правильно? Так подними на enp6s0 nginx (через network host) и рули уже им входящие твоего продакшна.

И кстати почему выбрано такое необычное решение с двумя vlan-ами? Почему именно так? В чем смысл?

adn ★★★★
()
Ответ на: комментарий от adn

Спасибо за ваш комментарий! Очень признателен что делитесь своим мнением.

network host в моем понимании - идеальное решение, изначально на него смотрю, это:

  1. Максимальная производительность сети, без всяких bridge-й

  2. Не нужды в этих костылях с роутингами и натами (большое кол-во forward-ингов будет напрягать в их настройке и администрировании)

но смущает то, что процессы будут крутиться на самом хосте, и что у процессов будет доступ к сети предприятия. Насколько понимаю, из документации, у процесса контейнера доступа к самому хосту не будет

However, in all other ways, such as storage, process namespace, and user namespace, the nginx process is isolated from the host.

(поправьте меня если ошибаюсь)

Но где-то встречал, что не рекомендуют использовать network host в продакшен, хотя не вижу для этого ограничений.

Какое ваше мнение по данному поводу?

hitec
() автор топика