Apache Solr 是一个开源的搜索服务器,该平台默认允许匿名访问,攻击者可读取平台中各类敏感信息。之前考虑过增加账号密码访问,但是没有搞定,所以采用了曲线救国的方式,设置solr服务器只允许部分IP访问。
ubuntu下iptables的设置参见: https://www.tuicool.com/articles/QvQNZbu
iptables -I INPUT -p tcp --dport 12580 -j DROP iptables -I INPUT -s 114.55.**.*** -p tcp --dport 12580 -j ACCEPT iptables -I INPUT -s 210.12.***.**/27 -p tcp --dport 12580 -j ACCEPT iptables -I FORWARD -p tcp --dport 12580 -j DROP iptables -I FORWARD -s 114.55.**.*** -p tcp --dport 12580 -j ACCEPT iptables -I FORWARD -s 210.12.***.**/27 -p tcp --dport 12580 -j ACCEPT
第一条命令是插入命令,禁止所有ip访问12580端口
第二条命令是插入命令,允许线上服务器 114.55.**.*** 访问solr服务器
第三条命令是插入命令,允许公司ip段访问solr服务器
设置完成后,测试发现,公司ip和线上服务均不能访问solr服务。想起因为为了部署方便,我们的程序一直是通过域名访问的。我们把host:12580端口映射到了solr.project.company.cn。当访问solr.project.company.cn时,dns服务会把请求转发到solr服务器host:80端口,solr服务器上的nginx服务把这个请求/solr 下的请求转发到12580端口。
# /etc/nginx/conf.d/solr.conf server { server_name localhost; location /solr/ { proxy_pass http://127.0.0.1:12580; } }
因此要允许本机访问12580端口
iptables -I INPUT -s 127.0.0.1 -p tcp --dport 12580 -j ACCEPT
再次测试,线上服务器和公司ip都可以访问solr服务了。不过既然是通过nginx转发请求,那么仍然限制不住其他ip不加端口访问。用手机测试了一下,果然这样。
在确保没有其他服务在使用转发服务后。同样对80端口限制了ip访问,那么问题解决了。
为了是iptables的配置生效,需要保存配置,并且能够重启后自动生效。使用
# 保存 /etc/rc.d/init.d/iptables save # 重启服务 service iptables restart
结果发现分别报:
# 保存 no such file or directory: /etc/rc.d/init.d/iptables # 重启 iptables: unrecognized service
因为ubuntu下配置不同。
参考http://blog.phiy.me/debian-iptables-persistent/ 安装iptables-persistent
apt-get install iptables-persistent
安装过程中需要点击两次yes。这会在/etc/iptables/下生产rules.v4 和rules.v6两个文件,分别保存ipv4和ipv6下的规则。
以后再次修改的话,保存
iptables-save > /etc/iptables/rules.v4
OK。