安装iptables
我是用的系统是debian 12,目前没有安装iptables。
![](https://img-blog.csdnimg.cn/direct/946c3a5527804e71a77b18ddc2d5c50a.png)
iptables 的配置语法
iptables (选项) (参数)
# 通用匹配:源地址目标地址的匹配
-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] :把指定链,或者表中的所有链上的所有计数器清零
-j, --jump target <指定目标> :即满足某条件时该执行什么样的动作。target 可以是内置的目标,比如 ACCEPT,也可以是用户自定义的链
-h:显示帮助信息
iptables查看操作
iptables为我们预定义了4张表,它们分别是raw表、mangle表、nat表、filter表,不同的表拥有不同的功能。我们应该如何查看这四张表呢?
iptables -t 表 -L #-t选项,指定要操作的表,使用-L选项,查看-t选项对应的表的规则,-L选项的意思是,列出规则
![](https://img-blog.csdnimg.cn/direct/30bb33c1ee274bcea1f3741778cd2b25.png)
上图中,显示出了3条链,INPUT链、FORWARD链、OUTPUT链,每条链中都有自己的规则。前文中,从上图中可以看出,INPUT链、FORWARD链、OUTPUT链都拥有”过滤”的能力,所以,当我们要定义某条”过滤”的规则时,我们会在filter表中定义,但是具体在哪条”链”上定义规则,这取决于我们的工作场景。比如,我们需要禁止某个IP地址访问我们的主机,我们则需要在INPUT链上定义规则。因为,我们在前面的文章中已经提到过,报文发往本机时,会经过PREROUTING链与INPUT链(如果你没有明白,请回顾前文),所以,如果我们想要禁止某些报文发往本机,我们只能在PREROUTING链和INPUT链中定义规则,但是PREROUTING链并不存在于filter表中,换句话说就是,PREROUTING就没有过滤的能力,所以,我们只能在INPUT链中定义,当然,如果是其他工作场景,可能需要在FORWARD链或者OUTPUT链中定义过滤规则。
![](https://img-blog.csdnimg.cn/direct/6fa38ef65fc14d5393c5f9b6fb5b3aea.png)
进阶查询
当iptables表中的条目非常多时,直接输出iptables -L或者iptables -t filter -L显示的数据量可能非常大,此时可以进行表中对应链的查询,不需要直接输出所有链信息
![](https://img-blog.csdnimg.cn/direct/a5d2268bef6e454496ac270f269f37fc.png)
通过上述方式可以看到具体的某个链的信息,如果需要看到更为详细的信息,需要加上-v参数
![](https://img-blog.csdnimg.cn/direct/1612933f09e347f4952173bd56730491.png)
使用-v选项后,iptables为我们展示的信息更多了
pkts:对应规则匹配到的报文的个数。
bytes:对应匹配到的报文包的大小总和。
target:规则对应的target,往往表示规则对应的”动作”,即规则匹配成功后需要采取的措施。
prot:表示规则对应的协议,是否只针对某些协议应用此规则。
opt:表示规则对应的选项。
in:表示数据包由哪个接口(网卡)流入,即从哪个网卡来。
out:表示数据包将由哪个接口(网卡)流出,即到哪个网卡去。
source:表示规则对应的源头地址,可以是一个IP,也可以是一个网段。
destination:表示规则对应的目标地址。可以是一个IP,也可以是一个网段。
如果细心一点一定就会发现,上图中的源地址与目标地址都为anywhere,这是因为iptables默认进行了名称解析,但是在规则非常多的情况下如果进行名称解析,效率会比较低,所以,在没有此需求的情况下,可以使用-n选项,表示不对IP地址进行名称反解,直接显示IP地址
![](https://img-blog.csdnimg.cn/direct/e13d27819ca54e3894f38a74e21311b4.png)
此时上面的iptables表中从上到下依次匹配,但是我们却看不到每一条对应的顺序,这样在进行新增过滤条目插入具体位置的时候就没有办法判定具体插入到什么地方,可以是用--line-numbers显示规则编号
上图中FORWARD链后面的括号中包含policy DROP ,4 packets,1233bytes 三部分。
policy表示当前链的默认策略,policy DROP表示上图中FORWARD的链的默认动作为DROP,换句话说就是,默认接受丢掉FORWARD关卡的所有请求,所以我们在配置FORWARD链的具体规则时,应该将需要允许的请求配置到规则中,说白了就是”白名单”机制,默认所有都拒绝,只有指定的通过。当我们把FORWARD链默认动作设置为接受(ACCEPT),就表示所有人都能通过这个关卡,此时就应该在具体的规则中指定需要拒绝的请求,就表示只有指定的人不能通过这个关卡,这就是黑名单机制,。
packets表示当前链(上例为FORWARD链)默认策略匹配到的包的数量,4packets表示默认策略匹配到4个包。
bytes表示当前链默认策略匹配到的所有包的大小总和。