环境 Centos6.5 + nginx + php(phpfpm) + mysql 组成的 web 服务器,
主要需要做的事情包括: 80 and 443 web 服务, ftp 服务, mysql 远程登录管理, SS 备用(并非主力服务器算是一台测试备用服务器所以加了一个 SS 备用)
我算是 php 玩家对于 centos 和运维基本不太懂,网上找了一圈没找到合适的文章,所以自己花了几个小时学习了一下,写出了下面一份规则,希望能在大家的帮助下,完成一份较经典的 web 服务器 iptables 命令集合,方便后来人。我也承诺最后会 append 一个完成的列表, 希望能不吝赐教,谢谢。
#################################### iptables plan v1.0 ####################################
#清空所有规则
iptables -F
iptables -X
###Basic
# basic.ssh
iptables -A INPUT -p tcp --dport 22 -j ACCEPT #ssh 端口 22 ,如已修改需要改成对应的
#basic.ftp
iptables -A INPUT -p tcp --dport 21 -j ACCEPT #ftp 连接端口 21
iptables -A INPUT -p tcp -m tcp --dport 50000:51000 -j ACCEPT # ftp 被动端口 50000-51000
#以上 2 组写在最前面是为了保证救命,话说每个玩 iptables 的人都应该有被关在门外的经历,说多了都是眼泪
#basic.rules
iptables -A INPUT -p icmp --icmp-type any -j ACCEPT #允许 icmp 包进入
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT #允许已经建立和相关的数据包进入
iptables -A OUTPUT -p icmp --icmp any -j ACCEPT #允许 icmp 包出去
iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT #允许已经建立和相关的数据包出去
#basic.localhost and loopback
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
iptables -A INPUT -s localhost -d localhost -j ACCEPT #允许本地的数据包
iptables -A OUTPUT -s localhost -d localhost -j ACCEPT #允许本地数据包
#@@ 问题一:原则上这 2 个应该是一样的留上面 lo 那组就行了吧?
###Application
#app.rules
#https
iptables -A INPUT -P tcp --dport 443 -j ACCEPT #打开 https 需要用到的 443 端口,用户以 https 方式访问是使用
#没有配置 output 是因为上面有了“#允许已经建立和相关的数据包出去” 下面同理
#http
iptables -A INPUT -P tcp --dport 80 -j ACCEPT #打开 https 需要用到的 443 端口,用户以 https 方式访问是使用
#mysql
iptables -A INPUT -p tcp --dport 3306 -j ACCEPT #主要用于 mysql workbench 远程数据管理,虽然知道不安全,但是有这么个坏习惯, 尽量使用比较复杂的用户名+密码,屏蔽 root ,应该也还行
#ss.rules
#ss
iptables -A INPUT -P tcp --dport 8989 -j ACCEPT #允许 ss 从 8989 建立连接,然后 output 同 #app.rules
#@@ 问题二:不知道这个规则能否应付 ss 的需求,对这个部分没有概念,是不是还要做对应的 forward 配置?求解说谢谢。
###Option rules
#opt.web access, 从服务器访问其他网站,如果问题二的功能不需要这个部分支持,这里就不会配置
iptables -A OUTPUT -p udp --dport 53 -j ACCEPT #打开 DNS 需要用到的 53 端口
iptables -A OUTPUT -P tcp --dport 443 -j ACCEPT #访问其他服务器的 https
#没有配置 input 是因为上面有了“#允许已经建立和相关的数据包进入” 下面同理
iptables -A OUTPUT -P tcp --dport 80 -j ACCEPT #访问其他服务器的 http
#@@ 问题三,原则上 web 服务器不需要使用这些功能,但是我对 53 端口有疑问,如果要使用 ping
baidu.com 和 wget
http://baidu.com/a.zip 这种功能是不是最少也要打开 output 的 53+80 ? 因为中间有域名 ip 转换的需要这个应该是需要通过 53 发包出去,然后 wget 的时候应该需要通过 80 发包出去
###Adv
#adv.basic
iptables -A FORWARD -f -m limit --limit 100/sec --limit-burst 100 -j ACCEPT #处理 IP 碎片数量,防止攻击,允许每秒 100 个
iptables -A FORWARD -p icmp -m limit --limit 10/s --limit-burst 10 -j ACCEPT #设置 ICMP 包过滤,允许每秒 1 个包,限制触发条件是 10 个包
#@@ 问题四:这里是不是应该还有其他策略?欢迎补齐
##Forbid Rest
iptables -A INPUT -j REJECT --reject-with icmp-host-prohibited
iptables -A OUTPUT -j REJECT --reject-with icmp-host-prohibited
iptables -A FORWARD -j REJECT --reject-with icmp-host-prohibited
# 意思是在 INPUT 表, OUTPUT 表和 FORWARD 表中拒绝所有其他不符合上述任何一条规则的数据包。并且发送一条 host prohibited 的消息给被拒绝的主机。
#@@ 问题五:据说这样比直接 drop 要好点?我觉得有了上面的 basic.ssd and basic.ftp 已经可以做到不死之身了吧?欢迎指出差别
###Save and apply
service iptables save #保存配置
service iptables restart #重启 iptables
#################################### 结束下面为讨论部分 ####################################
#@@ 问题 6:之前的规则里还有这 2 条没看懂
-A syn-flood -p tcp -m limit --limit 3/sec --limit-burst 6 -j RETURN
-A syn-flood -j REJECT --reject-with icmp-port-unreachable
# @@ 问题7 还想问问这2个写法的区别,第一种会自动补全 -m tcp吗?
-A INPUT -p tcp -m tcp --dport 21 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 21 -j ACCEPT