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命令操作_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链更多的应用在“网络防火墙”中,特别是防火墙服务器作为网关使用时的情况。

数据包过滤的匹配优先级:

iptables命令操作_防火墙规则_02

入站数据流向:外界的数据包到达防火墙后,首先会被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链中追加一条规则

iptables –t filter –A INPUT –d 192.168.76.40 –t tcp –-dport 80 –j ACCEPT

在filter表的INPUT链中插入一条规则,不指定数字,默认加到首行

iptables –t filter –I INPUT 2 –d 192.168.76.40 –t tcp –j ACCEPT

查看规则,-n 不解析;-v 显示详细信息

iptables –t filter –L –n –v –-line-numbers

删除filter中INPUT链中的第2条规则

iptables –t filter –D INPUT 2

清空nat表中的所有规则

iptables –t nat -F

设置filter表的FORWAED链的默认规则为DROP

iptables –t filter –P FORWARD DROP

在filter表中新增一条自定义链,名称为TCP_PACK

iptables –t filter –N TCP_PACK
iptables –t filter –A TCP_PACK –d 192.168.76.40 –p tcp –dport 22 –j ACCEPT
iptables –t filter –A TCP_PACK –d 192.168.76.40 –p icmp –j ACCEPT
iptables –t filter –A TCP_PACK –d 192.168.76.40 –j RETURN
iptables –t filter –A INPUT –d 192.168.76.40 –j 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

iptables -A INPUT -p tcp -d 192.168.76.40 -m multiport --destination-ports 21,22,80 -j ACCEPT

iprange 指定ip的范围

--src-range

--des-range

iptables -A INPUT -p tcp -m iprange --src-range 192.168.76.50-192.168.76.100 --dport 80 -j ACCEPT

connlimit 连接数限制

! --connlimit-above n

iptables -A INPUT -d 192.168.76.40 -p tcp --dport 22 -m connlimit ! --connlimit-above 2 -j ACCEPT

limit 速率限定

-m limit --limit rate[/second|/minute|/hour|/day] 单位时间允许的连接数

--limit-burst 第一次请求时,允许的连接数

动作

ACCEPT 放行

DROP 丢弃

REJECT 拒绝

DNAT 目标地址转换

–-to-destination

目标地址转换要做在到达网卡之前进行转换,所以要做在PREROUTING这个位置上

iptables -t nat -A PREROUTING -d 192.168.10.18 -p tcp --dport 80 -j DNAT –-to-destination 172.16.100.2

SNAT 源地址转换

--to-source

将源地址为192.168.10.0网段的日志转成172.16.100.1,要在POSTROUTING链上设定规则

iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -j SNAT --to-source 172.16.100.1

MASQUERADE(动态伪装),它可以实现自动寻找到外网地址,而自动将其改为正确的外网地址

iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -j MASQUERADE

REDIRECT 端口重定向

LOG 日

LOG 记录日志到message中

--log-frefix "string" 为日志添加一个字符串

MARK 打标记

iptables –t mangle –A PREROUTING –d 192.168.76.40 –p tcp –dport 80 –j MARK –-set-mark 1 
iptables -t filter -A FORWARD -m mark--mark 1 -j ACCEPT

保存规则:

iptables-save > /tmp/iptables 将规则保存到文件
iptables-restore </tmp/iptables 从文件中读取规则