Защита Redis с помощью Stunnel на Docker Swarm - PullRequest
0 голосов
/ 19 мая 2018

Я добавил 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, так что оверлейная сеть автоматически создается и подключается к обеим этим службам.

У всех есть мысли о том, почему запрос от клиента ксерверу отказывают?

1 Ответ

0 голосов
/ 20 мая 2018

НАКОНЕЦ получил это работает!Я надеюсь, что это помогает кому-то еще.Проблема была в конфигурации stunnel на redis-сервере, правильная конфигурация выглядит следующим образом:

[redis-server]
cert = /etc/stunnel/redis-server.crt
key = /etc/stunnel/redis-server.key
accept = 6379
connect = 6378

Проблема заключается в том, что я использовал имя хоста redis_master в опции accept, переключениеэто только порт исправил проблему.

...