我有两个Docker容器,我试图以特定的方式联网。 容器A正在端口6379上运行Redis服务器。容器B正在运行交互式shell并需要访问Redis。 使用Docker的链接function,容器B内的用户可以通过10.1.0.2:6379连接到Redis,通过Docker设置的虚拟eth0接口。
有一个程序将在容器B中运行,期望Redis在环回接口的端口6379上可用。 假设这个程序不能被configuration指向一个不同的IP。
我想转发stream量到127.0.0.1:6379到10.1.0.2:6379。 我已经尝试了NAT表上的iptables规则的几个变种,但是当我尝试连接到本地地址/端口,或者连接永远挂起时,我要么“连接被拒绝”。 我可以用什么iptables规则来达到这个效果?
这是我尝试的一件事情:
$ 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
使用上述规则尝试使用redis-cli连接到Redis将永远挂起。 我试过这个使用PREROUTING / POSTROUTING而不是INPUT / OUTPUT的版本,导致立即“连接被拒绝”。
我会用socat:
socat TCP-LISTEN:6379,fork TCP:10.1.0.2:6379
你可能想用supervisor或者类似的工具来运行这个。 在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
现在您可以使用以下命令启动/停止redis-socat进程:
supervisorctl start redis-socat supervisorctl stop redis-socat
它也将在启动时自动启动。