docker端口映射后,外部可以直接通过宿主机未开启的端口访问到服务的问题?-灵析社区

CTang

我的服务器A部署了前端服务, ip为192.168.111.115, 服务器部署有nginx(非docker部署),防火墙开放有80端口以及ftp相关端口,由于前端需要node环境,于是用docker部署了nodejs环境,并在Nginx配置: location / { proxy_pass http://localhost:3000; } 然后使用docker run [其它] 3000:3000 [其它] 命令 并未指定网络模式(默认为bridge模式)运行项目 项目可以正常通过192.168.111.115访问,然后一个偶然的机会发现居然可以192.168.111.115:3000也能访问到, ### 于是进行了以下尝试 #### 尝试一: 在网上搜了解决方法,是在docker的配置文件daemon.json加入 { "iptables": false } 从新启动docker,通过docker info发现如下警告: WARNING: bridge-nf-call-iptables is disabled WARNING: bridge-nf-call-ip6tables is disabled 而且这样操作发现项目访问速度也比原来慢了. 于是重新启用docker的iptables. #### 尝试二: 使用服务器firewall-cmd 命令,设置了3000端口的入方向的限制 firewall-cmd --permanent --add-rich-rule='rule family="ipv4" port protocol="tcp" port="3000" reject' firewall-cmd --permanent --add-rich-rule='rule family="ipv6" port protocol="tcp" port="3000" reject' 发现不管用.仍可以通过3000端口访问到. #### 尝试三: 尝试在docker run 中设置 --net=host 模式,问题得到解决,但这样就没有网络隔离,安全性差了. **求助:** 有没有什么方法实现, 我即使用bridge模式, 又可以限制外部仅可以通过ip访问到项目,而ip:3000 访问不了?

阅读量:141

点赞量:0

问AI
使用 "-p 127.0.0.1:3000:3000" ,因为默认发布到了 "0.0.0.0",改成 "127.0.0.1" 就可以了。 * "docker run | Docker Docs" (https://link.segmentfault.com/?enc=mUYBhnRo74W0evAuvhFyQA%3D%3D.Dxryh3gEKdnEwnTGRZN91BG6Y0gTrdU6XBdKW7TI2YvTo1mX7QLvNryI5Yn4O0uK37TEtQZ4plT4BfZf5c85MdV0Z9DTRa3Dbk%2FeXT3TlZw%3D)