我的服务器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 访问不了?
使用
-p 127.0.0.1:3000:3000
,因为默认发布到了0.0.0.0
,改成127.0.0.1
就可以了。