linux iptables 原理,Iptables原理及使用

什么是iptables

iptables是Linux系统下常用的防火墙软件,是Linux

netfilter机制的一部分,通过iptables可以操纵linux对网络访问进行精细的控,例如丢掉特定地址来源的数据包。

Iptables工作原理

在Linux系统中,iptables是用于操作Linux内核netfilter系统的用户接口,在Linux系统中,当外部网络的数据包进入内核后,会通过Linux系统预先定义好的流程进行传递,在传递过程中,Linux内核暴露了一系列的接口给用户,从而允许用户在数据包传递的不同点上允许对数据包进行丢弃,修改等操作,这套机制在Linux系统中被称为netfilter机制。

五链四表

Linux系统在系统中总共设置了PREROUTING,INPUT,FORWARD,POSTROUTING,OUTPUT五个控制点(被称为规则链,即五链)通过应用预先定义在filter,nat,mangle,raw四张表中的规则对进出系统的数据包进行精细控制。

282452c1c9b1

对于进入系统的一个数据包,可以在PREROUTING控制点对该数据包进行过滤,修改等操作;PREROUTING控制点完成数据包处理后,进入数据包的路由转发阶段,判断数据包需要路由到本地还是转发出去;路由到本地的数据包,还可以在INPUT控制点被进一步进行处理;需要转发出去的数据包可以在FORWARD控制点和POSTROUTING控制点被进一步处理。

对于本机要发出去的数据包,用户进程将数据包传递到内核空间后,首先可以在OUTPUT控制点进行处理,处理完成后可以通过POSTROUTING控制点进行进一步的处理后,从本机路由出去。

为了能在这几个控制点进行数据包的处理,Linux内核设置了filter,nat,mangle,raw四张控制表,通过在这几个控制表中定义对应的控制规则,则可以完全控制进出Linux系统的数据包,当然,不同的控制点只并不一定能使用全部的控制表,且控制表在进行处理时也具有现后顺序,以raw->mangle->nat->filter顺序进行处理。

282452c1c9b1

不同的控制表具有不同的特征,其情况如下:

RAW表:主要确定是否对数据包进行状态跟踪。

Mangle表:用于修改数据包的服务类型,生存周期,为数据包设置标记,实现流量整形等。

NAT表:修改数据包的IP地址,端口等信息。

Filter表:对数据包进行过滤,根据特定规则确定对数据包如何处理。

netfilter

netfilter是iptables的核心机制,netfilter允许用户通过hook的方式,让Linux内核执行注册的回调函数并完成一系列功能。Netfilter提供了5个可注册接口,具体内容如下:

1:NF_IP_PRE_ROUTING,位于数据包被路由之前,数据包一致性检查完成后,进入该hook位置。

2:NF_IP_LOCAL_IN,位于数据包被路由后,并且数据包的目的地是本机时。

3:NF_IP_FORWARD,位于数据包被路由后,但数据包目的地址不是本机时。

4:NF_IP_LOCAL_OUT:由本机发出的数据包,在被路由之前,进入该hook处理。

5:NF_IP_POST_ROUTING:即将离开本机的数据包,在该hook被处理。

可以看到,iptables的五链四表其实就是利用Linux内核的hook机制进行的实现。

当Linux内核模块被注册后,注册的函数由可以有5种返回值,不同的返回值,内核会进行不同的处理。

1:NF_ACCEPT,报文被正常处理,允许报文通过。

2:NF_DROP,报文被丢弃。

3:NF_STOLEN,取走这个报文,不在进行后续处理。

4:NF_QUEUE,报文进行重新排队,可以被送到用户程序。

5:NF_REPEAT,对该报文重新调用hook函数。

Iptables是利用netfilter机制实现的报文控制系统,也可以理解为iptables是基于netfilter机制的一个应用功能;利用netfilter机制,我们可以自己编码实现类似于iptables的工具,对进出Linux的数据报文进行控制。

netfilter用法示例

下面通过一个简短的样例代码说明,如何使用netfilter机制,在Linux系统种注册自己的回调函数完成对数据报文的控制(需要了解Linux内核模块知识)

282452c1c9b1

iptables工具使用

iptables工具分为两部分,内核部分以及用户部分,内核部分通过Linux

netfilter机制实现,用户部分传递控制参数到内核部分。

Iptables命令格式:

iptables [-t table] COMMAND [chain]

CRETIRIA -j ACTION

-t table,是指操作的表,filter、nat、mangle或raw, 默认使用filter

COMMAND,子命令,定义对规则的管理,可以添加,删除,插入,替换。

chain,指明链路,指明控制点可能更好理解,即在INPUT,FORWARD等5个控制点的哪个控制点进行控制。

CRETIRIA,匹配的条件或判断标准。

ACTION,执行的动作,例如丢弃或接受。

例如对下面这样一条iptables命令:

iptables-A INPUT -s 10.8.0.0/16 -d 172.16.55.7 -p tcp --dport 80 -j DROP

其中参数-A表示添加一条规则。INPUT表示该规则添加在INPUT控制点,-s 10.8.0.0/16 -d 172.16.55.7 -p tcp --dport 80 描述源地址为10.8.0.0/16,目标地址为172.16.55.7,协议类型为tcp,目的端口为80的数据包。-j

DROP表示对满足匹配条件的数据包执行丢弃动作。

COMMAND有四种情况,通过以下参数描述。

-A, --append

chain rule-specification:追加新规则于指定链的尾部。

-I, --insert

chain [rulenum] rule-specification:插入新规则于指定链的指定位置,默认为首部。

-R, --replace

chain rulenum rule-specification:替换指定的规则为新的规则。

-D, --delete

chain rulenum:根据规则编号删除规则。

-L,

--list [chain]:列出规则

匹配条件

通过几个关键的控制字,可以描述一个匹配的数据包。

-s,

--source address[/mask][,...]:检查报文的源IP地址是否符合此处指定的范围,或是否等于此处给定的地址

-d,

--destination address[/mask][,...]:检查报文的目标IP地址是否符合此处指定的范围,或是否等于此处给定的地址

-p,

--protocol protocol:匹配报文中的协议,可用值tcp, udp, udplite, icmp, icmpv6,esp, ah, sctp, mh 或者"all",

-i,

--in-interface name:限定报文仅能够从指定的接口流入,只能用在INPUT, FORWARD and PREROUTING这几个控制链上。

-o,

--out-interface name:限定报文仅能够从指定的接口流出,只能用在FORWARD, OUTPUT and POSTROUTING这几个控制链上。

在特定的协议下,还有一些扩展控制参数:

1:-p tcp:tcp协议场景下,可以使用

--source-port,--sportport[:port]描述源端口。

--destination-port,--dportport[:port]描述目标端口。

--tcp-flagsmask comp描述tcp控制标志位置。

2:-p udp:udp协议下,可使用以下控制参数

--source-port,--sportport[:port]描述源端口。

--destination-port,--dportport[:port]描述目标端口。

3:-p icmp:icmp协议下,可以使用以下控制参数

--icmp-type{type[/code]|typename}描述icmp消息类型

例如:0/0:echo reply或8/0:echo request。

此外,还可以通过匹配报文时间,报文包含的特定字符串对数据包进行匹配。

--timestart hh:mm[:ss]

--timestop hh:mm[:ss] 描述数据包的到达时间。

--algo {bm|kmp} --string pattern描述匹配到的字符串。

--algo {bm|kmp} --hex-string pattern 描述匹配到的16进制字符串。

--connlimit-upto n 匹配连接数目。

--connlimit-above n匹配连接数目。

--state

state限制收发包的状态(状态可以取INVALID,

ESTABLISHED, NEW, RELATED or UNTRACKED)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值