通过一次redis防火墙配置来总结一下iptables
iptables
项目上线了很多国家和地区,不同地区的发行商提供的云服务器都不太一样,亚马逊云算好的,好多乱七八糟的地方云厂商提供的各种云服务器的配置都不太一样,很多机器拿来用的时候经常会遇到关于iptables的奇怪问题,时间久了我一般都是拿到机器后直接先把iptables stop 掉。 直到项目上使用了redis之后,我发现redis在安全性上并不强壮,必须要借助iptables来辅助一下,记录一下iptables的使用情况。
iptables 配置文件路径
/etc/sysconfig/iptables
#修改后重启服务
service iptables restart
redis服务器上(codis)的iptables配置:
# Generated by iptables-save v1.4.7 on Sat May 7 13:57:07 2016
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [1:140]
-A INPUT -s 120.1.1.1/32 -p tcp --dport 19000 -j ACCEPT
-A INPUT -s 120.2.2.2/32 -p tcp --dport 19000 -j ACCEPT
-A INPUT -s 120.3.3.3/32 -p tcp --dport 19000 -j ACCEPT
-A INPUT -p tcp --dport 19000 -j DROP
COMMIT
# Completed on Sat May 7 13:57:07 2016
这个配置的作用是,允许120.1.1.1,120.2.2.2,120.3.3.3这三台服务器访问19000端口,然后用-A INPUT -p tcp --dport 19000 -j DROP
禁止其他所有地址对19000端口的访问,这样的话就只有这三台ip的机器可以访问redis的19000端口。为了实现这个需求走了一些弯路,一开始我的配置是这样的:
# Generated by iptables-save v1.4.7 on Sat May 7 13:57:07 2016
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [1:140]
-I INPUT -s 120.1.1.1/32 -p tcp --dport 19000 -j ACCEPT
-I INPUT -s 120.2.2.2/32 -p tcp --dport 19000 -j ACCEPT
-I INPUT -s 120.3.3.3/32 -p tcp --dport 19000 -j ACCEPT
-I INPUT -p tcp --dport 19000 -j DROP
COMMIT
# Completed on Sat May 7 13:57:07 2016
这个配置始终“不生效”,没有达到我想要的结果,其实我并没有搞懂-A和-I的区别,-A是添加一条命令到防火墙规则的后面,类似stl中的push_back,而-I则类似stl中的push_front。 而iptables是根据规则从前到后进行解释的,也就是说如果用-I的话相当于第一条就执行了-I INPUT -p tcp --dport 19000 -j DROP
,这样的话后面不管写什么规则都没有用了。。。
一些其他关于iptables的使用经验
允许来自外部的ping测试
iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
iptables -A OUTPUT -p icmp --icmp-type echo-reply -j ACCEPT