Iptables自定义链
自定义链
iptables 具有默认的五个链,PREROUTING、INPUT、FORWARD、OUTPUT、POSTROUTING,用于定义数据包流入系统、流出系统以及转发的规则。除了这些默认的链,iptables 还允许你创建自定义链,这些自定义链可以根据需要添加到默认链中或者互相连接。
自定义链是一组规则的集合,可以根据特定的需求创建。它们可以让你更好地组织和管理规则,从而使防火墙规则更加清晰和易于维护。
创建自定义链路
# -N 创建一个链
[root@telegraf01 ~]# iptables -N test-input
# -E 修改链路名称
[root@telegraf01 ~]# iptables -E test-input TEST-INPUT
# -L 查看链路
# Chain TEST-INPUT (0 references) 表示被引用 0 次
[root@telegraf01 ~]# iptables -L TEST-INPUT
Chain TEST-INPUT (0 references)
target prot opt source destination
添加自定义链表规则
# -A 表示选择链路
# -s 就是源 IP 地址,表示仅针对来自 IP 地址为 192.168.17.45 的数据包执行此规则
# -p 这个选项表示指定协议为 TCP
# --dport 指定目标端口为 81,表示仅针对目标端口为 81 的数据包执行此规则。
# -j 当匹配了前面的条件后,执行 DROP 操作,即丢弃数据包,阻止其通过防火墙。
[root@telegraf01 ~]# iptables -A TEST-INPUT -s 192.168.17.45 -p tcp --dport 81 -j DROP
# 配置完规则到自定义链路上时,是没有生效的,因为他没有被内置的 5 条链路的其中一条引用
绑定自定义链路到内置链路
# -A 表示选择链路
# -j 表示执行 TEST-INPUT 操作
[root@telegraf01 ~]# iptables -A INPUT -j TEST-INPUT
查看被引用
# 可以看到 INPUT 链路的第一条规则就是 TEST-INPUT
[root@telegraf01 ~]# iptables -L INPUT
Chain INPUT (policy ACCEPT)
target prot opt source destination
TEST-INPUT all -- anywhere anywhere
# 可以看到 TEST-INPUT 的 references 为 1,表示被引用了一次
# 可以看到 TEST-INPUT 下有一条设置的规则
[root@telegraf01 ~]# iptables -L TEST-INPUT
Chain TEST-INPUT (1 references)
target prot opt source destination
DROP tcp -- 192.168.17.45 anywhere tcp dpt:81
测试
# 本机开启简单 HTTP 服务
[root@telegraf01 ~]# python3 -m http.server 81
Serving HTTP on 0.0.0.0 port 81 (http://0.0.0.0:81/) ...
# 192.168.17.43 访问本机 81 端口,发现不通,这是因为规则把 192.168.17.45 来访问 本机 81 端口的包丢掉了
[root@telegraf02 ~]# telnet 192.168.17.43 81
Trying 192.168.17.43...
删除
# 先查看默认链路
# --line-number 显示行号
[root@telegraf01 ~]# iptables -L INPUT --line-number
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 TEST-INPUT all -- anywhere anywhere
# -D 删除
# 1 第一条规则
[root@telegraf01 ~]# iptables -D INPUT 1
# 查看自定义链路
[root@telegraf01 ~]# iptables -L TEST-INPUT --line-number
Chain TEST-INPUT (0 references)
num target prot opt source destination
1 DROP tcp -- 192.168.17.45 anywhere tcp dpt:81
# 可以选择 -D 删除指定行
[root@telegraf01 ~]# iptables -D TEST-INPUT 1
# 也可以选择 -F 清空
[root@telegraf01 ~]# iptables -F TEST-INPUT
# -X 删除自定义链路
[root@telegraf01 ~]# iptables -X TEST-INPUT