Передача порта на петлевом интерфейсе к удаленному IP/порту

У меня есть два контейнера Докера, которые я пытаюсь объединить в сеть вместе в особенном методе. Контейнер A выполняет сервер Redis на порте 6379. Контейнер B выполняет интерактивную оболочку и потребности получить доступ к Redis. Используя соединение Докера функции, пользователь в контейнере B может соединиться с Redis на через 10.1.0.2:6379, который перемещается через виртуальный интерфейс eth0, настроенный Докером.

Существует программа, которая будет работать в контейнере B, который ожидает, что Redis будет доступен в порте 6379 на петлевом интерфейсе. Предположите, что эта программа не может быть настроена для указания на другой IP.

Я хотел бы передать трафик к 127.0.0.1:6379 к 10.1.0.2:6379. Я попробовал несколько изменений правил iptables о таблице NAT, но я или получаю "соединение, которому отказывают" при попытке соединиться с локальным адресом/портом, или соединение просто зависает навсегда. Какие правила iptables я могу использовать для достижения этого эффекта?

Вот одна из вещей, которые я попробовал:

$ sudo iptables -t nat -S
-P PREROUTING ACCEPT
-P INPUT ACCEPT
-P OUTPUT ACCEPT
-P POSTROUTING ACCEPT
-A INPUT -d 10.1.0.2/32 -p tcp -m tcp --dport 6379 -j SNAT --to-source 127.0.0.1
-A OUTPUT -p tcp -m tcp --dport 6379 -j DNAT --to-destination 10.1.0.2:6379

Попытка соединиться с Redis с redis-cli использование вышеупомянутых правил просто зависает навсегда. Я попробовал версию этого, которое использует PREROUTING/POSTROUTING вместо ВВОДА/ВЫВОДА, и это привело к непосредственному "соединению, которому отказывают".

4
задан 7 February 2015 в 04:23
1 ответ

Я бы использовал для этого socat:

socat TCP-LISTEN:6379,fork TCP:10.1.0.2:6379

Вы могли бы захотеть запустить это с помощью супервизора или подобного инструмента. В ubuntu:

apt-get install socat supervisor

cat > /etc/supervisor/conf.d/redis-socat.conf << EOF
[program:redis-socat]
command = socat TCP-LISTEN:6379,fork TCP:10.1.0.2:6379
autorestart = true
user = nobody
EOF

supervisorctl reload

Теперь вы можете запускать / останавливать процесс redis-socat, используя:

supervisorctl start redis-socat 
supervisorctl stop redis-socat

Он также автоматически запускается во время загрузки.

3
ответ дан 3 December 2019 в 03:42

Теги

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