一、自定义chain链

iptables 中,可以创建自定义链(Custom Chains)来组织和管理防火墙规则。自定义链可以以更高层次和更好的可读性来管理规则,使配置和维护更加简单。

以下为在iptables中创建和使用自定义链的示例
1:创建chain mychain

[root@node1 ~]# iptables -N MYCHAIN

2:添加规则到自定义链

[root@node1 ~]# iptables -A MYCHAIN -s 192.168.1.0/24 -j DROP
禁止192.168.1.0的网段访问本机,丢弃源地址的流量

3:调用自定义链

[root@node1 ~]# iptables -A INPUT -p tcp --dport 80 -j MYCHAIN
这将将所有传入 TCP 端口 80 的流量传递到 MYCHAIN 自定义链进行处理。
如果不调用自定义的规则链,则自定义的规则链无效

4:删除自定义链

[root@node1 ~]# iptables -F MYCHAIN  # 清空链中的规则
[root@node1 ~]# iptables -X MYCHAIN  # 删除链

二、模块使用

  • -m 模块使用

iptables -m 是用于指定 IP 转发规则的匹配模块(Match Modules)的选项。这些模块允许你在 iptables 规则中添加特定的条件和过滤器,以便根据不同的匹配规则来处理网络流量。

以下是几个常用的 iptables -m 选项及其用法:

1;-m state(状态匹配模块)
示例:仅允许建立的和已有连接的数据包通过,其他的数据包将被丢弃。
[root@node1 ~]# iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
[root@node1 ~]# iptables -A INPUT -m state --state NEW -j DROP
这将添加两条规则,允许建立的和已有连接的数据包通过,丢弃新连接的数据包。

2:-m tcp(TCP 匹配模块)
示例:仅允许目的端口为 80 的 TCP 流量通过。
[root@node1 ~]# iptables -A INPUT -p tcp --dport 80 -j ACCEPT

3:-m udp(UDP 匹配模块)
示例:仅允许目的端口为 53 的 UDP 流量通过。
[root@node1 ~]# iptables -A INPUT -p tcp --dport 80 -j ACCEPT

4:-m limit(限制匹配模块)
示例:对流入的 ICMP 数据包进行限制,每秒最多只允许 2 个。
[root@node1 ~]# iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 2/second -j ACCEPT

5:-m multiport
访问多个不连续端口
[root@node1 ~]# iptables -A INPUT -p tcp -m multiport --dport 22,53,80,110,200 -j ACCEPT
访问多个连续端口,使用冒号隔开
[root@node1 ~]# iptables -A INPUT -p tcp -m multiport --dport 22,53,80,100:200 -j ACCEPT

multiport有--dport,--sport,--ports三个参数
--dport匹配目的地址
--sport匹配源端口
--ports匹配源端口和目的端口,要求源和目的一致

6:iprange
允许一段地址访问本地的某些端口
[root@node1 ~]# iptables -A INPUT  -m iprange --src-range 192.168.2.2-192.168.2.208 -d 192.168.2.12 -p tcp -m multiport --dport 22,53,80,100:200 -j ACCEPT

iprange有两个参数,--src-range和--dst-range

7:-m comment是 iptables 命令中用于添加注释的模块。该模块允许你在 iptables 规则中添加注释,以便更好地理解和管理规则。
[root@node1 ~]# iptables -A INPUT -p tcp --dport 22 -m comment --comment "Allow SSH" -j ACCEPT
以上命令将在 INPUT 链中添加一条规则,允许 SSH 连接(目标端口为 22),并添加了一个注释 “Allow SSH”。
这仅仅是一些 iptables -m 选项的示例,iptables 的匹配模块还有很多其他可用选项,可以根据你的需求选择适合的模块来实现更具体的规则。你可以查阅 iptables 的文档以获取更多关于不同 iptables -m 选项的详细信息和用法。
  • 规则查看

查看iptables规则

[root@node1 ~]# iptables -nvL --line-numbers   ###使用--line添加行号
Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination         
1    cali-INPUT  all  --  anywhere             anywhere             /* cali:Cz_u1IQiXIMmKD4c */
2    KUBE-PROXY-FIREWALL  all  --  anywhere             anywhere             /* kube-proxy firewall rules */
3    KUBE-NODE-PORT  all  --  anywhere             anywhere             /* kubernetes health check rules */
4    ACCEPT     udp  --  anywhere             node1                udp dpt:domain
5    ACCEPT     tcp  --  anywhere             node1                tcp dpt:domain
6    KUBE-FIREWALL  all  --  anywhere             anywhere            
注意,在iptables中,编号越小的规则优先级越高,会首先被匹配和执行。

查看某一个chain中的规则

[root@node1 ~]# iptables -nvL INPUT --line-numbers  ###使用-L指定规则链名称
Chain INPUT (policy ACCEPT 136 packets, 18495 bytes)
num   pkts bytes target     prot opt in     out     source               destination         
1      18M 3041M cali-INPUT  all  --  *      *       0.0.0.0/0            0.0.0.0/0            /* cali:Cz_u1IQiXIMmKD4c */
2      17M 2955M KUBE-PROXY-FIREWALL  all  --  *      *       0.0.0.0/0            0.0.0.0/0            /* kube-proxy firewall rules */
3    1965M  397G KUBE-NODE-PORT  all  --  *      *       0.0.0.0/0            0.0.0.0/0            /* kubernetes health check rules */
4        7   654 ACCEPT     udp  --  *      *       0.0.0.0/0            169.254.25.10        udp dpt:53
5        0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            169.254.25.10        tcp dpt:53
6    1965M  397G KUBE-FIREWALL  all  --  *      *       0.0.0.0/0            0.0.0.0/0

查看指定行号对应的规则的详细信息

[root@node1 ~]# iptables -S INPUT 1
-A INPUT -m comment --comment "cali:Cz_u1IQiXIMmKD4c" -j cali-INPUT
[root@node1 ~]# 
注意:将 INPUT 替换为你感兴趣的链的名称,例如 FORWARD 或 OUTPUT,以及将 3 替换为你找到的实际行号。
  • DROP 和REJECT区别
iptables DROP 是一种 iptables 命令,用于在防火墙规则中丢弃(Drop)进入的网络流量。当一个数据包与规则匹配时,该规则将立即丢弃该数据包,不做任何响应或回复。
[root@node1 ~]# iptables -A INPUT -j DROP
上述命令将在 INPUT 链的末尾添加一条规则,指定对于所有匹配的数据包,直接丢弃(Drop)它们。

该规则将会阻止任何传入的数据包通过 INPUT 链,并且不会给发送方发送任何响应。这相当于完全丢弃这些数据包,而不给发送方任何回应或通知。
需要注意,使用 DROP 规则时应格外谨慎。因为 DROP 是静默丢弃数据包,发送方通常无法得知数据包被丢弃。这在某些情况下可能会导致不可预料的问题,例如连接超时,响应中断等。

iptables REJECT 是一种 iptables 命令,用于在防火墙规则中拒绝(Reject)进入的网络流量。当一个数据包与规则匹配时,该规则将发送一条拒绝响应给发送方,表示连接被拒绝。
[root@node1 ~]# iptables -A INPUT -j REJECT
上述命令将在 INPUT 链的末尾添加一条规则,指定对于所有匹配的数据包,发送一条拒绝响应。

该规则将会拒绝任何传入的数据包,并向发送方发送一个拒绝响应。拒绝响应通常是一个 ICMP 错误消息,告知发送方连接被拒绝。

与 DROP 不同,REJECT 规则会向发送方发送响应,使其获得连接被拒绝的信息。这有助于发送方更好地处理连接问题,比如更快地进行重试或采取其他措施。
  • 插入规则
1;在开头插入一条规则
iptables -I 是用于向 iptables 防火墙规则链中插入新规则的命令。它允许你在规则链的开头插入一个或多个规则,以控制网络数据包的流动。
示例:在 INPUT 规则链的开头插入允许 SSH 连接的规则
[root@node1 ~]# iptables -I INPUT -p tcp --dport 22 -j ACCEPT

2:在指定位置插入一条规则
[root@node1 ~]# iptables -I INPUT 3 -p tcp --dport 22 -j ACCEPT
这将在 INPUT 规则链的第三个位置插入一条允许 TCP 22 端口(SSH)连接的规则。

请注意,如果你指定的位置超出了规则链的现有规则数量加一,规则将被插入到规则链的末尾。
  • 修改规则
使用 iptables -R 命令来编辑规则。iptables -R 允许你修改 iptables 防火墙中指定规则链中的一条规则。
示例:编辑 INPUT 规则链中的第一条规则,将目标 IP 地址更改为 192.168.1.100
[root@node1 ~]# iptables -R INPUT 1 -s 192.168.1.100 -j ACCEPT

请注意,使用 iptables -R 命令修改规则时,你需要确保规则编号存在于规则链中。
  • chain重命名
在 iptables 中,目前没有直接的方法来重命名规则链。但是,你可以通过复制规则链到一个新的名称,然后删除原来的规则链来实现类似的效果。以下是一种实现重命名规则链的方法:
示例:
1:复制规则链到一个新的名称:

[root@node1 ~]# iptables -E <old-chain> <new-chain>

2:删除旧的链
[root@node1 ~]# iptables -X <old-chain>
  • 指定网口
iptables -i 是用于指定网络接口的选项,用于限制防火墙规则适用于特定的网络接口。这允许你在规则中定义特定接口上的数据流量匹配条件。
示例:
iptables -A INPUT -i eth0 -p tcp --dport 22 -j ACCEPT
这将在 INPUT 规则链末尾添加一条规则,该规则仅允许通过 eth0 接口进入的 SSH 连接。