iptables指令逻辑详解

前言:本文主要讲解iptables的基本概念,工作处理流程,配置指令

 

一、基本概念

iptables用以进行网络防火墙,具体概念由表(table)、链(Chain)、规则构成。一个iptables包含多个表,一个表包含多条链、一条链包含多条规则,每条规则包含一个匹配项和数据包处理动作。iptables包含filter、nat、mangle、raw四张表,其中filter表最常用,链一共有PREROUTING、INPUT、FORWARD、OUTPUT、POSTROUTING五条链(hook,即5个钩子函数),每个链上都有一些规则,一个规则定义了匹配模式和处理动作。具体每张表只能包含特定链,而一条链可以有多种规则,指定匹配模式和处理方式,如果一个数据包无法匹配链上的任何一条规则,则采取默认处理动作。

注:一共有4张表、5条链,但是每张表都只能包含特定的链,每条链可以包含不同的规则。具体关系如下图:

 

二、iptables处理流程

在得知iptables内部的静态结构后,需要进一步了解各个模块间的相互作用,如何实现防火墙,检测、修改、转发、重定向、丢弃数据包的。理解iptable如何工作关键是理解下图:

 

 

整个iptables的封包流向如上图所示:

 封包首先经过nat->PREROUTING,进行路由判断,本包数据是转发还是放行进入本机,是否需要进行网络地址转换。若果需要转发则走filter->FORWARD链,如果放行进本机,走filter->INPUT链。所以网络封包有两条线路:

1)转发线路:

nat-PREROUTING  ------------> filter-FORWARD-------------->nat-POSTROUTING

2)放行路线:

nat-PREROUTING------->filter-INPUT-------->local_process--------->nat-OUTPUT---------->filter-OUTPUT------->nat-POSTROUTING

更详细的流向:

三、iptables配置指令

指令基本模式如下:

iptables [-t table_name] -option [chain_name] [rule_no] [rule] [-j action] 
表示对表tablbe_name中的chain_name链的规则执行<option>操作。表名由-t参数指定,chain_name指定链,rule_no指定chain_name链中的第几条规则(规则下标从1开始),rule用以定义规则的匹配模式(数据包匹配),action表示匹配rule的数据包采取何种动作。

1. -t table_name

如果缺少表名,则表示对表filter中chain_name的链执行操作。

 

2. 对于option说明

  • 管理链上规则:(增、删、改、查)

-A:在规则链后附加一条规则

-I:在规则连前添加一条规则

-D:删除一条规则,需要指定规则号

-F:清空链上所有规则

-R:替换某条规则

-L:列出链中所有规则,不指定链名则查所有的链。

 

  • 链本身管理

-N:创建一个新链

-X:删除一条链

-E:重新命名链

-P:对链指定默认的处理动作,如果某个数据包匹配不到规则,采取默认动作

 

3. 对于rule的写法:

rule表示为条件匹配,包含了三种匹配:基本匹配、拓展匹配;拓展匹配又分为隐式拓展匹配、显示拓展匹配

  • 基本匹配:

一般参数都是单斜杆开始

 -p 协议名 [-i/o 网卡名]  [-s 源IP/源子网]  [-d 目标IP/目标子网] 

-i/o:

指定出入口网卡名,例如 -i eth1,指定网卡eth流入的数据包

-p:

指定协议,-p tcp,指定tcp协议

-s :

指定源ip

-d:

指定目的ip

利用以上参数来对数据包进行过滤,即匹配规则。

  • 显示拓展匹配:

显式拓展匹配表示用-m 选项显示指定拓展项的类型,而后指定该类型拓展项的指定参数,例如

-m limit --limit 3/s
这一条匹配项表示该拓展项为limit(表示是限制),--limit是该类拓展项的一个限制速率的参数名。就是限制速率。再者
-m state --state NEW ESTABLISTHED 

指定state拓展项,表示检查连接状态,--state指定要检查的状态为NEW ESTABLISHED。

常用显示拓展项:

 

  • 隐式拓展项:

隐式拓展项即不需要使用-m ext_name来指定拓展的名称,可以省略。例如

-m tcp、-m udp、-m icmp,但是省略的前提条件是包含-p tcp、-p udp、-p icmp时可以省略。

隐式拓展项的参数如下:

4. -j

跳到一个动作处理数据包,可以是默认动作,也可以是一个自定义链。

ACCEPT

REJECT

DROP

RETURN

DNAT

该动作用以对进入本机的ip封包进行网络地址转,一般后面会跟随参数--to-destination 192.168.0.101类似的内网地址参数用以Nat。

 

iptables -t nat -A PREROUTING -i  eth0 -p tcp -d 139.151.134.155 --dport 8080 -j DNAT --to-destination 192.168.0.101 

SNAT

该动作用以对出去本机的ip封包进行网络地址转,一般后面会跟随参数--to-source 139.151.134.155类似的外网可用地址。

iptables -t nat -A POSTROTING -o eth0 -p tcp -j SNAT --to-source 139.151.134.155
REDIRECT 

该动作用以端口重定向 

iptables -t nat -A PREROUTING  -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 8080-8090

 

参数解释:

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

大写字母都是指定操作动作。

 

-t, --table table 对指定的表 table 进行操作, table 必须是 raw, nat,filter,mangle 中的一个。如果不指定此选项,默认的是 filter 表。

 
# 通用匹配:源地址目标地址的匹配
-p:指定要匹配的数据包协议类型;
-s, --source [!] address[/mask] :把指定的一个/一组地址作为源地址,按此规则进行过滤。当后面没有 mask 时,address 是一个地址,比如:192.168.1.1;当 mask 指定时,可以表示一组范围内的地址,比如:192.168.1.0/255.255.255.0。
-d, --destination [!] address[/mask] :地址格式同上,但这里是指定地址为目的地址,按此进行过滤。
-i, --in-interface [!] <网络接口name> :指定数据包的来自来自网络接口,比如最常见的 eth0 。注意:它只对 INPUT,FORWARD,PREROUTING 这三个链起作用。如果没有指定此选项, 说明可以来自任何一个网络接口。同前面类似,"!" 表示取反。
-o, --out-interface [!] <网络接口name> :指定数据包出去的网络接口。只对 OUTPUT,FORWARD,POSTROUTING 三个链起作用。

 
# 查看管理命令
-L, --list [chain] 列出链 chain 上面的所有规则,如果没有指定链,列出表上所有链的所有规则。

 
# 规则管理命令
-A, --append chain rule-specification 在指定链 chain 的末尾插入指定的规则,也就是说,这条规则会被放到最后,最后才会被执行。规则是由后面的匹配来指定。
-I, --insert chain [rulenum] rule-specification 在链 chain 中的指定位置插入一条或多条规则。如果指定的规则号是1,则在链的头部插入。这也是默认的情况,如果没有指定规则号。
-D, --delete chain rule-specification -D, --delete chain rulenum 在指定的链 chain 中删除一个或多个指定规则。
-R num:Replays替换/修改第几条规则

 
# 链管理命令(这都是立即生效的)
-P, --policy chain target :为指定的链 chain 设置策略 target。注意,只有内置的链才允许有策略,用户自定义的是不允许的。
-F, --flush [chain] 清空指定链 chain 上面的所有规则。如果没有指定链,清空该表上所有链的所有规则。
-N, --new-chain chain 用指定的名字创建一个新的链。
-X, --delete-chain [chain] :删除指定的链,这个链必须没有被其它任何规则引用,而且这条上必须没有任何规则。如果没有指定链名,则会删除该表中所有非内置的链。
-E, --rename-chain old-chain new-chain :用指定的新名字去重命名指定的链。这并不会对链内部照成任何影响。
-Z, --zero [chain] :把指定链,或者表中的所有链上的所有计数器清零。
-m,  指定拓展项,具体拓展项见help。
-j, --jump target <指定目标> :即满足某条件时该执行什么样的动作。target 可以是内置的目标,比如 ACCEPT,也可以是用户自定义的链。
-h:显示帮助信息;

https://wangchujiang.com/linux-command/c/iptables.html

https://www.91yun.co/archives/1690

 

四、规则保存与恢复:

iptables-save

iptables-restore

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章