2016-12-14 14:24:30 0 评论 Linux Boy.Lee

2017 Centos 6 Web服务器iptables经典配置常用规则列表

2016年底进行了一次较大规则的服务器转移,也正是这次的机会让我温习了一下Centos 6 iptables 相关规则,期间我在网络上进行了搜索,但是没有发现合适的基于Web服务器的相关文章,所以写下这片文章列出所有可能会用到的 iptables规则。

 

{ 服务器环境 }

标准LNMP(Centos 6.4 + php 5.6 + mysql 5.6 + nignx 1.10) Web 服务器

 

{ 需求分析 }

  1. 关闭所有不安全的端口
  2. 开放web 服务器所需的被访问端口
    1. ssh - 22 (或修改后端口)
    2. http - 80
    3. https - 443
    4. mysql - 3306 
    5. ftp - 21 + 被动端口
  3. 开放服务器上一般操作所需的端口
    1. dns - 53
    2. ping
    3. http - 80
    4. https - 443
    5. 发邮件 - 25
  4. 防御性配置,主要用来防止ddos等类型攻击

 

{ 规则列表 }

特别说明,所有规则不建议直接复制后使用,本文的目的在于逐条解释每条规则的意义和用法,在实际场景下会有顺序的变化,具体请看另外一篇文章  <<2017 CENTOS 6 WEB服务器 经典IPTABLES配置规则实例>>

###清理规则
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
#上面3条命令表示把全部的3条链路设置为开放,即所有访问都允许
iptables -F
iptables -X
#上面2条表示清空现有规则
#注意一定要依次运行上述5条规则,先设置3条链路开放再清空规则,如果直接清空规则会导致断开连接,这个时候直接硬重启机器即可恢复



###基础规则
#SSH
iptables -A INPUT -p tcp --dport 22  -j ACCEPT #ssh 端口22,默认端口22
iptables -A INPUT -p tcp --dport yiilib.com  -j ACCEPT #ssh 新端口 把如果新端口号为33333 则把yiilib.com换成33333即可
#因为ssh默认端口是22,而我们一般会修改端口,所以在切换的时候容易出问题,建议同时添加22和新端口2条命令,然后在切换完成后删除22 那条即可,具体删除方法见下文

#FTP
iptables -A INPUT -p tcp --dport 21 -j ACCEPT #ftp连接端口21
iptables -A INPUT -p tcp -m tcp --dport 50000:50100 -j ACCEPT  # ftp 被动端口 50000-51000
#在清理完规则后优先提示SSH和FTP规则是为了表示这2条规则的重要性,这是保命的规则,有这2条规则的前提下,你可以拥有ftp和ssh访问权限,就不会把自己关在门外了,话说玩iptables的人都应该有被关在门外的经历,说多了都是眼泪


#通用规则
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 #允许已经建立和相关的数据包出去

#loopback and localhost
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
#loopback是为127.0.0.1 这条规则这里主要是为了php-fpm访问127.0.0.1:9000端口这样的场景使用的

iptables -A INPUT -s localhost -d localhost -j ACCEPT #允许本地的数据包
iptables -A OUTPUT -s localhost -d localhost -j ACCEPT #允许本地数据包
#在一些案例中发现了localhost的写法,原则上使用loopback就足够了



###应用层面
#https
iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 443 -j ACCEPT #打开https需要用到的443端口,用户以https方式访问时使用
#没有配置output 是因为上面有了“#允许已经建立和相关的数据包出去” 下面同理

#http
iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT #打开http需要用到的80端口,用户以http方式访问时使用

#mysql
iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 3306 -j ACCEPT #主要用于mysql workbench远程数据管理,虽然知道不安全,但是有这么个坏习惯, 尽量使用比较复杂的用户名+密码,屏蔽root,应该也还行

#ss
iptables -A INPUT -p tcp --dport 8989 -j ACCEPT #允许ss从8989建立连接,然后output同 #https
#这部分原理上可行,我还没有测试过,因为现在这个需求越来越多,所以在这里列出


###服务器上操作支持
#从服务器访问其他网站(包括wget下载一些数据包, yum做一些操作),从服务器ping某一个域名,从服务器发送一封邮件等需要这些规则来做支持
#dns
iptables -A OUTPUT -p udp --dport 53 -j ACCEPT #打开DNS需要用到的53端口
#https
iptables -A OUTPUT -p tcp --dport 443 -j ACCEPT #访问其他服务器的https
#没有配置input 是因为上面有了“#允许已经建立和相关的数据包进入” 下面同理
#http
iptables -A OUTPUT -p tcp --dport 80 -j ACCEPT #访问其他服务器的http
#ntpdate
iptables -A OUTPUT -p tcp --dport 123 -j ACCEPT #使用ntpdate更新时间


###防御型规则

#处理IP碎片数量,防止攻击,允许每秒100个
iptables -A FORWARD -f -m limit --limit 100/sec --limit-burst 100 -j ACCEPT 

#设置ICMP包过滤,允许每秒1个包,限制触发条件是10个包
iptables -A FORWARD -p icmp -m limit --limit 1/s --limit-burst 10 -j ACCEPT 

# ddos
iptables -A INPUT -p tcp --dport 80 -m limit --limit 25/min --limit-burst 100 -j ACCEPT 



###关闭所有不安全的端口
iptables -A INPUT -j DROP
iptables -A OUTPUT -j DROP
iptables -A FORWARD -j DROP
#在这里设置全部DROP就是说所有不在上面提到的数据包全部都直接丢弃不做任何处理,至此所有需要的规则已经配置完成,除了我们上面允许的规则外,其他所有的访问都会被丢弃,这样就会安全许多,也有人会把OUTPUT and FROWARD设置成 ACCEPT,这样也是可以的,那么上面对应的OUTPUT and FORWARD规则就可以不设置

 

{ iptables查看和修改 }

#查看,删除和插入命令中第几条全都是根据查看结果计算的,从1开始计数数一下就好
iptables -L -n

#删除某一条
iptables -D OUTPUT 3 #删除OUTPUT 链路第三条
iptables -D INPUT 2
iptables -D FORWARD 2

#指定位置插入,
iptables -I INPUT 3 -p tcp -m tcp --dport 20 -j ACCEPT #在INPUT 第三条的位置插入20端口规则

 

{ 保存iptables }

原则上目前的iptables是临时的,也就是服务器一旦重启就会放弃本次修改,所以在修改完成后要进行保存,同时如果修改过程中出现了问题,比如无法使用SSH,直接硬重启就可以了。

###Save and apply
service iptables save #保存配置
service iptables restart #重启iptables

 

{ 复活 }

修改iptables最危险的地方在于设置错链路规则,导致自己无法访问自己的服务器,这个时候你需要参考下面4条规则恢复对服务器的控制权限。

  1. 如拥有SSH权限,登录后修改iptables列表
  2. 如拥有FTP权限,登录后修改/etc/sysconfig/iptables文件,然后重启服务器即可使修改的规则起效,在非必要的前提下不建议直接修改iptables文件,安全隐患较多
  3. 如拥有服务器重启控制权限,可以直接通过硬重启来恢复iptables到上一次保存的规则,原则上iptables 命令行修改的规则未保存的前提下,重启后会失效
  4. 联系机房重置iptables