Вопрос или проблема
Для прототипа проекта предприятия я использую Minikube для тестирования сложной локальной сети Hyperledger Fabric (HLF). Мне нужно открыть HLF (не http) службы, работающие в Minikube. Я уже сделал это с помощью Nodeports, но так как я использую драйвер Docker в своем Minikube, их можно открывать только в интерфейсе моста, к которому Minikube привязывается, поэтому я могу получить к ним доступ только с хост-машины, а не извне. Я хочу, чтобы некоторые из этих портов были доступны в моей Ethernet-сети. Есть ли способ сделать это с помощью IPTables? Допустим, у меня есть Minikube в интерфейсе моста с IP 192.168.49.2 на порту 7051, и я хочу, чтобы эта служба была видна на eth0 с IP 192.168.2.4 также на порту 7051.
Я использую Bookworm Linux (Raspberry OS)
Какими будут правила IP таблиц?
Примечание: я читал в других старых записях, что проблема связана с уже существующими правилами DOCKER при использовании Minikube с драйвером docker. Вот мои текущие правила:
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
DOCKER-USER all -- anywhere anywhere
DOCKER-ISOLATION-STAGE-1 all -- anywhere anywhere
ACCEPT all -- anywhere anywhere ctstate RELATED,ESTABLISHED
DOCKER all -- anywhere anywhere
ACCEPT all -- anywhere anywhere
ACCEPT all -- anywhere anywhere
ACCEPT all -- anywhere anywhere ctstate RELATED,ESTABLISHED
DOCKER all -- anywhere anywhere
ACCEPT all -- anywhere anywhere
ACCEPT all -- anywhere anywhere
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Chain DOCKER (2 references)
target prot opt source destination
ACCEPT tcp -- anywhere 192.168.49.2 tcp дpt:7051
ACCEPT tcp -- anywhere 192.168.49.2 tcp дpt:8443
ACCEPT tcp -- anywhere 192.168.49.2 tcp дpt:ssh
ACCEPT tcp -- anywhere 192.168.49.2 tcp дpt:2376
ACCEPT tcp -- anywhere 192.168.49.2 tcp дpt:5000
ACCEPT tcp -- anywhere 192.168.49.2 tcp дpt:32443
Chain DOCKER-ISOLATION-STAGE-1 (1 references)
target prot opt source destination
DOCKER-ISOLATION-STAGE-2 all -- anywhere anywhere
DOCKER-ISOLATION-STAGE-2 all -- anywhere anywhere
RETURN all -- anywhere anywhere
Chain DOCKER-ISOLATION-STAGE-2 (2 references)
target prot opt source destination
DROP all -- anywhere anywhere
DROP all -- anywhere anywhere
RETURN all -- anywhere anywhere
Chain DOCKER-USER (1 references)
target prot opt source destination
RETURN all -- anywhere anywhere
Примечание: Для того чтобы открыть порт 7054, я попробовал следующие правила без успеха… Что я упускаю?
sudo iptables -A FORWARD -i eth0 -o br-e2ab4e35d9ed -p tcp --syn --dport 7054 -m conntrack --ctstate NEW -j ACCEPT
sudo iptables -A FORWARD -i eth0 -o br-e2ab4e35d9ed -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
sudo iptables -A FORWARD -i br-e2ab4e35d9ed -o eth0 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 7054 -j DNAT --to-destination 192.168.49.2
(Я подтвердил, что порт прослушивается и работает по адресу minikube, 192.168.49.2, в созданном интерфейсе моста docker/minikube: br-e2ab4e35d9ed)
Ответ или решение
Для реализации доступа к сервисам, работающим в Minikube через сетевой интерфейс Ethernet с использованием iptables, следует учитывать несколько важных аспектов, прежде чем продолжить. Мы рассматриваем ситуацию, когда необходимо проксировать запросы, направленные на определенный порт хоста (в данном случае, 7051), к порту сервисов на IP-адресе Minikube (192.168.49.2). Давайте разберем процесс и необходимые команды по шагам.
Шаг 1: Подготовка и проверка текущих iptables
Сначала проверьте текущие правила iptables для получения информации о действующих правилах и конфликтах, которые могут возникнуть при их добавлении:
sudo iptables -L -v -n
sudo iptables -t nat -L -v -n
Шаг 2: Настройка правил FORWARD
Добавим правила для межсетевого взаимодействия между вашим Ethernet-интерфейсом (eth0) и мостовым интерфейсом Docker (br-<имя_моста>).
# Разрешаем новые подключения
sudo iptables -A FORWARD -i eth0 -o br-e2ab4e35d9ed -p tcp --dport 7051 -j ACCEPT
# Позволяем установленные соединения
sudo iptables -A FORWARD -i br-e2ab4e35d9ed -o eth0 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
# Разрешаем обратные связи
sudo iptables -A FORWARD -i eth0 -o br-e2ab4e35d9ed -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
Шаг 3: Настройка NAT
Теперь следует добавить правило NAT для перенаправления трафика с порта 7051 на Minikube.
# Перенаправляем трафик на Minikube
sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 7051 -j DNAT --to-destination 192.168.49.2:7051
Шаг 4: Проверка работы правил
После добавления всех правил, убедитесь, что правила iptables были успешно применены:
sudo iptables -L -v -n
sudo iptables -t nat -L -v -n
Эти команды должны отображать ваши новые правила в соответствующих цепочках (FORWARD
и PREROUTING
).
Шаг 5: Протестируйте доступ к сервису
Теперь вы можете протестировать доступ к вашему сервису, пытаясь подключиться к нему через IP-адрес вашего хоста (192.168.2.4) на порту 7051:
# Используйте любую утилиту для тестирования TCP-соединения, например, nc
nc -v 192.168.2.4 7051
Примечания
- Разрешения на входящие подключения: Убедитесь, что ваш firewall (если установлен) разрешает входящие подключения на порт 7051.
- Проверка Docker и KV-сетей: Конфликты с другими сетями Docker также могут помешать успешной маршрутизации, поэтому нужно удостовериться, что другие контейнеры/сервисы не используют тот же порт или IP.
- Сохранение настроек: После настройки iptables, не забудьте сохранить изменения, чтобы они сохранились после перезагрузки машины. В большинстве дистрибутивов Linux это можно сделать с помощью:
sudo sh -c "iptables-save > /etc/iptables/rules.v4"
Следуя этим шагам, вы сможете успешно проксировать трафик на Minikube-сервисы через Ethernet-интерфейс. Это разработка позволит другим хостам в вашей локальной сети взаимодействовать с услугами, развернутыми в минимуме, тем самым улучшая тестирование и взаимодействие с вашим Enterprise проектом.