Iptables
防火墙工作在网络的边缘,对进出网络的IP、数据进行检测。
Linux防火墙的发展历史
linux内核从很早的时候就实现了网络防火墙的功能,并为用户提供了管理防火墙规则的命令工具。
在2.0版本的内核中,包过滤机制是ipfw,管理防火墙规则的命令工具是ipfwadm。
在2.2版本的内核中,包过滤机制是ipchain,管理防火墙规则的命令工具是ipchains。
在2.4版本的内核开始,包过滤机制是netfiter,管理防火墙的命令工具是iptables。
netfiter和iptables
netfiter:指的是linux内核中实现包过滤防火墙的内部结构,不以文件或程序的形式存在,属于“内核态”(Kernel Space)的防火墙功能体系。
Iptables:指的是管理防火墙的命令工具,属于“用户态”(User Space)的防火墙功能体系。
Iptables 的规则表、链结构
Iptables分为四表五链
规则表
按照防火墙策略的不同用途,iptables管理着四个不同的规则表,其功能分别由独立的内核模块实现。
filter 表主要用于对数据包进行过滤,根据具体的规则决定是否放行该数据包,filter 表对应的内核模块为 iptable_filter。
nat (Network Address Translation,网络地址转换)表主要用于修改数据包的IP地址、端口号等信息,nat 表对应的内核模块为 iptable_nat。
mangle表主要用于修改数据包的TOS(Type Of Service,服务类型)、TTL(Time To Live,生存周期)指以及为数据包设置Mark标记,以实现Qos(Quality Of Service,服务质量)调整以及策略路由等应用,由于需要相应的路由设备支持,因此应用并不广泛,mangle 表对应的内核模块为 iptable_mangle。
raw表是自1.2.9以后版本的iptables新增的表,主要用于决定数据包是否被状态跟踪机制处理。在匹配数据包时,raw表的规则要优先于其他表,raw表对应的内核模块为iptable_raw。
注:在iptables的四个规则表中,mangle表和raw的表应用相对较少,下面主要介绍filter表和nat表的防火墙应用。
规则链
在处理各种数据包时,根据防火墙规则的不同介入时机,iptables供涉及5种默认规则链,其应用时间点分别对应如下。
INPUT链:当接收到防火墙本机地址的数据包(入站)时,应用此链中的规则。
OUTPUT链:当防火墙本机向外发送数据包(出战)时,应用次链中的规则。
FORWARD链:当接收到需要通过防火墙发送给其他地址的数据包(转发)时,应用次链中的规则。
PREROUTING链:在对数据包作路由选择之前,应用次链中的规则。
POSTROUTING链:在对数据包作路由选择之后,应用次链中的规则。
注:期中INPUT、OUTPUT链更多的应用在“主机防火墙”中,即主要针对服务器本机进出数据的安全控制;而FORWARD、PREROUTING、POSTROUTING链更多的应用在“网络防火墙”中,特别是防火墙服务器作为网关使用时的情况。
数据包过滤的匹配优先级:
入站数据流向:外界的数据包到达防火墙后,首先会被PREROUTING链处理,之后进行路由选择(判断该数据包去往何处),如果数据包的目标地址是防火墙本机,那么内核将其传递给INPUT链进行处理(决定是否允许通过),通过以后再交给系统上层的应用程序进行相应。
转发数据流向:外界的数据包到达防火墙后,首先会被PREROUTING链处理,之后进行路由的选择,如果数据包的目标地址是其他的外部地址,则内核将其传递给FORWARD链进行处理(转发或者拦截),然后再转给POSTROUTING链(是否修改数据包的地址)进行处理。
出站数据流向:防火墙本机向外部地址发送的数据包,首先被OUPUT链处理,处理之后进行路由选择,然后传递给POSTROUTING链,进行处理。
iptables命令详解:
规则:
iptables [-t table] COMMAND CHAIN [num] 匹配标准 -j 动作
COMMAND:
COMMAND | 解释 |
-A | -append在指定链的末尾添加一条新的规则 |
-D | -delete删除(--delete)指定链中的某一条规则,按规则序号或内容确定要删除的规则 |
-I | -insert在指定链中插入一条新的规则,若未指定插入位置,则默认在链的开头插入。 |
-R | -replace修改、替换指定链中的某一条规则,按规则序号或内容确定要替换的规则 |
-L | -list 列出指定链中的所有的规则进行查看,若未指定链名,则列出表中所有链的内容: -n:--numeric以数字的方式显示ip,它会将ip直接显示出来,如果不加-n,则会将ip反向解析成主机名。 -v:--verbose显示详细信息 -vv -vvv :越多越详细 -x:在计数器上显示精确值,不做单位换算 --line-numbers : 显示规则的行号 -t nat:显示所有的关卡的信息 |
-F | -flush 清空指定链中的所有规则,若未指定链名,则清空表中所有链的内容 |
-N | -new-chain 新建一条用户自己定义的规则链 |
-X | -delete-chain删除指定表中用户自定义的规则链 |
-P | -policy设置指定链的默认策略 |
-Z | -zero把所有链的包及字节的计数器清空,可以配合-L使用,在清空前查看计数器 |
PARAMETERS | 解释 |
-p | -protocal[!]protocal 指定协议,tcp、udp、icmp,不指定时,匹配所有的规则;加!表示取反的规则。 |
-s | -source [!]address[/mask] 指定源地址,可以是主机名、网络名和IP地址。Mask可是掩码或者数字; 加!表示取反的规则 |
-d | -destination [!]address[/mask]指定目标地址 |
-j | -jump target指定匹配规则后的动作 |
-i | -in-interface [!][name] 指定只匹配从哪个网卡中进来的数据包,可用于定义标准的链: PREROUTING INPUT FORWARD;加!表示取反的规则。如果在接口名称后面加上“+”,表示以此接口名开口的接口都会被匹配(这也是默认设置), |
-o | -out-interface [!][name]同“-i” |
在fileter表的INPUT链中追加一条规则
在filter表的INPUT链中插入一条规则,不指定数字,默认加到首行
查看规则,-n 不解析;-v 显示详细信息
删除filter中INPUT链中的第2条规则
清空nat表中的所有规则
设置filter表的FORWAED链的默认规则为DROP
在filter表中新增一条自定义链,名称为TCP_PACK
清空nat表中用户自定义的所有规则链
iptables –t nat –X
扩展匹配
隐含扩展:不用特别指明用哪个模块进行的扩展,使用-p {tcp|udp|icmp}
--sport | --source-port 用来指定来源端口号; 例:iptables –A INPUT –p tcp --sport 20:22 |
--dport | --destination-port 用来指定目标端口; 例:iptales –A INPUT –p tcp –-dport 20 |
--tcp-flags | 比对TCP封包的状态旗号,参数分为两个部分,第一个部分列举出想比对的旗号,第二部分则列举前述旗号中哪些有被设,未被列举的旗号必须是空的。TCP状态旗号包括:SYN(同步)、ACK(应答)、FIN(结束)、RST(重设)、URG(紧急) PSH(强迫推送)等均可使用于参数中,除此之外还可以使用关键词ALL和NONE进行比对。比对旗号时,可以使用!运算子行反向比对。 例:iptables -p tcp --tcp-flags SYN,FIN,ACKSYN |
显示扩展:必须指明由哪个模块进行的扩展,在iptables中使用-m 选项可完成此功能
-m EXTESTION --spe-opt
state 状态模块
结合ip_conntrack 追踪会话的状态
NEW 新连接请求
ESTABLISHED 已经建立的连接
INVALID 非法的连接
RELATED 相关联的
-m state --state NEW,ESTABLISHED -j ACCEPT
对于ftp,需要装载ip_nat_ftp和ip_conntrack_ftp两个模块
multiport: 离散的多端口匹配扩展
--source-ports
--destination-ports
--ports
iprange 指定ip的范围
--src-range
--des-range
connlimit 连接数限制
! --connlimit-above n
limit 速率限定
-m limit --limit rate[/second|/minute|/hour|/day] 单位时间允许的连接数
--limit-burst 第一次请求时,允许的连接数
动作
ACCEPT 放行
DROP 丢弃
REJECT 拒绝
DNAT 目标地址转换
–-to-destination
目标地址转换要做在到达网卡之前进行转换,所以要做在PREROUTING这个位置上
SNAT 源地址转换
--to-source
将源地址为192.168.10.0网段的日志转成172.16.100.1,要在POSTROUTING链上设定规则
MASQUERADE(动态伪装),它可以实现自动寻找到外网地址,而自动将其改为正确的外网地址
REDIRECT 端口重定向
LOG 日志
LOG 记录日志到message中
--log-frefix "string" 为日志添加一个字符串
MARK 打标记
保存规则: