1.安装iptables防火墙
yum install iptables
2. 清除已有的iptables规则
iptables -F
iptables -X
iptables -Z
3.显示iptables规则数
iptables -L -n --line-numbers
4. 删除已经添加的iptables规则
iptables -D INPUT 8
5.iptables开机自动启动保存
chkconfig --level 345 iptables on
service iptables save
iptables简介
netfilter/iptables(简称为iptables)组成Linux平台下的包过滤防火墙,与大多数的Linux软件一样,这个包过滤防火墙是免费的,它可以代替昂贵的商业防火墙解决方案,完成封包过滤、封包重定向和网络地址转换(NAT)等功能。
iptables基础
规则(rules)其实就是网络管理员预定义的条件,规则一般的定义为“如果数据包头符合这样的条件,就这样处理这个数据包”。规则存储在内核空间的信息包过滤表中,这些规则分别指定了源地址、目的地址、传输协议(如TCP、UDP、ICMP)和服务类型(如HTTP、FTP和SMTP)等。当数据包与规则匹配时,iptables就根据规则所定义的方法来处理这些数据包,如放行(accept)、拒绝(reject)和丢弃(drop)等。配置防火墙的主要工作就是添加、修改和删除这些规则。
iptables和netfilter的关系:
这是第一个要说的地方,Iptables和netfilter的关系是一个很容易让人搞不清的问题。很多的知道iptables却不知道netfilter。其实iptables只是Linux防火墙的管理工具而已,位于/sbin/iptables,真正实现防火墙功能的是netfilter,它是Linux内核中实现包过滤的内部结构。
iptables传输数据包的过程
① 当一个数据包进入网卡时,它首先进入PREROUTING链,内核根据数据包目的IP判断是否需要转送出去。
② 如果数据包就是进入本机的,它就会沿着图向下移动,到达INPUT链,数据包到了INPUT链后,任何进程都会收到它,本机上运行的程序可以发送数据包,这些数据包会经过OUTPUT链,然后到达POSTROUTING链输出。
③ 如果数据包是要转发出去的,且内核允许转发,数据包就会如图所示向右移动,经过FORWARD链,然后到达POSTROUTING链输出。
iptables的规则表和链:
表(tables)提供特定的功能,iptables内置了4个表,即filter表、nat表、mangle表和raw表,分别用于实现包过滤,网络地址转换、包重构(修改)和数据跟踪处理。
链(chains)是数据包传播的路径,每一条链其实就是众多规则中的一个检查清单,每一条链中可以有一条或数条规则。当一个数据包到达一个链时,iptables就会从链中第一条规则开始检查,看该数据包是否满足规则所定义的条件。如果满足,系统就会根据该条规则所定义的方法处理该数据包;否则iptables将继续检查下一条规则,如果该数据包不符合链中任一条规则,iptables就会根据该链预先定义的默认策略来处理数据包。
Iptables采用“表”和“链”的分层结构。在REHL4中是三张表五个链,现在REHL5成了四张表五个链了,不过多出来的那个表用的也不太多,所以基本还是和以前一样。下面罗列一下这四张表和五个链。注意一定要明白这些表和链的关系及作用。
规则表:
1.filter表——三个链:INPUT、FORWARD、OUTPUT
作用:过滤数据包 内核模块:iptables_filter.
2.Nat表——三个链:PREROUTING、POSTROUTING、OUTPUT
作用:用于网络地址转换(IP、端口) 内核模块:iptable_nat
3.Mangle表——五个链:PREROUTING、POSTROUTING、INPUT、OUTPUT、FORWARD
作用:修改数据包的服务类型、TTL、并且可以配置路由实现QOS内核模块:iptable_mangle(别看这个表这么麻烦,咱们设置策略时几乎都不会用到它)
4.Raw表——两个链:OUTPUT、PREROUTING
作用:决定数据包是否被状态跟踪机制处理 内核模块:iptable_raw
(这个是REHL4没有的,不过不用怕,用的不多)
规则链:
1.INPUT——进来的数据包应用此规则链中的策略
2.OUTPUT——外出的数据包应用此规则链中的策略
3.FORWARD——转发数据包时应用此规则链中的策略
4.PREROUTING——对数据包作路由选择前应用此链中的规则
(记住!所有的数据包进来的时侯都先由这个链处理)
5.POSTROUTING——对数据包作路由选择后应用此链中的规则
(所有的数据包出来的时侯都先由这个链处理)
规则表之间的优先顺序:
Raw——mangle——nat——filter
规则链之间的优先顺序(分三种情况):
第一种情况:入站数据流向
从外界到达防火墙的数据包,先被PREROUTING规则链处理(是否修改数据包地址等),之后会进行路由选择(判断该数据包应该发往何处),如果数据包的目标主机是防火墙本机(比如说Internet用户访问防火墙主机中的web服务器的数据包),那么内核将其传给INPUT链进行处理(决定是否允许通过等),通过以后再交给系统上层的应用程序(比如Apache服务器)进行响应。
第二冲情况:转发数据流向
来自外界的数据包到达防火墙后,首先被PREROUTING规则链处理,之后会进行路由选择,如果数据包的目标地址是其它外部地址(比如局域网用户通过网关访问QQ站点的数据包),则内核将其传递给FORWARD链进行处理(是否转发或拦截),然后再交给POSTROUTING规则链(是否修改数据包的地址等)进行处理。
第三种情况:出站数据流向
防火墙本机向外部地址发送的数据包(比如在防火墙主机中测试公网DNS服务器时),首先被OUTPUT规则链处理,之后进行路由选择,然后传递给POSTROUTING规则链(是否修改数据包的地址等)进行处理。
防火墙修改示例:
service iptables status可以查看到iptables服务的当前状态 /etc/init.d/iptables stop /etc/init.d/iptables start
封单个IP的命令
iptables -I INPUT -s 211.1.0.0 -j DROP
封IP段的命令是
iptables -I INPUT -s 211.1.0.0/16 -j DROP
iptables -I INPUT -s 211.2.0.0/16 -j DROP
iptables -I INPUT -s 211.3.0.0/16 -j DROP
封整个段的命令是
iptables -I INPUT -s 211.0.0.0/8 -j DROP
封几个段的命令是
iptables -I INPUT -s 61.37.80.0/24 -j DROP
iptables -I INPUT -s 61.37.81.0/24 -j DROP
服务器启动自运行
有三个方法:
1、把它加到/etc/rc.local中
2、iptables-save >;/etc/sysconfig/iptables可以把你当前的iptables规则放到/etc/sysconfig/iptables中,系统启动iptables时自动执行。
3、service iptables save 也可以把你当前的iptables规则放/etc/sysconfig/iptables中,系统启动iptables时自动执行。
后两种更好此,一般iptables服务会在network服务之前启来,更安全
解封:
iptables -L INPUT
iptables -L --line-numbers 然后iptables -D INPUT 序号
----------------------------------------------------
防火墙端口操作
开启端口:
#/sbin/iptables -I INPUT -p tcp --dport 80 -j ACCEPT
#/sbin/iptables -I INPUT -p tcp --dport 22 -j ACCEPT
然后保存:
#/etc/rc.d/init.d/iptables save
关闭端口:
#/sbin/iptables -I INPUT -p tcp --dport 80 -j DROP
#/sbin/iptables -I INPUT -p tcp --dport 22 -j DROP
然后保存:
#/etc/rc.d/init.d/iptables save
-------------------------
iptables -F /* 清除所有规则 */ iptables -A INPUT -p tcp --dport 22 -j ACCEPT /*允许包从22端口进入*/ iptables -A OUTPUT -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT /*允许从22端口进入的包返回*/ iptables -A OUTPUT -p udp --dport 53 -j ACCEPT /* 域名解析端口,一般不开 */ iptables -A INPUT -p udp --sport 53 -j ACCEPT /* 域名解析端口,一般不开 */ iptables -A INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT /*允许本机访问本机*/ iptables -A OUTPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT iptables -A INPUT -p tcp -s 0/0 --dport 80 -j ACCEPT /*允许所有IP访问80端口*/ iptables -A OUTPUT -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT iptables-save > /etc/sysconfig/iptables /*保存配置*/ iptables -L /* 显示iptables列表 */
首先简单介绍一下什么是IPTables:
iptables是Linux内核中内置的防火墙,可以允许管理员通过设置table, chain以及相关的规则来进行数据包过滤和NAT。 一般来讲,iptables防火墙已经内置于CentOS 6及其他Linux版本中,而且iptables服务默认都是启动的。 iptables应用于IPv4, 如果要用IPv6,需要使用ip6tables.
iptables [-t table] command [chain] [rules] [-j target]
[-t table] :用来指明使用的表, 有三种选项: filter, nat 和 mangle,如果未指定,则使用filter作为缺省表。 事实上,对于单个服务器的防火墙配置,一般来讲,我们只需要对filter表进行配件就OK了。filter表包括 INPUT, OUTPUT,和FORWARD三个chain.
command 表明iptables命名要做什么,比如
-A (–append): 该命令会把一条规则附件到chain的末尾。
-D(–delete)用来删除某个规则。
-F (–flush) 如果指定了chain, 删除该chain中的所有规则,如果未指定chain, 则删除所有chain中的所有规则。
target: 是由规则指定的操作。 包括下面几种:
ACCEPT: 接收信息包(允许它前往目的地),并且将停止遍历chain.
DROP: 拒绝,
此外还有REJECT, RETURN, LOG, REDIRECT, MARK, MIRROR, MAQUERADE等。
具体的iptables的语法和概念就不再多说了,请参照iptables man page 官方文档 .
简单来说,iptables防火墙是由一系列的规则(rule)组成, 一个数据请求进来, 会依次和这些规则进行比较,如果正好符合规则的定义,那这个数据请求要么会被接收ACCEPT,要么被拒绝DRIP。如果不符合任何规则的定义,最后缺省的规则会被应用。
开始操作之前:
注意:一定要把你在DigitalOcean/ Linode/ 阿里云上的服务器做一下快照备份 , 否则一旦你 iptables的配置出了问题,极有可能把你自己挡在门外,你自己都无法连接到服务器了!! 出现这种情况可是会欲哭无泪呀,除了重新做系统好像没有更好的办法了。( DigitalOcean提供了一个web console的界面,有时候会给你反悔和擦除iptables设置的机会,但阿里云没有)决定哪些端口需要开放,首先, SSH 的端口22自然是需要开放的,否则我们就无法登录服务器了。一般来讲,CentOS的VPS经常作为用LAMP搭建的Web服务器,FTP服务器, Mail服务器等。对于Web服务来说,需要开放80端口,如果是HTTPS/SSL协议的话,还需用开放443端口,对于Mail服务来说,由于涉及SMTP, POP3, IMAP协议,需要开放的端口如下:
SMTP : 25 Secure SMTP:465 POP3: 110 Secure POP3: 995 IMAP: 143 IMAP over SSL: 993
对于FTP服务来说,需要开放 20, 21两个端口
第一步: 屏蔽最常见的攻击
缺省情况下,CentOS的iptables的设置是允许任何数据通过的。
我们首先要清空iptables中的所有的规则:
iptables -F
然后我们加上阻止简单扫描和攻击的规则
1 iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP #NONE 包(所有标识bit都没有设置)主要是扫描类的数据包 2 iptables -A INPUT -p tcp ! --syn -m state --state NEW -j DROP #防止sync-flood 攻击 3 iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP #ALL包(所有的标注bit都被设置了)也是网络扫描的数据包
第二步: 为相应的服务开放对应的端口
首先我们应该接受本机localhost的任何请求,否则,数据库连接等将无法工作
iptables -A INPUT -i lo -j ACCEPT
对于不同的服务需要开放不同的端口
1 iptables -A INPUT -p tcp --dport 22 -j ACCEPT # SSH 2 iptables -A INPUT -p tcp --dport 80 -j ACCEPT # HTTP 3 iptables -A INPUT -p tcp --dport 443 -j ACCEPT #HTTPS 4 iptables -A INPUT -p tcp --dport 25 -j ACCEPT #SMTP 5 iptables -A INPUT -p tcp --dport 465 -j ACCEPT #Secure SMTP 6 iptables -A INPUT -p tcp --dport 110 -j ACCEPT #POP3 7 iptables -A INPUT -p tcp --dport 995 -j ACCEPT #Secure POP3 8 iptables -A INPUT -p tcp --dport 143 -j ACCEPT #IMAP 9 iptables -A INPUT -p tcp --dport 993 -j ACCEPT #Secure IMAP
第三步: 加上通用的规则
首先要允许所有从服务器端发起的连接,由此返回的响应数据应该是允许的!比如VPS发起的yum update , 必须要允许外部的update数据进来
iptables -I INPUT -m state --state ESTABLISHED, RELATED -j ACCEPT
最后,设置缺省的策略:屏蔽任何进入的数据请求,允许所有从Server发出的请求
1 iptables -P OUTPUT ACCEPT 2 iptables -P INPUT DROP
第四步: 保存设置
首先通过下面的命令查看一下我们的设置是否正确!
1 ptable -L -n
确认没有问题后,执行下面的命令
1 service iptables save
执行上述命令后,相应的规则会写入 /etc/sysconfig/iptables这个文件,你可以检查一下看看。
最后执行
1 service iptables restart
重新启动iptables防火墙,以使上述设置生效。
最佳的方法:
为了更方便的修改和维护自己的iptables的设置,我一般是把所有的iptables的设置先写到一个单独文件中,测试没有问题后。然后再保存到iptable的配置文件中。下面是我自己的iptables文件:~/script/firewall.sh
1 </pre> 2 #!/bin/bash 3 # A simple iptables firewall configuration 4 5 PATH=/sbin:/bin:/usr/sbin:/usr/bin; export PATH 6 7 #flush/erase original rules 8 iptables -F #清除所有已制定的rule 9 iptables -X #清除用户自定义的chain/table 10 iptables -Z #将所有的chain的计数和流量统计归零 11 12 #Accept localhost connetting, no matter what it is 13 iptables -A INPUT -i lo -j ACCEPT 14 15 #Accept any response package which is initiated from inside 16 iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT 17 18 #block most common network attacks(recon packets and syn-flood attack) 19 iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP 20 iptables -A INPUT -p tcp ! --syn -m state --state NEW -j DROP 21 iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP 22 23 #open ports for different services 24 iptables -A INPUT -p tcp --dport 22 -j ACCEPT #SSH 25 iptables -A INPUT -p tcp --dport 80 -j ACCEPT #HTTP 26 #iptables -A INPUT -p tcp --dport 443 -j ACCEPT #HTTPS 27 #iptables -A INPUT -p tcp --dport 25 -j ACCEPT #SMTP 28 #iptables -A INPUT -p tcp --dport 465 -j ACCEPT #Secure SMTP 29 #iptables -A INPUT -p tcp --dport 110 -j ACCEPT #POP3 30 #iptables -A INPUT -p tcp --dport 995 -j ACCEPT #Secure POP 31 32 #ICMP configuration 33 #To prevent ICMP DDOS,we do not allow ICMP type 8(echo-request) or limit this request with 1/second 34 #some ICMP requests are allowed. 35 icmp_type="0 3 4 11 12 14 16 18" 36 for ticmp in $icmp_type 37 do 38 iptables -A INPUT -p icmp --icmp-type $ticmp -j ACCEPT 39 done 40 #iptables -A INPUT -p icmp --icmp-type 8 -m limit --limit 1/second -j ACCEPT 41 42 #default policies 43 iptables -P OUTPUT ACCEPT 44 iptables -P INPUT DROP 45 46 #save to /etc/sysconfig/iptables 47 /etc/init.d/iptables save