Защита Redis с помощью Stunnel в Docker Swarm

Я добавил 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

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

У кого-нибудь есть мысли о том, почему запрос от клиента к серверу отклоняется?


person mitchcodes    schedule 19.05.2018    source источник
comment
Почему бы вам просто не зашифровать сеть? docs.docker.com/v17.09/engine / userguide / network /   -  person Constantin Galbenu    schedule 19.05.2018
comment
Поскольку здесь упоминается, что это шифрование накладывает существенное снижение производительности docs.docker.com/network/overlay/   -  person mitchcodes    schedule 19.05.2018


Ответы (1)


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

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

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

person mitchcodes    schedule 19.05.2018
comment
Спасибо, моя сборка докера успешно завершена с этой информацией! - person Niloct; 25.11.2019