Linux Docker在Docker主机内部侦听RabbitMQ,但不从外部侦听,为什么?

Linux Docker在Docker主机内部侦听RabbitMQ,但不从外部侦听,为什么?,linux,docker,rabbitmq,iptables,Linux,Docker,Rabbitmq,Iptables,这是我运行rabbitMQ映像的方式: docker run -d --restart always --hostname host-rabbit --name cg-rabbit -p 5029:5672 -p 5020:15672 -e RABBITMQ_DEFAULT_VHOST=sample_vhost -e RABBITMQ_DEFAULT_USER=sampleuser -e RABBITMQ_DEFAULT_PASS=samplepass rabbitmq:3-management

这是我运行
rabbitMQ
映像的方式:

docker run -d --restart always --hostname host-rabbit --name cg-rabbit -p 5029:5672 -p 5020:15672 -e RABBITMQ_DEFAULT_VHOST=sample_vhost -e RABBITMQ_DEFAULT_USER=sampleuser -e RABBITMQ_DEFAULT_PASS=samplepass rabbitmq:3-management
现在在
netstat-nltp中:

ubuntu@infra:~$ netstat -nltp
(Not all processes could be identified, non-owned process info
 will not be shown, you would have to be root to see it all.)
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 127.0.0.53:53           0.0.0.0:*               LISTEN      -
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      -
tcp6       0      0 :::22                   :::*                    LISTEN      -
tcp6       0      0 :::5020                 :::*                    LISTEN      -
tcp6       0      0 :::5029                 :::*                    LISTEN      -
我不确定为什么docker向主机公开端口时会看到
tcp6
,以及它是否会出现问题

现在,当我从服务器内部telnet时,我可以看到端口已打开:

ubuntu@infra:~$ telnet MY-SERVER-IP-ADDRESS 5029
Trying MY-SERVER-IP-ADDRESS...
Connected to MY-SERVER-IP-ADDRESS.
Escape character is '^]'.
^]

telnet> Connection closed.
但在我的机器中,当我尝试
telnet
(或从另一台服务器)时:

iptables-L
报告:

sudo iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
ACCEPT     tcp  --  anywhere             anywhere             state NEW tcp dpt:5020
ACCEPT     tcp  --  anywhere             anywhere             state NEW tcp dpt:5029
ACCEPT     tcp  --  anywhere             anywhere

Chain FORWARD (policy DROP)
target     prot opt source               destination
DOCKER-USER  all  --  anywhere             anywhere
DOCKER-ISOLATION-STAGE-1  all  --  anywhere             anywhere
ACCEPT     all  --  anywhere             anywhere             ctstate RELATED,ESTABLISHED
DOCKER     all  --  anywhere             anywhere
ACCEPT     all  --  anywhere             anywhere
ACCEPT     all  --  anywhere             anywhere

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Chain DOCKER (1 references)
target     prot opt source               destination
ACCEPT     tcp  --  anywhere             172.17.0.2           tcp dpt:amqp
ACCEPT     tcp  --  anywhere             172.17.0.2           tcp dpt:15672

Chain DOCKER-ISOLATION-STAGE-1 (1 references)
target     prot opt source               destination
DOCKER-ISOLATION-STAGE-2  all  --  anywhere             anywhere
RETURN     all  --  anywhere             anywhere

Chain DOCKER-ISOLATION-STAGE-2 (1 references)
target     prot opt source               destination
DROP       all  --  anywhere             anywhere
RETURN     all  --  anywhere             anywhere

Chain DOCKER-USER (1 references)
target     prot opt source               destination
RETURN     all  --  anywhere             anywhere
值得注意的是我已经在服务器中安装了一台redis服务器(非docker),并且我能够
telnet
从外部连接到它


编辑-1:

sudo iptables -t nat -L
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination
DOCKER     all  --  anywhere             anywhere             ADDRTYPE match dst-type LOCAL

Chain INPUT (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination
DOCKER     all  --  anywhere            !localhost/8          ADDRTYPE match dst-type LOCAL

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination
MASQUERADE  all  --  172.17.0.0/16        anywhere
MASQUERADE  tcp  --  172.17.0.2           172.17.0.2           tcp dpt:15672
MASQUERADE  tcp  --  172.17.0.2           172.17.0.2           tcp dpt:amqp

Chain DOCKER (2 references)
target     prot opt source               destination
RETURN     all  --  anywhere             anywhere
DNAT       tcp  --  anywhere             anywhere             tcp dpt:15672 to:172.17.0.2:15672
DNAT       tcp  --  anywhere             anywhere             tcp dpt:amqp to:172.17.0.2:5672

EDIT-2:
Docker配置:

ubuntu@infra:~$ sudo cat /var/snap/docker/796/config/daemon.json
{
    "log-level":        "error",
    "storage-driver":   "overlay2"
}

这真的很奇怪。通过刷新
iptables
中的
NAT
,一切正常:

iptables -t nat -F
冲洗前的nat:

ubuntu@infra:~$ sudo iptables -t nat -L
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination
DOCKER     all  --  anywhere             anywhere             ADDRTYPE match dst-type LOCAL

Chain INPUT (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination
DOCKER     all  --  anywhere            !localhost/8          ADDRTYPE match dst-type LOCAL

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination
MASQUERADE  all  --  172.17.0.0/16        anywhere
MASQUERADE  tcp  --  172.17.0.2           172.17.0.2           tcp dpt:15672
MASQUERADE  tcp  --  172.17.0.2           172.17.0.2           tcp dpt:amqp

Chain DOCKER (2 references)
target     prot opt source               destination
RETURN     all  --  anywhere             anywhere
DNAT       tcp  --  anywhere             anywhere             tcp dpt:15672 to:172.17.0.2:15672
DNAT       tcp  --  anywhere             anywhere             tcp dpt:amqp to:172.17.0.2:5672
现在冲洗完之后,一切都消失了:

ubuntu@infra:~$ sudo iptables -t nat -L
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination

Chain INPUT (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination

Chain DOCKER (0 references)
target     prot opt source               destination

注意:通过
sudo snap restart docker重新启动docker
网络规则又回来了,我不得不再次刷新NAT

iptables-tnat-L
docker inspect cg rabbit
?netstat显示这是一个ipv6地址。您是否也通过ipv6访问您的计算机?@TheFool否我只是使用ipv4@KamilCuk请检查我的
EDIT-1
update@KamilCuk我现在已经更改为默认端口,我的意思是
5672:5672
15672:15672
您不应该在docker完成设置后刷新表。把东西放在那里是有充分理由的。你有一个不同的问题,你可以通过这个“黑客”来解决。@TheFool是的,但是如果你有更好的解决方案,并且知道为什么这个问题是由
docker NATs提出的,我洗耳恭听:)我没有,我也不需要。这是你的问题。我只是指出,这不是一个真正的解决办法。谁知道还有什么会被破坏,因为docker希望Nat表中的条目不存在。我个人会调查ipv6的事情。例如,您可以尝试为docker0设置固定的cdir。您还可以将端口发布到特定的ip地址<代码>-p 192.168.1.100:8080:80
ubuntu@infra:~$ sudo iptables -t nat -L
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination

Chain INPUT (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination

Chain DOCKER (0 references)
target     prot opt source               destination