Перенаправить трафик в контейнер/ВМ Docker

Вопрос или проблема

У меня есть довольно мощная машина под управлением Ubuntu 16.04 Server. Она запускает несколько контейнеров Docker и виртуальных машин (с использованием VirtualBox), которые далее будут называться ВМ. В данный момент хосту назначен один IP-адрес (скажем, 192.168.1.10), и доступ к службам на ВМ осуществляется с помощью NAT (например, 192.168.1.10:80 -> 172.17.0.2:80), что является неудовлетворительным.
Вместо этого я хотел бы привязать несколько IP-адресов (например, 192.168.1.100-110) к интерфейсу хоста и перенаправить трафик, поступающий на дополнительные IP-адреса, в ВМ. Это приведет к сопоставлению <публичный IP> <--> <приватный IP>.

Я смог выполнить эту первую часть, добавив

[...]
up ip addr add 192.168.1.1xx/24 dev ens3 label ens3:0
down ip addr del 192.168.1.1xx/24 dev ens3 label ens3:0
[...]

записи в мой /etc/network/interfaces файл (где ens3 очевидно является названием сетевого интерфейса хоста). Это означает, что дополнительные IP-адреса активны и работают.

Но вторая часть вызывает у меня головную боль. Пока я рассматривал только решения на основе iptables, так как это кажется наиболее подходящим, и все руководства, которые я прочитал до сих пор, также использовали его.
Так что я сделал, это активировал пересылку IP, добавив net.ipv4.ip_forward=1 в /etc/sysctl.conf.

Затем я выполнил следующие команды для перенаправления:

iptables -t nat -A POSTROUTING -d 172.17.0.2 -j SNAT --to-source 192.168.1.100
iptables -t nat -A PREROUTING -d 192.168.1.100 -j DNAT --to-destination 172.17.0.2

172.17.0.2 – это приватный IP одной из ВМ. Она запускает веб-сервер на порту 8000. telnet 172.17.0.2 8000 устанавливает соединение, что говорит мне о том, что веб-сервер работает. Но telnet 192.168.1.100 8000 не срабатывает.
Почти все учебники по iptables имеют дело с перенаправлением одного порта или диапазона портов, но есть лишь очень немногие, которые рассматривают весь трафик на интерфейсе.
Кто-нибудь может обнаружить мою ошибку? Или у кого-нибудь есть хорошие советы по альтернативным инструментам для выполнения этой задачи?

Ваше правило NAT должно работать:

iptables -t nat -A PREROUTING -d 192.168.1.100 -j DNAT --to-destination 172.17.0.2

Однако вам нужно добавить еще одно правило, если вы запрашиваете какую-либо службу с той же машины (локально):

iptables -t nat -A OUTPUT -d 192.168.1.100 -j DNAT --to-destination 172.17.0.2

Правило NAT может применяться к определенному порту(ам) определенного протокола или ко всем протоколам и портам (как в данном случае).

На стороне Docker, по крайней мере, вы должны быть в состоянии сделать это с помощью ключа --publish, который может принимать, как вариант, IP хоста.

например:

docker run -p 192.168.1.105:80:80 -d image

Ответ или решение

Перенаправление трафика на контейнеры Docker/VM: Подробное руководство

При работе с виртуальными машинами и контейнерами Docker важно правильно организовать сетевые настройки, чтобы обеспечить доступ к службам, запущенным внутри данных окружений. В этой статье мы подробно рассмотрим, как перенаправить трафик на нескольких IP-адресах, выделенных для вашего хоста на Ubuntu 16.04 Server, к виртуальным машинам и контейнерам Docker.

Подготовка окружения

Шаг 1: Настройка сетевых интерфейсов

Для начала, вам необходимо определить готовые IP-адреса для назначения их интерфейсу вашего сервера. Это можно сделать, добавив следующие строки в файл /etc/network/interfaces:

auto ens3:0
iface ens3:0 inet static
    address 192.168.1.100
    netmask 255.255.255.0

auto ens3:1
iface ens3:1 inet static
    address 192.168.1.101
    netmask 255.255.255.0

# И повторить для всех нужных адресов...

Каждый интерфейс будет отвечать за один из выделенных IP-адресов.

Шаг 2: Включение маршрутизации

Для перенаправления трафика с одного IP на другой, необходимо обеспечить маршрутизацию пакетов. Это достигается активацией IP-пересылки. Включите IP-маршрутизацию, добавив строку в файл /etc/sysctl.conf:

net.ipv4.ip_forward=1

Затем обновите параметры системы:

sudo sysctl -p

Настройка iptables

Теперь, когда IP-адреса настроены, можно переходить к правилам iptables для управления NAT:

Шаг 3: Создание правил iptables

В этом шаге мы создадим правила для перенаправления трафика. Ваша первоначальная настройка выглядит неплохо, но необходимо добавить правило для обработки локальных запросов. Вот как это сделать:

# Для внешнего доступа
iptables -t nat -A PREROUTING -d 192.168.1.100 -j DNAT --to-destination 172.17.0.2
iptables -t nat -A POSTROUTING -d 172.17.0.2 -j SNAT --to-source 192.168.1.100

# Для локальных запросов
iptables -t nat -A OUTPUT -d 192.168.1.100 -j DNAT --to-destination 172.17.0.2

Такое правило позволит как внешним, так и локальным запросам отсылать пакеты на соответствующий внутренний IP виртуальных машин.

Шаг 4: Применение правил

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

iptables -t nat -L -n -v

Это даст вам представление о текущем состоянии правил NAT.

Настройка Docker

Если вы используете контейнеры Docker, также можно перенаправить порты, используя встроенные функции Docker. При запуске контейнера добавьте переключатель --publish:

docker run -p 192.168.1.105:80:80 -d имя_образа

Это позволит контейнеру слушать на IP-адресе 192.168.1.105 на порту 80.

Тестирование конфигурации

После выполнения всех настроек можно протестировать доступность службы:

  1. Проверьте локальное соединение с внутренним IP:

    telnet 172.17.0.2 8000
  2. Проверьте внешний доступ через новый IP-адрес:

    telnet 192.168.1.100 8000

Если конфигурация выполнена корректно, оба запроса должны успешно устанавливаться.

Заключение

Настройка перенаправления трафика в Docker и виртуальных машинах требует внимания к деталям, но, следуя вышеописанным шагам, вы сможете успешно организовать доступ к службам в ваших окружениях. Контроль через iptables и использование Docker-технологий совместно обеспечат гибкость и управление сетевым трафиком. Если после выполнения всех шагов возникают трудности, стоит тщательно проверять все правила iptables и настройки сети.

В случае возникновения дополнительных вопросов по данной теме, мы всегда готовы помочь!

Оцените материал
Добавить комментарий

Капча загружается...