可能是我的所有博客里最简短的一篇了……纯属记录下,如果有遇到同样问题的朋友请看:
我的服务器上用docker运行的elasticsearch,开放了9200端口,但我不想让我的9200端口暴露在公网上,因此我用iptables加了两条规则试图drop外网对9200端口的请求:
iptables -I INPUT -p tcp --dport 9200 -j DROP
iptables -I INPUT -s 127.0.0.1 -p tcp --dport 9200 -j ACCEPT
但是!我发现iptables的规则并save不了,同样的9200端口也还是依旧可以被外网访问。查询后发现Centos7用的防火墙是firewalld-cmd,因此我又开始往firewalld-cmd里添加规则并reload保存:
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="127.0.0.1" port protocol="tcp" port="9200" accept"
再次测试之,不幸的是外网依然可以访问9200端口……这简直是要我逼疯了= =继续谷歌,发现docker在运行的时候,rule并不在input链上,而是在forward链上,这就解释了我的规则为什么没有起作用,因为我的端口是在docker里开的啊!那么这时候问题来了,firewalld咋把规则加在forward上呢。我发现firewalld其实是把iptables进行了一些包装而来的,内里还是iptables这一套,于是我就直接在iptables上加了forward规则:
iptables -L DOCKER -n --line-number # 先查询9200端口对应的docker序号
iptables -R DOCKER 3 -p tcp -m tcp -s 127.0.0.1 --dport 9200 -j ACCEPT
OK,接下来也不需要对iptables save也不需要systemctl restart,直接测试,发现外网已经访问不了9200端口了,同时本机是可以正常访问数据库的!完美!