欢迎您的光临,本博所发布之文章皆为作者亲测通过,如有错误,欢迎通过各种方式指正。

文摘  Linux防火墙iptables基础配置详解和命令详解

Linux学习 本站 603 0评论

一、前言

防火墙,其实说白了讲,就是用于实现Linux下访问控制的功能的,它分为硬件的或者软件的防火墙两种。无论是在哪个网络中,防火墙工作的地方一定是在网络的边缘。而我们的任务就是需要去定义到底防火墙如何工作,这就是防火墙的策略,规则,以达到让它对出入网络的IP、数据进行检测。

目前市面上比较常见的有3、4层的防火墙,叫网络层的防火墙,还有7层的防火墙,其实是代理层的网关。

对于TCP/IP的七层模型来讲,我们知道第三层是网络层,三层的防火墙会在这层对源地址和目标地址进行检测。但是对于七层的防火墙,不管你源端口或者目标端口,源地址或者目标地址是什么,都将对你所有的东西进行检查。所以,对于设计原理来讲,七层防火墙更加安全,但是这却带来了效率更低。所以市面上通常的防火墙方案,都是两者结合的。而又由于我们都需要从防火墙所控制的这个口来访问,所以防火墙的工作效率就成了用户能够访问数据多少的一个最重要的控制,配置的不好甚至有可能成为流量的瓶颈。


二、iptables 的历史以及工作原理


1.iptables的发展

iptables的前身叫ipfirewall (内核1.x时代),这是一个作者从freeBSD上移植过来的,能够工作在内核当中的,对数据包进行检测的一款简易访问控制工具。但是ipfirewall工作功能极其有限(它需要将所有的规则都放进内核当中,这样规则才能够运行起来,而放进内核,这个做法一般是极其困难的)。当内核发展到2.x系列的时候,软件更名为ipchains,它可以定义多条规则,将他们串起来,共同发挥作用,而现在,它叫做iptables,可以将规则组成一个列表,实现绝对详细的访问控制功能。

他们都是工作在用户空间中,定义规则的工具,本身并不算是防火墙。它们定义的规则,可以让在内核空间当中的netfilter来读取,并且实现让防火墙工作。而放入内核的地方必须要是特定的位置,必须是tcp/ip的协议栈经过的地方。而这个tcp/ip协议栈必须经过的地方,可以实现读取规则的地方就叫做 netfilter.(网络过滤器)

作者一共在内核空间中选择了5个位置:

1.内核空间中:从一个网络接口进来,到另一个网络接口去的

2.数据包从内核流入用户空间的

3.数据包从用户空间流出的

4.进入/离开本机的外网接口

5.进入/离开本机的内网接口


2.iptables的工作机制

从上面的发展我们知道了作者选择了5个位置,来作为控制的地方,但是你有没有发现,其实前三个位置已经基本上能将路径彻底封锁了,但是为什么已经在进出的口设置了关卡之后还要在内部卡呢? 由于数据包尚未进行路由决策,还不知道数据要走向哪里,所以在进出口是没办法实现数据过滤的。所以要在内核空间里设置转发的关卡,进入用户空间的关卡,从用户空间出去的关卡。那么,既然他们没什么用,那我们为什么还要放置他们呢?因为我们在做NAT和DNAT的时候,目标地址转换必须在路由之前转换。所以我们必须在外网而后内网的接口处进行设置关卡。

这五个位置也被称为五个钩子函数(hook functions),也叫五个规则链。

1.PREROUTING (路由前)

2.INPUT (数据包流入口)

3.FORWARD (转发管卡)

4.OUTPUT(数据包出口)

5.POSTROUTING(路由后)

这是NetFilter规定的五个规则链,任何一个数据包,只要经过本机,必将经过这五个链中的其中一个链。


3.防火墙的策略

防火墙策略一般分为两种,一种叫“通”策略,一种叫“堵”策略,通策略,默认门是关着的,必须要定义谁能进。堵策略则是,大门是洞开的,但是你必须有身份认证,否则不能进。所以我们要定义,让进来的进来,让出去的出去,所以通,是要全通,而堵,则是要选择。当我们定义的策略的时候,要分别定义多条功能,其中:定义数据包中允许或者不允许的策略,filter过滤的功能,而定义地址转换的功能的则是nat选项。为了让这些功能交替工作,我们制定出了“表”这个定义,来定义、区分各种不同的工作功能和处理方式。

我们现在用的比较多个功能有3个:

1.filter 定义允许或者不允许的

2.nat 定义地址转换的

3.mangle功能:修改报文原数据

我们修改报文原数据就是来修改TTL的。能够实现将数据包的元数据拆开,在里面做标记/修改内容的。而防火墙标记,其实就是靠mangle来实现的。


小扩展:

对于filter来讲一般只能做在3个链上:INPUT ,FORWARD ,OUTPUT

对于nat来讲一般也只能做在3个链上:PREROUTING ,OUTPUT ,POSTROUTING

而mangle则是5个链都可以做:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING

iptables/netfilter(这款软件)是工作在用户空间的,它可以让规则进行生效的,本身不是一种服务,而且规则是立即生效的。而我们iptables现在被做成了一个服务,可以进行启动,停止的。启动,则将规则直接生效,停止,则将规则撤销。


iptables还支持自己定义链。但是自己定义的链,必须是跟某种特定的链关联起来的。在一个关卡设定,指定当有数据的时候专门去找某个特定的链来处理,当那个链处理完之后,再返回。接着在特定的链中继续检查。

注意:规则的次序非常关键,谁的规则越严格,应该放的越靠前,而检查规则的时候,是按照从上往下的方式进行检查的。


三、规则的写法


iptables定义规则的方式比较复杂:

格式:iptables [-t table] COMMAND chain CRETIRIA -j ACTION

-t table :3个filter nat mangle

COMMAND:定义如何对规则进行管理

chain:指定你接下来的规则到底是在哪个链上操作的,当定义策略的时候,是可以省略的

CRETIRIA:指定匹配标准

-j ACTION :指定如何进行处理

比如:不允许172.16.0.0/24的进行访问。

iptables -t filter -A INPUT -s 172.16.0.0/16 -p udp --dport 53 -j DROP

当然你如果想拒绝的更彻底:

iptables -t filter -R INPUT 1 -s 172.16.0.0/16 -p udp --dport 53 -j REJECT

iptables -L -n -v
 #查看定义规则的详细信息


四、详解COMMAND


1.链管理命令(这都是立即生效的)

-P :设置默认策略的(设定默认门是关着的还是开着的)

默认策略一般只有两种

iptables -P INPUT (DROP|ACCEPT)  默认是关的/默认是开的

比如:

iptables -P INPUT DROP 这就把默认规则给拒绝了。并且没有定义哪个动作,所以关于外界连接的所有规则包括Xshell连接之类的,远程连接都被拒绝了。

-F: FLASH,清空规则链的(注意每个链的管理权限)

iptables -t nat -F PREROUTING

iptables -t nat -F 清空nat表的所有链

-N:NEW 支持用户新建一个链

iptables -N inbound_tcp_web 表示附在tcp表上用于检查web的。

-X: 用于删除用户自定义的空链

使用方法跟-N相同,但是在删除之前必须要将里面的链给清空昂了

-E:用来Rename chain主要是用来给用户自定义的链重命名

-E oldname newname

-Z:清空链,及链中默认规则的计数器的(有两个计数器,被匹配到多少个数据包,多少个字节)

iptables -Z :清空


2.规则管理命令

-A:追加,在当前链的最后新增一个规则

-I num : 插入,把当前规则插入为第几条。

-I 3 :插入为第三条

-R num:Replays替换/修改第几条规则

格式:iptables -R 3 …………

-D num:删除,明确指定删除第几条规则


3.查看管理命令 “-L”

附加子命令

-n:以数字的方式显示ip,它会将ip直接显示出来,如果不加-n,则会将ip反向解析成主机名。

-v:显示详细信息

-vv

-vvv :越多越详细

-x:在计数器上显示精确值,不做单位换算

--line-numbers : 显示规则的行号

-t nat:显示所有的关卡的信息


五、详解匹配标准


1.通用匹配:源地址目标地址的匹配

-s:指定作为源地址匹配,这里不能指定主机名称,必须是IP

IP | IP/MASK | 0.0.0.0/0.0.0.0

而且地址可以取反,加一个“!”表示除了哪个IP之外

-d:表示匹配目标地址

-p:用于匹配协议的(这里的协议通常有3种,TCP/UDP/ICMP)

-i eth0:从这块网卡流入的数据

流入一般用在INPUT和PREROUTING上

-o eth0:从这块网卡流出的数据

流出一般在OUTPUT和POSTROUTING上


2.扩展匹配


2.1隐含扩展:对协议的扩展

-p tcp :TCP协议的扩展。一般有三种扩展

--dport XX-XX:指定目标端口,不能指定多个非连续端口,只能指定单个端口,比如

--dport 21  或者 --dport 21-23 (此时表示21,22,23)

--sport:指定源端口

--tcp-fiags:TCP的标志位(SYN,ACK,FIN,PSH,RST,URG)

对于它,一般要跟两个参数:

1.检查的标志位

2.必须为1的标志位

--tcpflags syn,ack,fin,rst syn  =    --syn

表示检查这4个位,这4个位中syn必须为1,其他的必须为0。所以这个意思就是用于检测三次握手的第一次包的。对于这种专门匹配第一包的SYN为1的包,还有一种简写方式,叫做--syn

-p udp:UDP协议的扩展

--dport

--sport

-p icmp:icmp数据报文的扩展

--icmp-type:

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

所以 --icmp-type 8 匹配请求回显数据包

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


2.2显式扩展(-m)

扩展各种模块

-m multiport:表示启用多端口扩展

之后我们就可以启用比如 --dports 21,23,80


六、命令详解


下表中为读者们总结归纳了几乎所有常用的iptables命令参数:

参数作用
-P设置默认策略:iptables -P INPUT (DROP|ACCEPT)
-F清空规则链
-L查看规则链
-A在规则链的末尾加入新规则
-I num在规则链的头部加入新规则
-D num删除某一条规则
-s匹配来源地址IP/MASK,加叹号"!"表示除这个IP外。
-d匹配目标地址
-i 网卡名称匹配从这块网卡流入的数据
-o 网卡名称匹配从这块网卡流出的数据
-p匹配协议,如tcp,udp,icmp
--dport num匹配目标端口号
--sport num匹配来源端口号


iptables -A INPUT -s 192.168.109.10 -j DROP:拒绝192.168.109.10主机访问本服务器;

注意:-A:添加一条规则,默认是加在最后。

注意:"拒绝给192.168.109.10主机提供服务",最好使用INPUT链。使用PREROUTING,也可以满足要求,但是如果用户的要求是让服务器提供转发功能,添加到PREROUTING链中,"转发"功能也将被拒绝掉。

注意:链名要大写;

注意:-s:指定源地址,可以是IP地址,也可以是网段"192.168.109.10/24";"-s 为空",表示拒绝所有;

注意:-j:指定所需要的操作;

注意:拒绝有两种方式,一种是"REJECT",还有一种是"DROP";DROP是不回应,REJECT是拒绝;

注意:iptables -A INPUT -j DROP,表示拒绝所有。不过加规则的时候,不要将自己的ssh给拒绝掉。

 

iptables -nvL -t mangle:查看mangle表中的防火墙规则;

注意:-t:指定表名,默认情况下是"fliter"表;

注意:-v:查看详细信息;

pkts:被本机报文所匹配的个数;

prot:放行哪种协议;

opt:额外的选项,--表示没有;

target:处理机制;

注意:选项中"v"和"L"的顺序(V只能在L的前面);


iptables -nvL --line-numbers:查看fliter表中规则的顺序;

注意:--line-numbers:查看指定表中的规则的顺序;

注意:不指定表,默认情况下就是"fliter"表;

注意:表中的规则是有执行顺序的,编号(num)越小,越先执行。只要匹配到结果,就不会往下执行了;

 

iptables -F:清空"fliter"表中的所有的规则;

注意:-F:表示清空指定表中的所有链中的规则;

iptables -I INPUT -s 1.1.1.1 -j DROP:在"fliter"表中的INPUT链中,链首插入一条规则;

注意:-I:表示在指定的链中插入一条规则,可以指定编号;

 

iptables -R INPUT 1 -s 2.2.2.2 -j REJECT:表示替换第一条规则;

注意:-R,replace,替换指定的规则;

iptables -S:以iptables-save命令格式显示fliter链上的规则;

 

iptables -A INPUT -s 192.168.109.10 -d 192.168.109.4 -j REJECT:拒绝来自192.168.109.10的主机访问192.168.109.4的ip地址;

注意:-d:指定目标地址,使规则更加详细;

 

iptables -A INPUT -s 192.168.109.10 -d 192.168.109.4,192.168.109.5 -j REJECT:拒绝192.168.109.10的主机访问192.168.109.4,192.168.109.5这两个ip地址。

注意:一条命令添加两条规则;

注意:源地址也可以使用这种方式,快速添加规则;

注意:该命令在规则中的语义的含义,-s、-d属于并且的关系,即:拒绝源是192.168.109.10的ip,且源是192.168.109.4的访问;而192.168.109.4和192.168.109.5在逻辑上属于或者的关系。

 

iptables -A INPUT -s 192.168.109.10 -p tcp --dport 22 -j REJECT:拒绝192.168.109.10主机使用tcp协议访问我的所有ip的22端口。

注意:-p:指定协议;可以通过"/etc/protocols"文件查看协议类型;

注意:--dport:指定目标主机的端口号;(拒绝别人链接我。)

注意:--sport:指定源主机的端口号;(拒绝我链接别人。)

注意:此处,注意区分dport和sport;


iptables -A INPUT -s 192.168.109.10 -p icmp -j REJECT:拒绝来自192.168.109.10主机发来的ping包。

注意:icmp协议没有端口号,即不属于tcp也不属于udp。由于icmp协议的特性,这条命令的结果会造成,192.168.109.10无法ping通自己,自己也无法ping通192.168.109.10主机。

注意:如果要想实现别人无法ping通自己,自己可以ping通别人,需要根据state来判断。0表示回应包,8表示请求包。


iptables -A INPUT -s 192.168.109.10 -i eth0 -j REJECT:拒绝192.168.109.10主机访问我的eth0网卡。

注意:-i:加上网卡名,表示报文流入的接口;

注意:-o:加上网卡名,表示报文流出的接口;


iptables -A INPUT ! -s 192.168.109.4 -p tcp --dport 80 -j REJECT:除了192.168.109.4的主机可以访问我的tcp的80端口,其他的主机全部拒绝;

注意:!:表示"非";一般情况下,很少使用该方式。


iptables -A INPUT -s 192.168.109.4 -p icmp --icmp-type 8 -j REJECT:拒绝来自192.168.109.10主机发送来的icmp的请求包。即192.168.109.10主机无法ping通我,我可以ping通它。

注意:icmp协议中,ping通需要满足两个条件,首先源主机向目标主机发送一个请求包(8),目标主机收到之后,便会返回一个回应包(0)。

注意:-p:指定协议;

注意:--icmp-type:指定ping包的类型。(code可以省略;)


iptables -A INPUT -s 192.168.109.10 -p tcp -m multiport --dports 20:22,80 -j REJECT:拒绝来自192.168.109.10主机发送来的访问我的20-22,80端口的包。

注意:-m:后面跟模块名,multiport:以离散形式表示的多端口(最多可以跟15个端口);

注意:--dports:目标端口是多个端口;

注意:使用samba服务测试多端口的话,可能存在问题。想要抓包测试的话,可以使用"tcpdump -i eth0 -nn host 192.168.109.4";


iptables -A INPUT -m iprange --src-range 192.168.109.1-192.168.109.10 -j REJECT:拒绝192.168.109.1~192.168.109.10范围内的所有主机的访问。

注意:iprange:ip范围的模块;

注意:--src-range:源地址范围;

注意:--dsc-range:目标地址的范围;

 

iptables -A INPUT -m mac --mac-source 00:0c:29:2f:b1:d6 -j REJECT:拒绝该mac地址的主机访问本主机的资源。

注意:mac:mac地址模块;

注意:--mac-source:源主机的mac地址;


iptables -A OUTPUT -p tcp -m string --algo bm --string "han" -j REJECT:拒绝所有主机访问访问我的有"han"字符串的报文。

注意:string:字符串模块;

注意:--algo:指定匹配算法,bm、kmp算法,两个随便选一个;

注意:--string:指定要匹配的字符串;

注意:--from offset:开始偏移,--to offset:结束偏移;

注意:添加的是OUTPUT链;

 

iptables -F OUTPUT:清空OUTPUT链中的规则;

iptables -A INPUT -m time --weekdays 1,2,3,4,5 --timestart 9:00 --timestop 10:00 -j REJECT:拒绝所有的主机在周一到周五的九点~十点之间,访问本主机的所有资源;

注意:time:时间模块;

注意:--datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]] 日期

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

--timestart hh:mm[:ss] 时间

--timestop hh:mm[:ss]

--monthdays day[,day...] 每个月的几号

--weekdays day[,day...] 星期几

注意:centos7中,使用的是UTC时间(北京时间转化成UTC时间是减8);centos6中使用的是本地时间;

 

iptables -A INPUT -m connlimit --connlimit-above 2 -j REJECT:并发连接的数量大于两条的时候,就拒绝;

注意:connlimit:并发连接数量的模块;

注意:--connlimit-upto n:连接的数量小于等于n时匹配;

注意:--connlimit-above n:连接的数量大于n时匹配;

注意:可以使用ssh服务测试;


iptables -A INPUT -p icmp -m limit --limit 10/minute --limit-burst 5 -j ACCEPT:对于icmp协议,ping通5个包后,便会以每分钟接收十个的速度匹配。

注意:--limit-burst 5:达到5个之后,便会限制速度;

注意:--limit 10/minute:以每分钟通过10个的速度匹配;

注意:需要"iptables -A INPUT -p icmp -j REJECT"配合使用。

 

iptables -N ACCOUNT:在"fliter表中,"创建一个自定义链,命名为ACCOUNT;

注意:-N:创建一条链;建议,将一些常用的规则放在自定义的链中,当使用的时候,将自定义的链关联到INPUT链中。

注意:可以将自定义链的操作,理解为函数的声明。将关联操作,理解为函数的调用;


iptables -A ACCOUNT -s 192.168.109.10,192.168.109.220 -j REJECT:在自定义链ACCOUNT中添加一条规则;

iptables -D INPUT 2:删除INPUT链中的第二条;

iptables -A INPUT -j ACCOUNT:将ACCOUNT链关联到INPUT链中;

iptables -F ACCOUNT:清空"fliter"表中的ACCOUNT链中的规则;

iptables -X ACCOUNT:删除"fliter"表中ACCOUNRT链;

注意:-X:删除指定的自定义的链

 

iptables -A INPUT -p icmp -m state --state NEW -j REJECT:拒绝使用icmp第一次连接的请求包;

注意:state:state模块;

注意:NEW:第一连接(注意此处并不是三次握手中的状态);


iptables -A INPUT -s 192.168.109.10 -j LOG --log-prefix "FROM .10~~":当192.168.109.10主机访问我时,将他记录到/var/log/messige日志文件中,并且,日志中的记录的前缀的"FROM .10~~"

注意:LOG,记录日志的target;

注意:--log-prefix:定义日志文件中的记录的前缀;

 

iptables -A FORWARD -s 192.168.109.4/24 -d 172.17.253.120/16 -m state --state NEW -j ACCEPT:在FORWARD表中添加一条规则,当源192.168.109.0网段中的主机,目标是172.17.0.0网段中的主机时,状态是NEW(第一条连接)时,就允许连接;

iptables -A FORWARD -m state --state ESTABLISHED -j ACCEPT:对于状态是ESTABLISHED的连接,允许通过。

iptables -A FORWARD -j REJECT:拒绝所有连接;

以上三条规则结合起来,可以实现允许192.168.109.0网段中的主机ping通172.17.0.0的主机,但是反过来,ping不通。实现网络防火墙的功能。

可以通过实验来验证:

四台机器,两台192的地址(A、B),一台172的地址(D),还有一台充当路由器(C),既有172的地址,又有192的地址。设置好四台主机的路由表,并开启C主机的路由转发功能。然后,执行iptables的命令,添加规则,即可实现功能。

 

iptables -t nat -R POSTROUTING 1 -s 192.168.109.0/24 -j SNAT --to-source 172.17.250.111:在nat表中的POSTROUTING链中,添加一策略,当收到192.168.109.0/24网段的主机访问的目标地址是任意地址的时候,就将该包的源地址改成172.17.250.111,发送。(SNAT)

注意:要保证防火墙主机上的路由表,有到达目标地址的路径。

注意:在实验中的C主机上,执行了该规则后,A主机通过C主机,到达C主机的POSTROUTING链的时候,将包的源地址改成C主机的公网地址,然后,发送给D主机。实验的时候,将D主机上的默认路由删掉。确保返回的包是将C主机的公网地址,作为目标地址的。

注意:可以在D主机上,安装一个httpd服务,A访问D之后,通过查看日志(/var/log/httpd/access_log),来验证结果。

 

iptables -t nat -A PREROUTING -d 172.17.250.111 -dport 80 -j DNAT --to-destination 192.168.109.4:8080:当访问172.17.250.111主机的80端口的时候,将目标端口改成192.168.109.4主机的8080端口。(DNAT)

注意:将192.168.109.4主机上的httpd服务监听的端口改成8080;


七、应用举例


1.链及NAT的基本操作


1、清除所有的规则


1)清除预设表filter中所有规则链中的规则。

# iptables -F

2)清除预设表filter中使用者自定链中的规则。

#iptables -X

#iptables -Z

3)清楚NAT表规则

#iptables -F -t nat

4)NAT表的显示

#iptables -t nat -nL


2、设置链的默认策略。一般有两种方法。


1)首先允许所有的包,然后再禁止有危险的包通过放火墙。

#iptables -P INPUT ACCEPT

#iptables -P OUTPUT ACCEPT

#iptables -P FORWARD ACCEPT

2)首先禁止所有的包,然后根据需要的服务允许特定的包通过防火墙。

#iptables -P INPUT DROP

#iptables -P OUTPUT DROP

#iptables -P FORWARD DROP

3、列出表/链中的所有规则。默认只列出filter表。

#iptables -L

4、向链中添加规则。下面的语句用于开放网络接口:

#iptables -A INPUT -i lo -j ACCEPT

#iptables -A OUTPUT -o lo -j ACCEPT

#iptables -A INPUT -i eth0 -j ACEPT

#iptables -A OUTPUT -o eth1 -j ACCEPT

#iptables -A FORWARD -i eth1 -j ACCEPT

#iptables -A FORWARD -0 eth1 -j ACCEPT

注意:由于本地进程不会经过FORWARD链,因此回环接口lo只在INPUT和OUTPUT两个链上作用。

5、使用者自定义链。

#iptables -N custom

#iptables -A custom -s 0/0 -d 0/0 -p icmp -j DROP

#iptables -A INPUT -s 0/0 -d 0/0 -j DROP


2.设置基本的规则匹配


1、指定协议匹配。


1)匹配指定协议。

#iptables -A INPUT -p tcp

2)匹配指定协议之外的所有协议。

#iptables -A INPUT -p !tcp


2、指定地址匹配。


1)指定匹配的主机。

#iptables -A INPUT -s 192.168.0.18

2)指定匹配的网络。

#iptables -A INPUT -s 192.168.2.0/24

3)匹配指定主机之外的地址。

#iptables -A FORWARD -s !192.168.0.19

4)匹配指定网络之外的网络。

#iptables -A FORWARD -s ! 192.168.3.0/24


3、指定网络接口匹配。


1)指定单一的网络接口匹配。

#iptables -A INPUT -i eth0

#iptables -A FORWARD -o eth0

2)指定同类型的网络接口匹配。

#iptables -A FORWARD -o ppp+


4、指定端口匹配。


1)指定单一端口匹配。

#iptables -A INPUT -p tcp --sport www

#iptables -A INPUT -p udp –dport 53

2)匹配指定端口之外的端口。

#iptables -A INPUT -p tcp –dport !22

3)匹配端口范围。

#iptables -A INPUT -p tcp –sport 22:80

4)匹配ICMP端口和ICMP类型。

#iptables -A INOUT -p icmp –icimp-type 8

5)指定ip碎片。

个网络接口都有一个MTU(最大传输单元),这个参数定义了可以通过的数据包的最大尺寸。如果一个数据包大于这个参数值时,系统会将其划分成更小的数据包

(称为ip碎片)来传输,而接受方则对这些ip碎片再进行重组以还原整个包。这样会导致一个问题:当系统将大数据包划分成ip碎片传输时,第一个碎片含有

完整的包头信息(IP+TCP、UDP和ICMP),但是后续的碎片只有包头的部分信息(如源地址、目的地址)。因此,检查后面的ip碎片的头部(象有

TCP、UDP和ICMP一样)是不可能的。假如有这样的一条规则:

#iptables -A FORWARD -p tcp -s 192.168.1.0/24 -d 192.168.2.100 –dport 80 -j ACCEPT

并且这时的FORWARD的policy为DROP时,系统只会让第一个ip碎片通过,而余下的碎片因为包头信息不完整而无法通过。可以通过—fragment/-f 选项来指定第二个及以后的ip碎片解决上述问题。

#iptables -A FORWARD -f -s 192.168.1.0/24 -d 192.168.2.100 -j ACCEPT

注意现在有许多进行ip碎片攻击的实例,如DoS攻击,因此允许ip碎片通过是有安全隐患的,对于这一点可以采用iptables的匹配扩展来进行限制。


3.设置扩展的规则匹配(举例已忽略目标动作)


1、多端口匹配


1)匹配多个源端口。

#iptables -A INPUT -p tcp -m multiport –sport 22,53,80,110

2)匹配多个目的端口。

#iptables -A INPUT -p tcp -m multiport –dpoort 22,53,80

3)匹配多端口(无论是源端口还是目的端口)

#iptables -A INPUT -p tcp -m multiport –port 22,53,80,110


2、指定TCP匹配扩展


使用 –tcp-flags 选项可以根据tcp包的标志位进行过滤。

#iptables -A INPUT -p tcp –tcp-flags SYN,FIN,ACK SYN

#iptables -A FROWARD -p tcp –tcp-flags ALL SYN,ACK

上实例中第一个表示SYN、ACK、FIN的标志都检查,但是只有SYN匹配。第二个表示ALL(SYN,ACK,FIN,RST,URG,PSH)的标志都检查,但是只有设置了SYN和ACK的匹配。

#iptables -A FORWARD -p tcp --syn

选项—syn相当于”--tcp-flags SYN,RST,ACK SYN”的简写。


3、limit速率匹配扩展


1)指定单位时间内允许通过的数据包个数,单位时间可以是/second、/minute、/hour、/day或使用第一个子母。

#iptables -A INPUT -m limit --limit 300/hour

2 )指定触发事件的阀值。

#iptables -A INPUT -m limit –limit-burst 10 

用来比对一次同时涌入的封包是否超过10个,超过此上限的包将直接丢弃。

3)同时指定速率限制和触发阀值。

#iptables -A INPUT -p icmp -m limit –-limit 3/m –limit-burst 3

表示每分钟允许的最大包数量为限制速率(本例为3)加上当前的触发阀值burst数。任何情况下,都可保证3个数据包通过,触发阀值burst相当于允许额外的包数量。 

4)基于状态的匹配扩展(连接跟踪)

每个网络连接包括以下信息:源地址、目标地址、源端口、目的端口,称为套接字对(socket pairs);协议类型、连接状态(TCP协议)

和超时时间等。防火墙把这些信息称为状态(stateful)。状态包过滤防火墙能在内存中维护一个跟踪状态的表,比简单包过滤防火墙具有更大的安全性,命令格式如下: 

iptables -m state –-state [!]state [,state,state,state]

其中,state表是一个逗号分割的列表,用来指定连接状态,4种:

>NEW: 该包想要开始一个新的连接(重新连接或连接重定向)

>RELATED:该包是属于某个已经建立的连接所建立的新连接。举例:

FTP的数据传输连接和控制连接之间就是RELATED关系。

>ESTABLISHED:该包属于某个已经建立的连接。

>INVALID:该包不匹配于任何连接,通常这些包被DROP。

例如:

1)在INPUT链添加一条规则,匹配已经建立的连接或由已经建立的连接所建立的新连接。即匹配所有的TCP回应包。

#iptables -A INPUT -m state –state RELATED,ESTABLISHED

2)在INPUT链链添加一条规则,匹配所有从非eth0接口来的连接请求包。

#iptables -A INPUT -m state -–state NEW -i !eth0

又如,对于ftp连接可以使用下面的连接跟踪:

1)被动(Passive)ftp连接模式。

#iptables -A INPUT -p tcp --sport 1024: --dport 1024: -m state –-state ESTABLISHED -j ACCEPT

#iptables -A OUTPUT -p tcp --sport 1024: --dport 1024: -m 

state -–state ESTABLISHED,RELATED -j ACCEPT

2)主动(Active)ftp连接模式

#iptables -A INNPUT -p tcp --sport 20 -m state –-state ESTABLISHED,RELATED -j ACCEPT

#iptables -A OUTPUT -p tcp –OUTPUT -p tcp –dport 20 -m state --state ESTABLISHED -j ACCEPT


参考网址:

https://www.cnblogs.com/wdp-home/p/11651855.html 

https://www.cnblogs.com/alimac/p/5848372.html

https://blog.csdn.net/han156/article/details/78449253


转载请注明: ITTXX.CN--分享互联网 » Linux防火墙iptables基础配置详解和命令详解

最后更新:2020-04-29 12:00:50

赞 (1) or 分享 ()
游客 发表我的评论   换个身份
取消评论

表情
(0)个小伙伴在吐槽