Я добавил stunnel в контейнер Redis и контейнер PHP-FPM для безопасной передачи данных приложения между службами в кластере Docker Swarm.У меня не было возможности найти какие-либо другие подобные вопросы, поэтому мне интересно, если я выбрал неправильный подход здесь.
У меня это работает в моей локальной среде, это когда я развертываю его вРой, что это не удается.
Проблема
Когда я пытаюсь проверить связь с клиентским контейнером, выполнив redis-cli -p 8001 ping
Затем я получаю следующую ошибку: Error: Connection reset by peer
Когда я просматриваю журналы для stunnel, я вижу, что оно приняло соединение на клиенте, а затем не удается отправить его в контейнер сервера Redis, как показано ниже
2018.05.19 16:42:39 LOG5[ui]: Configuration successful
2018.05.19 16:45:19 LOG7[0]: Service [redis-client] started
2018.05.19 16:45:19 LOG5[0]: Service [redis-client] accepted connection from 127.0.0.1:41710
2018.05.19 16:45:19 LOG6[0]: s_connect: connecting 10.0.0.5:6379
2018.05.19 16:45:19 LOG7[0]: s_connect: s_poll_wait 10.0.0.5:6379: waiting 10 seconds
2018.05.19 16:45:19 LOG3[0]: s_connect: connect 10.0.0.5:6379: Connection refused (111)
2018.05.19 16:45:19 LOG5[0]: Connection reset: 0 byte(s) sent to SSL, 0 byte(s) sent to socket
2018.05.19 16:45:19 LOG7[0]: Local descriptor (FD=3) closed
2018.05.19 16:45:19 LOG7[0]: Service [redis-client] finished (0 left)
Подробности конфигурации
Вот конфигурация stunnel на сервере Redis
pid = /run/stunnel-redis.pid
output = /tmp/stunnel.log
[redis-server]
cert = /etc/stunnel/redis-server.crt
key = /etc/stunnel/redis-server.key
accept = redis_master:6379
connect = 127.0.0.1:6378
А вот конфигурация stunnel для клиента
pid = /run/stunnel-redis.pid
output = /tmp/stunnel.log
[redis-client]
client = yes
accept = 127.0.0.1:8001
connect = redis_master:6379
CAfile = /etc/stunnel/redis-server.crt
verify = 4
debug = 7
Thisтак выглядит мой файл docker-stack.yml для этих двух служб
php_fpm:
build:
context: .
dockerfile: fpm.Dockerfile
image: registry.github.com/hidden
ports:
- "8001"
redis_master:
build:
context: .
dockerfile: redis.Dockerfile
image: registry.github.com/hidden
ports:
- "6378"
- "6379"
sysctls:
- net.core.somaxconn=511
volumes:
- redis-data:/data
Вывод netstat -plunt
в клиентском контейнере fpm
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 127.0.0.1:8001 0.0.0.0:* LISTEN 208/stunnel4
tcp 0 0 127.0.0.11:45281 0.0.0.0:* LISTEN -
tcp6 0 0 :::9000 :::* LISTEN 52/php-fpm.conf)
udp 0 0 127.0.0.11:43781 0.0.0.0:* -
Вывод netstat -plunt
вконтейнер сервера redis
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 127.0.0.11:39294 0.0.0.0:* LISTEN -
tcp 0 0 0.0.0.0:6378 0.0.0.0:* LISTEN 8/redis-server *:63
tcp 0 0 10.0.0.14:6379 0.0.0.0:* LISTEN 37/stunnel4
tcp6 0 0 :::6378 :::* LISTEN 8/redis-server *:63
udp 0 0 127.0.0.11:44855 0.0.0.0:* -
Я подтвердил, что на хост-компьютере не активирован брандмауэр.Эти сервисы в настоящее время находятся на одном и том же хосте, но вскоре они будут на разных хостах, следовательно, необходимость в stunnel.
Эти службы развертываются с помощью команды docker stack
, так что оверлейная сеть автоматически создается и подключается к обеим этим службам.
У всех есть мысли о том, почему запрос от клиента ксерверу отказывают?