不知道这算不算是一个 #冷知识
docker run -p 8080:80 [...]
这样不指定 host IP 的端口映射发布默认情况下是不安全的[1],会 bypass 掉主机防火墙规则。
举个例子:
你有一台服务器,你使用 iptables / UFW / firewalld 配置了如下的规则:
eth0 接口只接受 22/tcp、443/tcp、443/udp 入站连接,除此之外拒绝所有其它入站连接。
你运行了上面的命令启动了一个容器,你可能会认为:因为有上面的防火墙规则存在,通过容器映射发布的8080端口是不能被外部访问的。
但你实际端口扫描一下就会发现外部是可以访问8080端口的。
换而言之,-p 8080:80 会 bypass 掉原有的防火墙规则,让所有接口均能访问8080端口。
这并不是新的问题,搜索一下就会发现11年前就有 reddit 网友遇到同样的问题。
Docker will bypass your firewall by default.
https://www.reddit.com/r/docker/comments/2fftmp/docker_will_bypass_your_firewall_by_default/
当然更有博文介绍解决方法:
How to Fix Docker Bypassing Firewall: A Complete Guide
https://www.bitdoze.com/docker-bypasses-firewall/
最后的最后,配置完服务器之后,一定一定要在外部对服务器做一个全端口的扫描,看看是不是不小心开放了不打算开放的端口。
[1] Port publishing and mapping | Docker Docs
https://docs.docker.com/engine/network/port-publishing/
