Можно ли назначить сопоставление портов для существующего контейнера Docker с помощью iptables в Linux? - PullRequest
0 голосов
/ 07 июля 2019

Операционная система: Ubuntu 16.04 LTS, вот моя проблема.

В последнее время я создаю приложение, использующее сервис данных Redis (Docker). Обычный способ создания нового сервиса Redis выглядит примерно так:

docker pull redis:latest
docker run -d --name redis -p 6379:6379 redis:latest

Если предположить, что мой WAN IP равен 201.201.201.201, то он просто должен получить доступ к Redis по адресу: 201.201.201.201: 6379.

Однако при таком подходе порт сервера redis подвергается общедоступной сети, даже если вы можете задать длинный пароль для ужина, потенциальная угроза безопасности остается.

Поскольку docker не поддерживает изменение сопоставления портов в работающем контейнере, мне нужно завершить работу всей службы Docker, что занимает много времени, почти невозможно.

Затем я пытаюсь использовать сопоставление IP-таблиц вместо создания карты Docker, из-за гибкости iptables, теоретически это дает преимущества с обеих сторон - файлы uoload из любой точки мира (вне зоны zz), но также может закрыть это

iptables -t nat -A PREROUTING -d 172.245.210.199 -p tcp --dport 6379 -j DNAT --to-destination 172.17.0.5:6379
iptables -t nat -A POSTROUTING -d 172.17.0.5 -p tcp --dport 6379 -j SNAT --to 172.17.0.1

Но это не работает, я не могу пропинговать контейнер 17.17.0.162 Кто-нибудь знает разрешение или может предложить другие способы реализации этого сопоставления портов (например, nginx или caddy?)

Спасибо!

1 Ответ

0 голосов
/ 08 июля 2019

Я предлагаю использовать вспомогательный контейнер, в этом контейнере добавьте порт вперед для вашего сервисного контейнера, который не делал сопоставление портов:

docker run -idt --link redis -p 6379:6379 alpine/socat TCP4-LISTEN:6379,fork,reuseaddr TCP4:redis:6379

Над контейнером будет использоваться --link redis, чтобы он мог разрешитьимя вашего redis container, и при получении трафика от хоста 6379 он сначала перенаправит на 6379 вспомогательного контейнера, а затем будет использовать socat для пересылки трафика на 6379 redis container, поэтому он работает, хотя вашсервисный контейнер не сопоставил порт 6379.

Поскольку --link устарел, вы также можете настроить свою сеть так, как вам нравится:

docker network create my_network
docker network connect my_network redis
docker run -idt --network my_network -p 6379:6379 alpine/socat TCP4-LISTEN:6379,fork,reuseaddr TCP4:redis:6379
...