iptables学习笔记

一、简介

1. 声明

本文为学习笔记。原文为:iptables

2. 官网

https://www.netfilter.org/

二、netfilter项目

netfilter项目是一个由社区驱动的协作FOSS项目。主要用来为linux 2.4.x及以后的内核提供包过滤。netfilter项目由netfilter钩子(linux内核框架)和iptables构成。

netfiler项目支持包过滤、网络地址转换、包记录、用户空间包排队和其他包该写。

1. netfilter钩子

netfilter钩子是Linux内核中的一个框架,它允许内核模块在Linux网络堆栈的不同位置注册回调函数。然后,对于遍历Linux网络堆栈中相应钩子的每个包,将回调注册的回调函数。

2. iptables简介

iptables是基于netfilter的命令行工具。用来定义过滤规则,实现对网络包的管理。

nftables是iptables的替代产品。

三、iptables基础概念

iptables是根据预先设定的规则(rules)来执行的。规则的定义为:”如果数据包符合给定的条件,就按照预先设定的动作处理这个数据包。”

规则存储在内核空间的信息包过滤表中。这些规则一般包含源地址、目的地址、传输协议、服务类型等等。当数据包与规则匹配时,iptables会根据规则中设定的动作来处理。

1. 链

1.1 什么是链?

数据包在本机会经过不同的位置,这些位置分别为prerouting、input、output、forward、postrouting。

图片来自朱双印博客

1.2 链的类型

prerouting

input

output

forward

postrouting

图片来自朱双印博客

根据上图,我们能够想象出某些常用场景中,报文的流向:

到本机某进程的报文:PREROUTING –> INPUT

由本机转发的报文:PREROUTING –> FORWARD –> POSTROUTING

由本机的某进程发出报文(通常为响应报文):OUTPUT –> POSTROUTING

2. 表

2.1 什么是表?

表是规则的合集,具有相似功能的规则,会放到相同的表中。

2.2 表的类型与说明

filter表:负责过滤功能,防火墙;内核模块:iptables_filter

nat表:network address translation,网络地址转换功能;内核模块:iptable_nat

mangle表:拆解报文,做出修改,并重新封装 的功能;iptable_mangle

raw表:关闭nat表上启用的连接追踪机制;iptable_raw

3. 表与链的关系

链是包可能要经过的位置,表是基于相似规则的集合。所以某些表的规则无法用于某些链。

3.1 链与表

PREROUTING      的规则可以存在于:raw表,mangle表,nat表。

INPUT          的规则可以存在于:mangle表,filter表,(centos7中还有nat表,centos6中没有)。

FORWARD         的规则可以存在于:mangle表,filter表。

OUTPUT         的规则可以存在于:raw表mangle表,nat表,filter表。

POSTROUTING      的规则可以存在于:mangle表,nat表。


3.2 表与链

raw     表中的规则可以被哪些链使用:PREROUTING,OUTPUT

mangle  表中的规则可以被哪些链使用:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING

nat     表中的规则可以被哪些链使用:PREROUTING,OUTPUT,POSTROUTING(centos7中还有INPUT,centos6中没有)

filter  表中的规则可以被哪些链使用:INPUT,FORWARD,OUTPUT

3.3 表与链的优先级

优先级次序(由高而低):raw –> mangle –> nat –> filter

4. 匹配条件

4.1 基础匹配条件

源地址Source IP,目标地址 Destination IP

4.2 扩展匹配条件

除了上述的条件可以用于匹配,还有很多其他的条件可以用于匹配,这些条件泛称为扩展条件,这些扩展条件其实也是netfilter中的一部分,只是以模块的形式存在,如果想要使用这些条件,则需要依赖对应的扩展模块。

5. 动作

5.1 ACCEPT

允许数据包通过。

5.2 DROP

直接丢弃数据包,不给任何回应信息,这时候客户端会感觉自己的请求泥牛入海了,过了超时时间才会有反应。

5.3 REJECT

拒绝数据包通过,必要时会给数据发送端一个响应的信息,客户端刚请求就会收到拒绝的信息。

5.4 SNAT

源地址转换,解决内网用户用同一个公网地址上网的问题。

5.5 MASQUERADE

是SNAT的一种特殊形式,适用于动态的、临时会变的ip上。

5.6 DNAT

目标地址转换。

5.7 REDIRECT

在本机做端口映射。

5.8 LOG

在/var/log/messages文件中记录日志信息,然后将数据包传递给下一条规则,也就是说除了记录以外不对数据包做任何其他操作,仍然让下一条规则去匹配。

四、iptables操作

iptables的操作主要分四类,增、删、改、查。

1. iptables字段涵义

pkts:对应规则匹配到的报文的个数。

bytes:对应匹配到的报文包的大小总和。

target:规则对应的target,往往表示规则对应的”动作”,即规则匹配成功后需要采取的措施。

prot:表示规则对应的协议,是否只针对某些协议应用此规则。

opt:表示规则对应的选项。

in:表示数据包由哪个接口(网卡)流入,我们可以设置通过哪块网卡流入的报文需要匹配当前规则。

out:表示数据包由哪个接口(网卡)流出,我们可以设置通过哪块网卡流出的报文需要匹配当前规则。

source:表示规则对应的源头地址,可以是一个IP,也可以是一个网段。

destination:表示规则对应的目标地址。可以是一个IP,也可以是一个网段。

policy表示当前链的默认策略,policy ACCEPT表示上图中INPUT的链的默认动作为ACCEPT,换句话说就是,默认接受通过INPUT关卡的所有请求。

packets表示当前链(上例为INPUT链)默认策略匹配到的包的数量,0 packets表示默认策略匹配到0个包。

bytes表示当前链默认策略匹配到的所有包的大小总和。

2. 增

注意点:添加规则时,规则的顺序非常重要。

在指定表的指定链的尾部添加一条规则,-A选项表示在对应链的末尾添加规则,省略-t选项时,表示默认操作filter表中的规则:

iptables -t 表名 -A 链名 匹配条件 -j 动作 

les -t filter -A INPUT -s 192.168.1.146 -j DROP  

在指定表的指定链的首部添加一条规则,-I选型表示在对应链的开头添加规则:

iptables -t 表名 -I 链名 匹配条件 -j 动作 

示例:iptables -t filter -I INPUT -s 192.168.1.146 -j ACCEPT  

在指定表的指定链的指定位置添加一条规则:

iptables -t 表名 -I 链名 规则序号 匹配条件 -j 动作 

示例:iptables -t filter -I INPUT 5 -s 192.168.1.146 -j REJECT  

设置指定表的指定链的默认策略(默认动作),并非添加规则:

iptables -t 表名 -P 链名 动作 

示例:iptables -t filter -P FORWARD ACCEPT 

上例表示将filter表中FORWARD链的默认策略设置为ACCEPT

3. 删

注意点:如果没有保存规则,删除规则时请慎重 

按照规则序号删除规则,删除指定表的指定链的指定规则,-D选项表示删除对应链中的规则:

iptables -t 表名 -D 链名 规则序号 

示例:iptables -t filter -D INPUT 3 //上述示例表示删除filter表中INPUT链中序号为3的规则。


 按照具体的匹配条件与动作删除规则,删除指定表的指定链的指定规则:

iptables -t 表名 -D 链名 匹配条件 -j 动作
 
示例:iptables -t filter -D INPUT -s 192.168.1.146 -j DROP //上述示例表示删除filter表中INPUT链中源地址为192.168.1.146并且动作为DROP的规则。


删除指定表的指定链中的所有规则,-F选项表示清空对应链中的规则,执行时需三思:

iptables -t 表名 -F 链名 

示例:iptables -t filter -F INPUT 

删除指定表中的所有规则,执行时需三思:

iptables -t 表名 -F 

示例:iptables -t filter -F 

4. 改

注意点:如果使用-R选项修改规则中的动作,那么必须指明原规则中的原匹配条件,例如源IP,目标IP等。 

修改指定表中指定链的指定规则,-R选项表示修改对应链中的规则,使用-R选项时要同时指定对应的链以及规则对应的序号,并且规则中原本的匹配条件不可省略:

iptables -t 表名 -R 链名 规则序号 规则原本的匹配条件 -j 动作 

示例:iptables -t filter -R INPUT 3 -s 192.168.1.146 -j ACCEPT 
//上述示例表示修改filter表中INPUT链的第3条规则,将这条规则的动作修改为ACCEPT, -s 192.168.1.146为这条规则中原本的匹配条件,如果省略此匹配条件,修改后的规则中的源地址可能会变为0.0.0.0/0。

其他修改规则的方法:先通过编号删除规则,再在原编号位置添加一条规则。 

修改指定表的指定链的默认策略(默认动作),并非修改规则,可以使用如下命令:

iptables -t 表名 -P 链名 动作 

示例:iptables -t filter -P FORWARD ACCEPT //上例表示将filter表中FORWARD链的默认策略修改为ACCEPT

5. 查

查看对应表的所有规则,-t选项指定要操作的表,省略”-t 表名”时,默认表示操作filter表,-L表示列出规则,即查看规则:

iptables -t 表名 -L

查看指定表的指定链中的规则:

iptables -t 表名 -L 链名


查看指定表的所有规则,并且显示更详细的信息(更多字段),-v表示verbose,表示详细的,冗长的,当使用-v选项时,会显示出”计数器”的信息,由于上例中使用的选项都是短选项,所以一般简写为iptables -t 表名 -vL 

iptables -t 表名 -v -L

表示查看表的所有规则,并且在显示规则时,不对规则中的IP或者端口进行名称反解,-n选项表示不解析IP地址。

iptables -t 表名 -n -L


表示查看表的所有规则,并且显示规则的序号,–line-numbers选项表示显示规则的序号,注意,此选项为长选项,不能与其他短选项合并,不过此选项可以简写为–line,注意,简写后仍然是两条横杠,仍然是长选项。

iptables --line-numbers -t 表名 -L

表示查看表中的所有规则,并且显示更详细的信息(-v选项),不过,计数器中的信息显示为精确的计数值,而不是显示为经过可读优化的计数值,-x选项表示显示计数器的精确值。

iptables -t 表名 -v -x -L

实际使用中,为了方便,往往会将短选项进行合并,所以,如果将上述选项都糅合在一起,可以写成如下命令,此处以filter表为例。当然,也可以只查看某张表中的某条链,此处以filter表的INPUT链为例。

iptables --line -t filter -nvxL

6. 保存规则

保存规则命令如下,表示将iptables规则保存至/etc/sysconfig/iptables文件中,如果对应的操作没有保存,那么当重启iptables服务以后,未保存的规则将丢失。

service iptables save 

注意点:centos7中使用默认使用firewalld,如果想要使用上述命令保存规则,需要安装iptables-services,具体配置过程请回顾上文。 

或者使用如下方法保存规则

iptables-save > /etc/sysconfig/iptables

可以使用如下命令从指定的文件载入规则,注意:重载规则时,文件中的规则将会覆盖现有规则。

iptables-restore < /etc/sysconfig/iptables

7. 基础匹配规则

-s用于匹配报文的源地址,可以同时指定多个源地址,每个IP之间用逗号隔开,也可以指定为一个网段。

#示例如下:

iptables -t filter -I INPUT -s 192.168.1.111,192.168.1.118 -j DROP 

iptables -t filter -I INPUT -s 192.168.1.0/24 -j ACCEPT

iptables -t filter -I INPUT ! -s 192.168.1.0/24 -j ACCEPT 

-d用于匹配报文的目标地址,可以同时指定多个目标地址,每个IP之间用逗号隔开,也可以指定为一个网段。

#示例如下:

iptables -t filter -I OUTPUT -d 192.168.1.111,192.168.1.118 -j DROP 

iptables -t filter -I INPUT -d 192.168.1.0/24 -j ACCEPT 

iptables -t filter -I INPUT ! -d 192.168.1.0/24 -j ACCEPT 

-p用于匹配报文的协议类型,可以匹配的协议类型tcp、udp、udplite、icmp、esp、ah、sctp等(centos7中还支持icmpv6、mh)。

#示例如下:

iptables -t filter -I INPUT -p tcp -s 192.168.1.146 -j ACCEPT 

iptables -t filter -I INPUT ! -p udp -s 192.168.1.146 -j ACCEPT 

-i用于匹配报文是从哪个网卡接口流入本机的,由于匹配条件只是用于匹配报文流入的网卡,所以在OUTPUT链与POSTROUTING链中不能使用此选项。

#示例如下:

iptables -t filter -I INPUT -p icmp -i eth4 -j DROP

iptables -t filter -I INPUT -p icmp ! -i eth4 -j DROP 

 -o用于匹配报文将要从哪个网卡接口流出本机,于匹配条件只是用于匹配报文流出的网卡,所以在INPUT链与PREROUTING链中不能使用此选项。

#示例如下:

iptables -t filter -I OUTPUT -p icmp -o eth4 -j DROP 

iptables -t filter -I OUTPUT -p icmp ! -o eth4 -j DROP

8. 扩展匹配条件

8.1 tcp扩展模块

–sport 用于匹配tcp协议报文的源端口,可以使用冒号指定一个连续的端口范围

#示例:

iptables -t filter -I OUTPUT -d 192.168.1.146 -p tcp -m tcp --sport 22 -j REJECT

iptables -t filter -I OUTPUT -d 192.168.1.146 -p tcp -m tcp --sport 22:25 -j REJECT
 
iptables -t filter -I OUTPUT -d 192.168.1.146 -p tcp -m tcp ! --sport 22 -j ACCEPT 

–dport 用于匹配tcp协议报文的目标端口,可以使用冒号指定一个连续的端口范围

#示例:

iptables -t filter -I INPUT -s 192.168.1.146 -p tcp -m tcp --dport 22:25 -j REJECT

iptables -t filter -I INPUT -s 192.168.1.146 -p tcp -m tcp --dport :22 -j REJECT

iptables -t filter -I INPUT -s 192.168.1.146 -p tcp -m tcp --dport 80: -j REJECT  

–tcp-flags 用于匹配报文的tcp头的标志位

#示例:

iptables -t filter -I INPUT -p tcp -m tcp --dport 22 --tcp-flags SYN,ACK,FIN,RST,URG,PSH SYN -j REJECT

iptables -t filter -I OUTPUT -p tcp -m tcp --sport 22 --tcp-flags SYN,ACK,FIN,RST,URG,PSH SYN,ACK -j REJECT
 
iptables -t filter -I INPUT -p tcp -m tcp --dport 22 --tcp-flags ALL SYN -j REJECT 

iptables -t filter -I OUTPUT -p tcp -m tcp --sport 22 --tcp-flags ALL SYN,ACK -j REJECT 

–syn 用于匹配tcp新建连接的请求报文,相当于使用”–tcp-flags SYN,RST,ACK,FIN  SYN”

#示例:

iptables -t filter -I INPUT -p tcp -m tcp --dport 22 --syn -j REJECT

8.2 multiport扩展模块

常用的扩展匹配条件如下:

-p tcp -m multiport –sports 用于匹配报文的源端口,可以指定离散的多个端口号,端口之间用”逗号”隔开

示例:

iptables -t filter -I OUTPUT -d 192.168.1.146 -p udp -m multiport --sports 137,138 -j REJECT 

-p udp -m multiport –dports 用于匹配报文的目标端口,可以指定离散的多个端口号,端口之间用”逗号”隔开

#示例:

iptables -t filter -I INPUT -s 192.168.1.146 -p tcp -m multiport --dports 22,80 -j REJECT 

iptables -t filter -I INPUT -s 192.168.1.146 -p tcp -m multiport ! --dports 22,80 -j REJECT 

iptables -t filter -I INPUT -s 192.168.1.146 -p tcp -m multiport --dports 80:88 -j REJECT 

iptables -t filter -I INPUT -s 192.168.1.146 -p tcp -m multiport --dports 22,80:88 -j REJECT

8.3 iprange模块

包含的扩展匹配条件如下

–src-range:指定连续的源地址范围

–dst-range:指定连续的目标地址范围

#示例:

iptables -t filter -I INPUT -m iprange --src-range 192.168.1.127-192.168.1.146 -j DROP 

iptables -t filter -I OUTPUT -m iprange --dst-range 192.168.1.127-192.168.1.146 -j DROP 

iptables -t filter -I INPUT -m iprange ! --src-range 192.168.1.127-192.168.1.146 -j DROP  

8.4 string模块

常用扩展匹配条件如下

–algo:指定对应的匹配算法,可用算法为bm、kmp,此选项为必需选项。

–string:指定需要匹配的字符串

#示例:

iptables -t filter -I INPUT -p tcp --sport 80 -m string --algo bm --string "OOXX" -j REJECT 

iptables -t filter -I INPUT -p tcp --sport 80 -m string --algo bm --string "OOXX" -j REJECT 

8.5 time模块

常用扩展匹配条件如下

–timestart:用于指定时间范围的开始时间,不可取反

–timestop:用于指定时间范围的结束时间,不可取反

–weekdays:用于指定”星期几”,可取反–monthdays:用于指定”几号”,可取反

–datestart:用于指定日期范围的开始日期,不可取反

–datestop:用于指定日期范围的结束时间,不可取反

#示例:

iptables -t filter -I OUTPUT -p tcp --dport 80 -m time --timestart 09:00:00 --timestop 19:00:00 -j REJECT 

iptables -t filter -I OUTPUT -p tcp --dport 443 -m time --timestart 09:00:00 --timestop 19:00:00 -j REJECT 

iptables -t filter -I OUTPUT -p tcp --dport 80 -m time --weekdays 6,7 -j REJECT 

iptables -t filter -I OUTPUT -p tcp --dport 80 -m time --monthdays 22,23 -j REJECT 

iptables -t filter -I OUTPUT -p tcp --dport 80 -m time ! --monthdays 22,23 -j REJECT 

iptables -t filter -I OUTPUT -p tcp --dport 80 -m time --timestart 09:00:00 --timestop 18:00:00 --weekdays 6,7 -j REJECT 

iptables -t filter -I OUTPUT -p tcp --dport 80 -m time --weekdays 5 --monthdays 22,23,24,25,26,27,28 -j REJECT 

iptables -t filter -I OUTPUT -p tcp --dport 80 -m time --datestart 2017-12-24 --datestop 2017-12-27 -j REJECT  

8.6 connlimit 模块

常用的扩展匹配条件如下

–connlimit-above:单独使用此选项时,表示限制每个IP的链接数量。

–connlimit-mask:此选项不能单独使用,在使用–connlimit-above选项时,配合此选项,则可以针对”某类IP段内的一定数量的IP”进行连接数量的限制,如果不明白可以参考上文的详细解释。

#示例:

iptables -I INPUT -p tcp --dport 22 -m connlimit --connlimit-above 2 -j REJECT 

iptables -I INPUT -p tcp --dport 22 -m connlimit --connlimit-above 20 --connlimit-mask 24 -j REJECT 

iptables -I INPUT -p tcp --dport 22 -m connlimit --connlimit-above 10 --connlimit-mask 27 -j REJECT  

8.7 limit模块

常用的扩展匹配条件如下

–limit-burst:类比”令牌桶”算法,此选项用于指定令牌桶中令牌的最大数量,上文中已经详细的描述了”令牌桶”的概念,方便回顾。

–limit:类比”令牌桶”算法,此选项用于指定令牌桶中生成新令牌的频率,可用时间单位有second、minute 、hour、day。

#示例

#注意,如下两条规则需配合使用,具体原因上文已经解释过,忘记了可以回顾。

iptables -t filter -I INPUT -p icmp -m limit --limit-burst 3 --limit 10/minute -j ACCEPT 

iptables -t filter -A INPUT -p icmp -j REJECT


8.8 udp扩展

常用的扩展匹配条件

–sport:匹配udp报文的源地址

–dport:匹配udp报文的目标地址

#示例:

iptables -t filter -I INPUT -p udp -m udp --dport 137 -j ACCEPT 

iptables -t filter -I INPUT -p udp -m udp --dport 137:157 -j ACCEPT 

#可以结合multiport模块指定多个离散的端口 

8.9 icmp扩展

常用的扩展匹配条件

–icmp-type:匹配icmp报文的具体类型

#示例:

iptables -t filter -I INPUT -p icmp -m icmp --icmp-type 8/0 -j REJECT 

iptables -t filter -I INPUT -p icmp --icmp-type 8 -j REJECT 

iptables -t filter -I OUTPUT -p icmp -m icmp --icmp-type 0/0 -j REJECT 

iptables -t filter -I OUTPUT -p icmp --icmp-type 0 -j REJECT 

iptables -t filter -I INPUT -p icmp --icmp-type "echo-request" -j REJECT

8.10 state模块

iptables -t filter -I INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

五、iptables自定义链

iptables可以自定义链,但自定义链无法单独使用,只能被iptables的默认链引用。

1. 创建自定义链

#示例:在filter表中创建IN_WEB自定义链

iptables -t filter -N IN_WEB  

2. 创建自定义链规则

iptables -I IN_WEB -s 192.168.1.188 -j ReJECT

3. 引用自定义链

#示例:在INPUT链中引用刚才创建的自定义链

iptables -t filter -I INPUT -p tcp --dport 80 -j IN_WEB  

4. 重命名自定义链

#示例:将IN_WEB自定义链重命名为WEB

iptables -E IN_WEB WEB  

5. 删除自定义链

删除自定义链需要满足两个条件

1、自定义链没有被引用

2、自定义链中没有任何规则

#示例:删除引用计数为0并且不包含任何规则的WEB链

iptables -X WEB

六、iptables配置示例

1. 使用iptable查看数据包的传递

iptables -t raw -A OUTPUT -p icmp -j TRACE
iptables -t raw -A PREROUTING -p icmp -j 

TRACE配置完成后,可以在/var/log/syslog查看数据包的传输日志

七、参考博文

https://www.zsythink.net/archives/category/%e8%bf%90%e7%bb%b4%e7%9b%b8%e5%85%b3/iptables

Linux 防火墙IPTABLES 命令详解

浅谈iptables防SYN Flood攻击和CC攻击

Previous Post

goreplay学习笔记

Next Post

文件大小与文件占用空间的区别

Related Posts