我在CentOS 7上安装了对接器,并且正在运行firewallD。
从我的容器中进入主机(默认为172.17.42.1)
有防火墙
container# nc -v 172.17.42.1 4243
nc: connect to 172.17.42.1 port 4243 (tcp) failed: No route to host防火墙关闭
container# nc -v 172.17.42.1 4243
Connection to 172.17.42.1 4243 port [tcp/*] succeeded!我读过有关火种的文档,但我不完全理解。是否有一种方法可以简单地允许停靠容器中的所有内容(我猜是在docker0适配器上)不受限制地访问主机?
发布于 2015-08-27 12:30:45
也许比先前的答案更好;
firewall-cmd --permanent --zone=trusted --change-interface=docker0
firewall-cmd --permanent --zone=trusted --add-port=4243/tcp
firewall-cmd --reload发布于 2015-05-02 02:10:11
这些命令起了作用:
firewall-cmd --permanent --zone=trusted --add-interface=docker0
firewall-cmd --permanent --zone=trusted --add-port=4243/tcp发布于 2020-03-21 03:45:55
被接受的解决方案对某些人有效,但对另一些人无效的原因之一是关于firewalld的设计问题。Firewalld只处理任何连接的第一个匹配区域。它还处理基于IP地址的区域,而不是基于接口的区域。只要您的任何区域碰巧包括正在使用的IP地址停靠器,受信任区域中的接受规则就永远不会被处理。
要验证这一点,可以查看生成的iptables规则,除非您使用的是nbt后端:
iptables -vnL | less解决方案是使用firewalld直接规则而不是受信任的区域。直接规则总是首先被处理的。例如,对于端口3306 (即本地主机上的mysqld ),您需要以下规则:
/bin/firewall-cmd --direct --permanent --add-rule ipv4 filter INPUT 10 -p tcp --dport 3306 -i docker0 -j ACCEPT如果您在没有--永久开关的情况下重复相同的命令,则firewalld将动态地为您进行更改,并且您不需要重新启动对接程序。
第二个原因是,根据您配置的对接器版本和网络,流量可能并不是通过docker0接口实际流动,而是通过一个单独的桥接口。您可以通过命令看到这个接口。
ip address show您必须使用此桥接口重复上面的直接规则语句。
您还可以在码头中指定自己的网络。本文描述了这个过程:https://serverfault.com/questions/885470/how-to-configure-firewall-on-user-defined-docker-bridge
简短的版本是在停靠文件中指定网络部分,如下所示:
version: '3'
.
.
.
networks:
mynetwork:
driver_opts:
com.docker.network.bridge.name: mynetwork_name您也可以在命令行中这样做。
https://unix.stackexchange.com/questions/199966
复制相似问题