红联Linux门户
Linux帮助

Iptables原理及应用解析

发布时间:2014-11-26 21:52:29来源:linux网站作者:90sec

一、Iptables原理

现在防火墙主要分以下三种类型:包过滤、应用代理、状态检测

包过滤防火墙:现在静态包过滤防火墙市面上已经看不到了,取而代之的是动态包过滤技术的防火墙哈~

代理防火墙:因一些特殊的报文攻击可以轻松突破包过滤防火墙的保护,比如大家知道的SYN攻击、ICMP洪水攻击,所以以代理服务器作为专门为用户保密或者突破访问限制的数据转发通道的应用代理防火墙出现了哈~其使用了一种应用协议分析的新技术。

状态检测防火墙:其基于动态包过滤技术发展而来,加入了一种状态检测的模块,进一点发展了会话过滤功能,会话状态的保留是有时间限制的,此防火墙还可以对包的内容进行分析,从而避免开放过多的端口。

netfilter/iptables IP数据包过滤系统实际上由netfilter和iptables两个组件构成。netfilter是集成在内核中的一部分,其作用是定义、保存相应的规则,而iptables是一种工具,用来修改信息的过滤规则及其他配置,我们可以通过iptables来设置一些适合我们企业需求环境的规则哈~,而这些规则会保存在内核空间之中。

netfilter是Linux核心中的一个通用架构,其提供了一系列的表(tables),每个表由若干个链(chains)组成,而每条链可以由一条或若干条规则(rules)组成。实际上netfilter是表的容器,表是链的容器,而链又是规则的容器。

iptables内置链

PREROUTING:数据包进入本机,进入路由器之前

INPUT:通过路由表后目的地为本机

FORWARDING:通过路由表后,目的地不为本机

OUTPUT:由本机产生,向外转发

POSTROUTIONG:通过路由表后,发送到网卡接口之前


二、iptables的基本用法

基本语法:

iptables [-t table] COMMAND CHAIN CRETIRIA -j TARGET

-t table:

net,mangle,raw,filter

默认为filter

COMMAND:

链:

-F:(flush)清空规则链

-N:(new)自建一条链

-X:(delete)删除一条自定义的空链

-Z:(zero)计数器归零

-P:(policy)设置默认策略,对filter表来讲,默认规则为ACCEPT或DROP

-E:重命名自定义链

CHAIN:指定你接下来的规则到底是在哪个链上操作的

CRETIRIA:指定匹配标准

ACTION :指定如何进行处理

常用指令

DROP:悄悄丢弃;一般我们多用DROP来隐藏我们的身份,以及隐藏我们的链表

REJECT:明示拒绝

ACCEPT:接受

DNAT:明确申明要做的是目的地地址转换操作

SNAT:明确申明要做的是源地址转换操作

MASQUERADE:源地址伪装

REDIRECT:重定向:主要用于实现端口重定向

MARK:打防火墙标记的

RETURN:返回在自定义链执行完毕后使用返回,来返回原规则链

链中的规则

-A:(append)在所选择的链末添加一条或更多规则

-I:  (insert) 根据给出的规则序号向所选链中插入一条或更多规则

-D:(delete)从所选链中删除一条或更多规则

-R:(replace)从选中的链中取代一条规则

常用查询命令

-L

-n :数字格式显示主机地址端口

-v:显示详细格式信息

-vv

-vvv:越多显示的越详细

--line-numbers:显示规则编号

-x: exactly,不要对计数器的计数结果做单位换算,而显示其精确值

pkts bytes target    prot opt in    out    source      destination

pkts: packets, 被本规则所匹配到的报文的个数

bytes: 被本规则所匹配到的所有报文的大小之和,会执行单位换算

target: 目标,即处理机制

prot: 协议,一般为{TCP|UDP|ICMP}

opt: 可选项

in: 数据包的流入接口

out: 数据包的流出接口

source: 源地址

destination: 目标地址


三、 匹配标准

通用匹配

-s 地址:指定报文源IP地址的匹配的范围;可以是IP,也可以是网络地址;可使用!取反

--src, --source

-d 地址:指定报文目标IP地址匹配的范围

--dst, --destination

-p 协议:指定匹配报文的协议类型,一般有三种tcp,udp,icmp

-i ethX :数据报文流入的接口:PREROUTING,INPUT,FORWARD

-o ethX :数据报文流入的接口:OUTPUT,FORWARD,POSTROUTING

扩展匹配

隐式匹配: 当使用-p{tcp|udp|icmp}中的一种时,可以直接使用扩展专用选项

-p tcp

--sport PORT[-PORT]:指定源端口,可以是多个端口

--dport PORT[-PORT]:指定目标端口,可以是连续的多个端口

--tcp-flag:TCP的标志位列表(用逗号分隔)

必须为1 的标志位列表

eg:--tcp-flags syn,ack,rst,fin syn

-p udp

--sport PORT[-PORT]:指定源端口,可以是多个端口

--dport PORT[-PORT]:指定目标端口,可以是连续的多个端口

-p icmp

--icmp-type:

echo-request(请求回显),一般用8 来表示

echo-reply (响应的数据包)一般用0来表示

显示扩展    -m  必须要指定要扩展的扩展模块名称

multiport: 多端口匹配

可用于匹配非连续或连续端口;最多指定15个端口;用冒号分隔

eg:

iptables -I INPUT -d 172.16.100.7 -p tcp -m multiport --dports 22,80 -j ACCEPT

iptables -I OUTPUT -s 172.16.100.7 -p tcp -m multiport --sports 22,80 -j ACCEPT

iprange: 匹配指定范围内的地址

匹配一段连续的地址而非整个网络时有用;

专用选项:

[!] --src-ragne IP[-IP]

[!] --dst-range

iptables -A INPUT -d 172.16.100.7 -p tcp --dport 23 -m iprange --src-range 172.16.100.1-172.16.100.100 -j ACCEPT

iptables -A OUTPUT -s 172.16.100.7 -p tcp --sport 23 -m iprange --dst-range 172.16.100.1-172.16.100.100 -j ACCEPT

string: 字符串匹配,能够检测报文应用层中的字符串

字符匹配检查高效算法

kmp, bm

专用选项:

--algo {kmp|bm}

--string "STRING"

--hex-string "HEX_STRING": HEX_STRING为编码成16进制格式的字串;

eg:

iptables -I OUTPUT -m string --algo kmp --string "sex" -j DROP

time: 基于时间做访问控制

专用选项:

--datestart YYYY[-MM][-DD[Thh[:mm[:ss]]]]

--datestop

--timestart hh:mm[:ss]

--timestop hh:mm[:ss]

--weekdays day[,day]Mon, Tue,

eg:

iptables -I INPUT -d 172.16.100.7 -p tcp --dport 80 -m time --timestart 08:20 --timestop 18:40 --weekdays Mon,Tue,Thu,Fri -j REJECT

connlimit: 连接数限制,对每IP所能够发起并发连接数做限制;

专用选项:

[!] --connlimit-above [n]

eg:

iptables -A INPUT -d 172.16.100.7 -p tcp --dport 22 -m connlimit --connlimit-above 2 -j DROP

limit: 速率限制

专用选项:

--limit n[/second|/minute|/hour|/day]

--limit-burst n

eg:

iptables -A INPUT -d 172.16.100.7 -p icmp --icmp-type 8 -m limit --limit 20/minute --limit-burst 5 -j ACCEPT

state: 状态检查

专用选项:

--state

连接追踪中的状态:

NEW: 新建立一个会话

ESTABLISHED:已建立的连接

RELATED: 有关联关系的连接

INVALID: 无法识别的连接

调整连接追踪功能所能容纳的连接的最大数目:

/proc/sys/net/nf_conntrack_max

当前追踪的所有连接

/proc/net/nf_conntrack

不同协议或连接类型追踪时的属性:

/proc/sys/net/netfilter目录:

放行被动模式下的FTP服务:

1、装载模块/lib/modules/KERNEL_VERSION/kernel/net/netfilter/

模块:nf_conntrack_ftp

2、放行请求报文:

(1)放行NEW状态对21端口请求的报文;

(2) 放行ESTABLISHED以及RELATED状态的报文

3、旅行响应报文:

(1) 放行ESTABLISHED以及RELATED状态的报文


四、写规则

先确定功能(表),确定报文流向,确定要实现的目标,确定匹配条件

流向

与本机进程通信:

流入:-->PREROUTING-->INPUT

流出:-->OUTPUT-->POSTROUTING

经由本机转发:

请求:-->PREROUTING-->FORWARD-->POSTROUTING

响应:-->PREROUTING-->FORWARD-->POSTROUTING

写规则时要注意:

服务端:先进后出

客户端:先出后进

客户端端口是随机的,因此大多数场景下无须限定

规则文件:/etc/sysconfig/iptables

保存启用中的规则于规则文件中:

1、iptables-save > /etc/sysconfig/iptables

2、service iptables save

生效规则文件中的规则:

1、iptables-restore < /etc/sysconfig/iptables

2、service iptables restart

执行的操作:清空现有规则,读取并生效规则文件中的规则

常用语法

删除规则:

iptables [-t table] -D chain rulenum

设置策略:

iptables [-t table] -P chain target

修改规则:

iptables [-t table] -R chain rulenum rule-specification

插入规则:

iptables [-t table] -I chain [rulenum] rule-specification

创建自定义链:

iptables [-t table] -N chain

删除自定义且0引用的空链

iptables [-t table] -X chain

重命名自定义链:

iptables [-t table] -E old_name new_name


五、例子

1、SNAT基于原地址的转换

基于原地址的转换一般用在我们的许多内网用户通过一个外网的口上网的时候,这时我们将我们内网的地址转换为一个外网的IP,我们就可以实现连接其他外网IP的功能。

比如我们现在要将所有192.168.10.0网段的IP在经过的时候全都转换成172.16.100.1这个假设出来的外网地址:

iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j SNAT --to-source 172.16.200.1

这样,只要是来自本地网络的试图通过网卡访问网络的,都会被统统转换成172.16.100.1这个IP.

我们都知道当我们使用联通或者电信上网的时候,一般它都会在每次你开机的时候随机生成一个外网的IP,意思就是外网地址是动态变换的。这时我们就要将外网 地址换成 MASQUERADE(动态伪装):它可以实现自动寻找到外网地址,而自动将其改为正确的外网地址。所以,我们就需要这样设置:

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

这里要注意:地址伪装并不适用于所有的地方。

iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j SNAT --to 1.1.1.1

2、DNAT目标地址转换

对于目标地址转换,数据流向是从外向内的,外面的是客户端,里面的是服务器端

通过目标地址转换,我们可以让外面的ip通过我们对外的外网ip来访问我们服务器不同的服务器,而我们的服务却放在内网服务器的不同的服务器上。

iptables -t nat -A PREROUTING -d 192.168.1.18 -p tcp --dport 80 -j DNAT --to-destination 172.16.200.7

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

3、只允许192.168.1.3访问服务器的SSH

iptables -A INPUT  -s 192.168.1.3 -p tcp --dport  22 -j ACCEPT

4、屏蔽IP即从192.168.1.0到192.168.1.1254

iptables -I INPUT -s 192.168.1.0/24 -j DROP

5、丢弃非法连接

iptables -A INPUT -m state --state INVALID -j DROP

iptables -A OUTPUT -m state --state INVALID -j DROP

iptables-A FORWARD -m state --state INVALID -j DROP

6、允许ping

iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT

iptables -A OUTPUT -p icmp --icmp-type echo-reply -j ACCEPT

7、预防DOS攻击

iptables -A INPUT -p tcp --dport 80 -m limit --limit 25/minute --limit-burst 100 -j ACCEPT