前言:本文主要讲解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