Encaminhando uma porta na interface de loopback para um IP / porta remoto

4

Eu tenho dois contêineres do Docker que estou tentando conectar em rede de uma maneira específica. O contêiner A está executando um servidor Redis na porta 6379. O contêiner B está executando um shell interativo e precisa acessar o Redis. Usando o recurso de link do Docker, um usuário dentro do contêiner B pode se conectar ao Redis através de 10.1.0.2:6379, que viaja através da interface virtual eth0 configurada pelo Docker.

Existe um programa que será executado no contêiner B que espera que o Redis esteja disponível na porta 6379 na interface de loopback. Suponha que este programa não possa ser configurado para apontar para um IP diferente.

Gostaria de encaminhar o tráfego para 127.0.0.1:6379 a 10.1.0.2:6379. Eu tentei várias variações de regras iptables na tabela NAT, mas eu ou recebo "conexão recusada" ao tentar se conectar ao endereço local / porta, ou a conexão fica pendente para sempre. Quais regras do iptables posso usar para obter esse efeito?

Aqui está uma das coisas que tentei:

$ 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

A tentativa de conectar-se ao Redis com redis-cli usando as regras acima é interrompida para sempre. Eu tentei uma versão disso que usa PREROUTING / POSTROUTING em vez de INPUT / OUTPUT e que resultou em uma "conexão recusada" imediata.

    
por Jimmy Cuadra 07.02.2015 / 03:23

1 resposta

3

Eu usaria socat para isso:

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

Você pode querer executar isso usando supervisor ou uma ferramenta semelhante. No 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

Agora você pode iniciar / interromper o processo de redis-socat usando:

supervisorctl start redis-socat 
supervisorctl stop redis-socat

Ele também será iniciado automaticamente no momento da inicialização.

    
por 08.02.2015 / 23:13