一.iptables基础认知
二.iptables使用格式
一.iptables简介
1.Iptabels是与Linux内核集成的包过滤防火墙系统,几乎所有的linux发行版本都会包含Iptables的功能。如果 Linux 系统连接到因特网或LAN、服务器或连接 LAN 和因特网的代理服务器, 则Iptables有利于在 Linux 系统上更好地控制 IP 信息包过滤和防火墙配置。
2.netfilter/iptables过滤防火墙系统是一种功能强大的工具,可用于添加、编辑和除去规则,这些规则是在做信息包过滤决定时,防火墙所遵循和组成的规则。这些规则存储在专用的信息包过滤表中,而这些表集成在 Linux 内核中。在信息包过滤表中,规则被分组放在我们所谓的链(chain)中。虽然netfilter/iptables包过滤系统被称为单个实体,但它实际上由两个组件netfilter 和 iptables 组成。
3.netfilter 组件也称为内核空间(kernelspace),是内核的一部分,由一些信息包过滤表组成,这些表包含内核用来控制信息包过滤处理的规则集。通俗的理解为防火墙框架,承载并生效规则。
4.iptables 组件是一种工具,也称为用户空间(userspace),它使插入、修改和除去信息包过滤表中的规则变得容易。俗称为规则管理工具。
netfilter:功能
filter(“防火”):包过滤
NAT:Network Address Translation
mangle:拆解报文,做出修改,而后重新封装
raw:关闭nat表上启用的连接追踪机制
iptables:
PREROUTING
INPUT
FORWARD
OUTPUT
POSTROUTING
允许用户自定义规则链;它们需要手动关联至指定的”钩子“;
功能(表)<–>钩子
filter:input, forward, output
nat:prerouting, input, output, postrouting
mangle:prerouting, input, forward, output, postrouting
raw:prerouting, output
优先级(由高而低):raw –> mangle –> nat –> filter
iptables原理:
iptables的原理主要是对数据包的控制,看下图:
(1) 一个数据包进入网卡时,它首先进入PREROUTING链,内核根据数据包目的IP判断是否需要转发出去。
(2)如果数据包就是进入本机的,它就会沿着图向下移动,到达INPUT链。数据包到了INPUT链后,任何进程都会到 它。本机上运行的程序可以发送数据包,这些数据包会经 过OUTPUT链,然后到达POSTROUTING链输出。
(3)如果数据包是要转发出去的,且内核允许转发,数据包就会如图所示向右移动,经过 FORWARD链,然后到达 POSTROUTING链输出。
规则、表和链
1.规则(rules)
规则(rules)其实就是网络管理员预定义的条件,规则一般的定义为“如果数据包头符合这样的条件,就这样处 理这个数据包”。规则存储在内核空间的信息包过滤表中,这些规则分别指定了源地址、目的地址、传输协议 (TCP、UDP、ICMP)和服务类型(如HTTP、FTP和SMTP)等。当数据包与规则匹配时,iptables就根据规则所定义 的方法来处理这些数据包,如放行(accept)、拒绝(reject)和丢弃(drop)等。配置防火墙的主要工作就是 添加、修改和删除这些规则。
2.链(chains)
链(chains)是数据包传播的路径,每一条链其实就是众多规则中的一个检查清单,每一条链中可以有一条或数 条规则。当一个数据包到达一个链时,iptables就会从链中第一条规则开始检查,看该数据包是否满足规则所定 义的条件。如果满足,系统就会根据该条规则所定义的方法处理该数据包;否则iptables将继续检查下一条规 则,如果该数据包不符合链中任一条规则,iptables就会根据该链预先定义的默认策略来处理数据包。
3.表(tables)
表(tables)提供特定的功能,iptables内置了4个表,即raw表、filter表、nat表和mangle表,分别用于实现包 过滤,网络地址转换和包重构的功能。
(1)RAW表
只使用在PREROUTING链和OUTPUT链上,因为优先级最高,从而可以对收到的数据包在连接跟踪前进。一但使用了RAW表,在某个链上,RAW表处理完后,将跳过NAT表和ip_conntrack处理,即不再做地址转换和数包的链接跟踪处理了。
(2)filter表
主要用于过滤数据包,该表根据系统管理员预定义的一组规则过滤符合条件的数据包。对于防火墙而言,主要利用在filter表中指定的规则来实现对数据包的过滤。Filter表是默认的表,如果没有指定哪个表,iptables就默认使用fileter表来执行所有命令,filter表包含了INPUT链(处理进入的数据包),FORWARD链(处理转发的数据包),OUTPUT链(处理本地生成的数据包)在filter表中只能允许对数据包进行接受,丢弃的操作,而无法对数据包进行更改。(过滤,“防火墙”意义的核心所在)
(3)nat表
主要用于网络地址转换NAT,该表可以实现一对一,一对多,多对多等NAT工作,iptables就是使用该表实现共享上网的,NAT表包含了PREROUTING链(修改即将到来的数据包),POSTROUTING链(修改即将出去的数据包),OUTPUT(修改路由之前本地生成的数据包)
(4) mangle表
主要用于对指定数据包进行更改,在内核版本xx后的linux版本中该表包含的链为:INPUT(处理进入的数据包),FORWORD链(处理转发的数据包),OUTPUT链(处理本地生成的数据包)POSTROUTING链(修改即将出去的数据包),(修改即将到来的数据包)
4.规则表之间的优先顺序:
Raw—mangle—nat—filter
规则链之间的优先顺序(分三种情况):
第一种情况:入站数据流向
从外界到达防火墙的数据包,先被PREROUTING规则链处理(是否修改数据包地址等),之后会进行路由选择(判断该数据包应该发往何处),如果数据包 的目标主机是防火墙本机(比如说Internet用户访问防火墙主机中的web服务器的数据包),那么内核将其传给INPUT链进行处理(决定是否允许通 过等),通过以后再交给系统上层的应用程序(比如Apache服务器)进行响应。
第二冲情况:转发数据流向
来自外界的数据包到达防火墙后,首先被PREROUTING规则链处理,之后会进行路由选择,如果数据包的目标地址是其它外部地址(比如局域网用户通过网 关访问QQ站点的数据包),则内核将其传递给FORWARD链进行处理(是否转发或拦截),然后再交给POSTROUTING规则链(是否修改数据包的地 址等)进行处理。
第三种情况:出站数据流向
防火墙本机向外部地址发送的数据包(比如在防火墙主机中测试公网DNS服务器时),首先被OUTPUT规则链处理,之后进行路由选择,然后传递给POSTROUTING规则链(是否修改数据包的地址等)进行处理。
iptables是采用规则堆栈的方式来进行过滤,当一个封包进入网卡,会先检查 Prerouting,然后检查目的IP判断是否需要转送出去,接着就会跳到INPUT 或 Forward 进行过滤,如果封包需转送处理则检查 Postrouting,如果是来自本机封包,则检查 OUTPUT 以及Postrouting。过程中如果符合某条规则将会进行处理,处理动作除了 ACCEPT、REJECT、DROP、REDIRECT 和MASQUERADE 以外,还多出 LOG、ULOG、DNAT、SNAT、MIRROR、QUEUE、RETURN、TOS、TTL、MARK等,其中某些处理动作不会中断过滤程序,某些处理动作则会中断同一规则链的过滤,并依照前述流程继续进行下一个规则链的过滤(注意:这一点与ipchains不同),一直到堆栈中的规则检查完毕为止。透过这种机制所带来的好处是,我们可以进行复杂、多重的封包过滤,简单的说,iptables可以进行纵横交错式的过滤(tables)而非链状过滤(chains)。ACCEPT 将封包放行,进行完此处理动作后,将不再比对其它规则,直接跳往下一个规则链(nat:postrouting)。
二.iptables使用格式
1.iptables命令格式
iptables [-t 表] -命令 匹配 操作
(1)-t 表
表选项用于指定命令应用于哪个iptables内置表。
(2)命令
命令选项用于指定iptables的执行方式,包括插入规则,删除规则和添加规则,如下表所示
命令
-P –policy 《链名》 定义默认策略
-L –list 《链名》 查看iptables规则列表
-v, –verbose:详细信息
-vv
-n, –numeric:数字格式显示主机地址和端口号
-x: –exact:显示计数器的精确值,而非圆整后的数据
–line-numbers:列出规则时,显示其在链上的相应的编号
-S –list-rules [chain]:显示指定链的所有规则
-A –append 《链名》 在规则列表的最后增加一条规则
-I –insert 《链名》 在指定的位置插入一条规则
-D –delete chain rulenum 《链名》 根据规则编号删除规则
-D –delete chain rule-specification 根据规则本身删除规则
-R –replace 《链名》 替换规则列表中的某条规则
-F –flush 《链名》 删除表中所有规则
-Z –zero 《链名》 将表中数据包计数器和流量计数器归零
注意:每个规则都有两个计数器
packets:被本规则所匹配到的所有报文的个数
bytes: 被本规则所匹配到的所有报文的大小之和
-X –delete-chain 《链名》 删除用户自定义的引用计数为0的空链
-v –verbose 《链名》 与-L他命令一起使用显示更多更详细的信息
-N –new-chain chain: 《链名》 新建一个自定义的规则链:
-E –rename-chain old-chain new-chain 重命令链
(3)匹配规则
匹配选项指定数据包与规则匹配所具有的特征,包括源地址,目的地址,传输协议和端口号,如下表所示
基本匹配 说明
-i –in-interface 网络接口名》 指定数据包从哪个网络接口进入
-o –out-interface 网络接口名》 指定数据包从哪个网络接口输出
-p –proto 协议类型 指定数据包匹配的协议,如TCP、UDP和ICMP等
-s –source 源地址或子网》 指定数据包匹配的源地址
–sport 源端口号》 指定数据包匹配的源端口号
–dport 目的端口号》 指定数据包匹配的目的端口号
-m –math 匹配的模块 指定数据包规则所用的过滤模块
扩展匹配条件:
隐式扩展:在使用-p选项指明了特定的协议时,无需再同时使用-m选项指明扩展模块的扩展机制:
显示扩展:必须使用-m选项指明要调用的扩展模块的扩展机制:
隐式扩展:
-p tcp:可直接使用tcp扩展模块的专用选项:
[!] –source-port,–sport port[:port] 匹配报文源端口;可以给出多个端口,但只能是连续的端口范围 ;
[!] –destination-port,–dport port[:port] 匹配报文目标端口;可以给出多个端口,但只能是连续的端口范围 ;
[!] –tcp-flags mask comp 匹配报文中的tcp协议的标志位;Flags are: SYN ACK FIN RST URG PSH ALL NONE;
mask:要检查的FLAGS list,以逗号分隔;
comp:在mask给定的诸多的FLAGS中,其值必须为1的FLAGS列表,余下的其值必须为0;
–tcp-flags SYN,ACK,FIN,RST SYN
–tcp-flags ALL ALL
–tcp-flags ALL NONE
[!] –syn: –tcp-flags SYN,ACK,FIN,RST SYN
-p udp:可直接使用udp协议扩展模块的专用选项:
[!] –source-port,–sport port[:port]
[!] –destination-port,–dport port[:port]
[!] –icmp-type {type[/code]|typename}
0/0: echo reply
8/0: echo request
显示扩展:必须使用-m选项指明要调用的扩展模块的扩展机制:
1、multiport
以离散或连续的 方式定义多端口匹配条件,最多15个;
[!] –source-ports,–sports port[,port|,port:port]…:指定多个源端口;
[!] –destination-ports,–dports port[,port|,port:port]…:指定多个目标端口;
# iptables -I INPUT -d 172.16.0.7 -p tcp -m multiport –dports 22,80,139,445,3306 -j ACCEPT
2、iprange
以连续地址块的方式来指明多IP地址匹配条件;
[!] –src-range from[-to]
[!] –dst-range from[-to]
# iptables -I INPUT -d 172.16。0.7 -p tcp -m multiport –dports 22,80,139,445,3306 -m iprange –src-range 172.16.0.61-172.16.0.70 -j REJECT
3、time
This matches if the packet arrival time/date is within a given range.
–timestart hh:mm[:ss]
–timestop hh:mm[:ss]
[!] –weekdays day[,day…]
[!] –monthdays day[,day…]
–datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]]
–datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]]
–kerneltz:使用内核配置的时区而非默认的UTC;
4、string
This modules matches a given string by using some pattern matching strategy.
–algo {bm|kmp}
[!] –string pattern
[!] –hex-string pattern
–from offset
–to offset
~]# iptables -I OUTPUT -m string –algo bm –string “gay” -j REJECT
5、connlimit
Allows you to restrict the number of parallel connections to a server per client IP address (or client address block).
–connlimit-upto n
–connlimit-above n
~]# iptables -I INPUT -d 172.16.0.7 -p tcp –syn –dport 22 -m connlimit –connlimit-above 2 -j REJECT
6、limit
This module matches at a limited rate using a token bucket filter.
–limit rate[/second|/minute|/hour|/day]
–limit-burst number
~]# iptables -I OUTPUT -s 172.16.0.7 -p icmp –icmp-type 0 -j ACCEPT
7、state
The “state” extension is a subset of the “conntrack” module. “state” allows access to the connection tracking state for this packet.
[!] –state state
INVALID, ESTABLISHED, NEW, RELATED or UNTRACKED.
NEW: 新连接请求;
ESTABLISHED:已建立的连接;
INVALID:无法识别的连接;
RELATED:相关联的连接,当前连接是一个新请求,但附属于某个已存在的连接;
UNTRACKED:未追踪的连接;
state扩展:
内核模块装载:
nf_conntrack
nf_conntrack_ipv4
手动装载:
nf_conntrack_ftp
追踪到的连接:
/proc/net/nf_conntrack
调整可记录的连接数量最大值:
/proc/sys/net/nf_conntrack_max
超时时长:
/proc/sys/net/netfilter/timeout
iptables执行规则时,是从规则表中从上至下顺序执行的,如果没遇到匹配的规则,就一条一条往下执行,如果遇到匹配的规则后,那么就执行本规则,执行后根据本规则的动作(accept,reject,log,drop等),决定下一步执行的情况,后续执行一般有三种情况。
一种是继续执行当前规则队列内的下一条规则。比如执行过Filter队列内的LOG后,还会执行Filter队列内的下一条规则。
一种是中止当前规则队列的执行,转到下一条规则队列。比如从执行过accept后就中断Filter队列内其它规则,跳到nat队列规则去执行
一种是中止所有规则队列的执行。
2.iptables规则的动作
iptables处理动作(跳转目标):
-j targername [per-targer-option]
简单target:ACCEPT(接受),DROP(丢弃)
扩展target:
REJECT
–reject-with type
LOG
–log-level
–log-perfix
用户自定义链做为target:
REJECT 拦阻该数据包,并返回数据包通知对方,可以返回的数据包有几个选择:ICMP port-unreachable、ICMP echo-reply 或是tcp-reset(这个数据包包会要求对方关闭联机),进行完此处理动作后,将不再比对其它规则,直接中断过滤程序。 范例如下:
LOG 将数据包相关信息记录在/var/log中,详细位置请查阅/etc/syslog.conf配置文件,进行完此处理动作后,将会继续比对其它规则。列如:
3.保存和载入规则
保存:iptables-save > /PATH/TO/SOME_RULE_FILE
重载:iptables-restore < /PATH/FROM/SOME_RULE_FILE
-n,–noflush:不清除原有规则
-t,–test: 仅分析生成规则集,但不提交
CentOS 6:
保存规则:
service iptables save
保存规则于/etc/sysconfig/iptables文件,覆盖保存:
重载规则:
service iptables restart
默认重载/etc/sysconfig/iptables文件中的规则
配置文件:/etc/sysconfig/iptables-config
CentOS 7:
(1) 自定义Unit File,进行iptables-restore
(2)firewalldfuwu
(3)自定义脚本
规则优化的思路:
使用自定义链管理特定应用的相关规则,模块化管理规则
(1) 优先放行双方向状态为ESTABLISHED的报文;
(2) 服务于不同类别的功能的规则,匹配到报文可能性更大的放前面;
(3) 服务于同一类别的功能的规则,匹配条件较严格的放在前面;
(4) 设置默认策略:白名单机制
(a) iptables -P,不建议;
(b) 建议在规则的最后定义规则做为默认策略;
原创文章,作者:xialingfeng,如若转载,请注明出处:http://www.178linux.com/74736