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

我的服务器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 访问不了?

阅读 1.9k
2 个回答

使用 -p 127.0.0.1:3000:3000 ,因为默认发布到了 0.0.0.0,改成 127.0.0.1 就可以了。

把容器的3000端口映射到宿主机的80端口可行?

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题