介绍
iptables是Linux平台下的包过滤防火墙呢,它可以完成封包过滤、封包重定向和网络地址转换(NAT)等功能哦。要说iptables的内部规则,主要就是要明白三个概念:表(tables)、链(chains)和规则(rules)
表介绍
• 表(Tables):iptables内置了4个表,即filter表、nat表、mangle表和raw表。
• filter表:用于过滤数据包,决定是否允许或拒绝数据包通过;
• nat表:用于网络地址转换,例如将私有IP地址映射到公共IP地址;
• mangle表:用于修改数据包的特定字段,如TTL(生存时间);
• raw表:用于配置连接跟踪表规则,决定是否对数据包进行状态跟踪。
内建表:Filter, NAT, Mangle, Raw
表的处理优先级:raw>mangle>nat>filter。
filter:一般的过滤功能,是iptables的默认表,它有三种内建链(chains):INPUT链 – 处理来自外部的数据;OUTPUT链 – 处理向外发送的数据;FORWARD链 – 将数据转发到本机的其他网卡设备上。
Nat:用于nat功能(端口映射,地址映射等)
Mangle:用于对特定数据包的修改
Raw:优先级最高,设置raw时一般是为了不再让iptables做数据包的链接跟踪处理,提高性能。默认表是filter(没有指定表的时候就是filter表)
链介绍
• 链(Chains):每个表包含一些链,链是规则的集合,用于定义数据包的处理流程。常见的链包括INPUT(处理输入数据包)、OUTPUT(处理输出数据包)、FORWARD(转发数据包时应用的链)、PREROUTING(对数据包作路由选择前应用此链中的规则)和POSTROUTING(对数据包作路由选择后应用此链中的规则)。
规则介绍
• 规则(Rules):规则定义了数据包的匹配条件以及匹配条件满足时应该执行的动作。每个规则包含一个匹配条件和一个动作。常见的动作包括ACCEPT(允许通过)、DROP(丢弃数据包)、REJECT(拒绝数据包通过,并向发送方发送一个响应)等。
当数据包到达一个链时,iptables就会从链中第一条规则开始检查,看该数据包是否满足规则所定义的条件。如果满足,系统就会根据该条规则所定义的方法处理该数据包;否则iptables将继续检查下一条规则,如果该数据包不符合链中任一条规则,iptables就会根据该链预先定义的默认策略来处理数据包。
iptables 中 常用表 中各有哪些链接?
在 iptables
中,有几个常用的表(tables)和每个表中的链(chains)。以下是主要的表及其包含的链:
1. filter 表
这是默认的表,主要用于包过滤。它包含以下链:
- INPUT:处理进入本地系统的数据包。
- FORWARD:处理转发的数据包(即不发往本地系统的数据包)。
- OUTPUT:处理从本地系统发出的数据包。
2. nat 表
用于网络地址转换(NAT)。它包含以下链:
- PREROUTING:在路由决策之前处理入站数据包。通常用于目的地址转换(DNAT)。
- POSTROUTING:在路由决策之后处理出站数据包。通常用于源地址转换(SNAT)。
- OUTPUT:处理本地生成的出站数据包,可用于对这些数据包进行 NAT 操作。
3. mangle 表
用于特殊的包修改。它包含以下链:
- PREROUTING:在路由(就是本机route表)之前处理入站数据包,通常用于修改数据包的某些字段(如 QoS 标记)。
- INPUT:处理进入本地系统的数据包,允许对这些数据包进行特殊处理。
- FORWARD:处理转发的数据包,允许对这些数据包进行特殊处理-一般都是指转到其他主机上。
- OUTPUT:处理从本地系统发出的数据包,允许对这些数据包进行特殊处理。
- POSTROUTING:在路由之后处理出站数据包,允许对这些数据包进行特殊处理。就是经过本机的路由表 来分析应该发到那个ip(或者网卡-可能是虚拟网卡) 之后
4. raw 表
用于用于配置数据包的跟踪(connection tracking)。它包含以下链:
- PREROUTING:在路由决策之前处理入站数据包。
- OUTPUT:处理本地生成的出站数据包。
5. security 表
用于增强的安全性(如 SELinux)。它包含以下链:
- INPUT:处理进入本地系统的数据包。
- OUTPUT:处理从本地系统发出的数据包。
- FORWARD:处理转发的数据包。
总结
- filter 表:主要用于包过滤,包含
INPUT
,FORWARD
,OUTPUT
。 - nat 表:用于网络地址转换,包含
PREROUTING
,POSTROUTING
,OUTPUT
。 - mangle 表:用于特殊的包修改,包含
PREROUTING
,INPUT
,FORWARD
,OUTPUT
,POSTROUTING
。 - raw 表:用于配置连接跟踪,包含
PREROUTING
,OUTPUT
。 - security 表:用于安全性增强,包含
INPUT
,OUTPUT
,FORWARD
。
数据包处理顺序
-
接收数据包:
- 当数据包到达网络接口时,内核首先接收到这个数据包。
-
PREROUTING 链:
- 在路由决策之前,数据包会进入
PREROUTING
链。这一链允许你在数据包被路由之前对其进行修改(例如,进行目的地址转换,或丢弃数据包)。 - 在这一阶段,
iptables
的规则可以影响后续的路由决策。比如,你可以使用 DNAT(目的地址转换)来改变数据包的目标地址。
- 在路由决策之前,数据包会进入
-
路由决策:
- 数据包经过
PREROUTING
链后,内核会根据路由表(routing table)来决定数据包的去向。此时,内核会查找目的地址,并决定数据包应该被发送到哪个接口。
- 数据包经过
-
INPUT 链(如果数据包的目标是本机):
- 如果数据包的目标地址是本地系统(例如,访问本地服务),则数据包会进入
INPUT
链。在这一链中,你可以对发往本地的流量进行进一步的过滤。
- 如果数据包的目标地址是本地系统(例如,访问本地服务),则数据包会进入
-
FORWARD 链(如果数据包是转发的):
- 如果数据包的目标不是本地系统,而是要被转发到其他网络,数据包会进入
FORWARD
链。
- 如果数据包的目标不是本地系统,而是要被转发到其他网络,数据包会进入
-
OUTPUT 链(对于本地生成的数据包):
- 如果数据包是由本地系统生成并要发送到外部,则会经过
OUTPUT
链。
- 如果数据包是由本地系统生成并要发送到外部,则会经过
-
POSTROUTING 链:
- 在路由决策之后,数据包会进入
POSTROUTING
链,这里可以进行源地址转换(SNAT)等操作,适用于要发送出站的数据包。
- 在路由决策之后,数据包会进入
总结
- 数据包处理的顺序是:首先接收数据包 → 进入
PREROUTING
链 → 路由决策 → 进入INPUT
或FORWARD
链(如适用)→ 进入POSTROUTING
链(如适用)。 - 因此,
PREROUTING
链是在路由决策之前处理入站数据包的,而路由决策是在PREROUTING
链之后进行的。
这种设计允许 iptables
在包被路由之前进行处理,从而可以影响最终的路由决策。
数据进入iptables 的流转逻辑
5个链介绍:
PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING。
PREROUTING:数据包进入路由表之前
INPUT:通过路由表后目的地为本机
FORWARD:通过路由表后,目的地不为本机
OUTPUT:由本机产生,向外转发
POSTROUTIONG:发送到网卡接口之前。如下图:
netfilter/iptables
(也就是常说的iptables)组成Linux平台下的包过滤防火墙,具有完成封包过滤、封包重定向和网络地址转换(NAT)等功能。
netfilter是Linux 核心中一个通用架构,它提供了一系列的"表"(tables),每个表由若干"链"(chains)组成,而每条链中可以有一条或数条规则(rule)组成。可以这样来理解,netfilter是表的容器,表是链的容器,而链又是规则的容器。
链(chains)是数据包传播的路径,每一条链其实就是众多规则中的一个检查清单,每一条链中可以有一条或数条规则。当一个数据包到达一个链时,iptables就会从链中第一条规则开始检查,看该数据包是否满足规则所定义的条件。如果满足,系统就会根据该条规则所定义的方法处理该数据包;否则iptables将继续检查下一条规则,如果该数据包不符合链中任一条规则,iptables就会根据该链预先定义的默认策略来处理数据包。
规则(rules)其实就是网络管理员预定义的条件,规则一般的定义为“如果数据包头符合这样的条件,就这样处理这个数据包”。规则存储在内核空间的信息包过滤表中,这些规则分别指定了源地址、目的地址、传输协议(如TCP、UDP、ICMP)和服务类型(如HTTP、FTP和SMTP)等。当数据包与规则匹配时,iptables就根据规则所定义的方法来处理这些数据包,如放行(accept)、拒绝(reject)和丢弃(drop)等。
配置防火墙的主要工作就是添加、修改和删除这些规则。
系统缺省的表为"filter",该表中包含了INPUT、FORWARD和OUTPUT 3个链。每一条链中可以有一条或数条规则,每一条规则都是这样定义的“如果数据包头符合这样的条件,就这样处理这个数据包”。当一个数据包到达一个链时,系统就会从第一条规则开始检查,看是否符合该规则所定义的条件: 如果满足,系统将根据该条规则所定义的方法处理该数据包;如果不满足则继续检查下一条规则。最后,如果该数据包不符合该链中任一条规则的话,系统就会根据该链预先定义的策略(policy)来处理该数据包。
有数据包进入系统时,系统首先根据路由表决定将数据包发给哪一条链,则可能有三种情况:
1.如果数据包的目的地址是本机,则系统将数据包送往INPUT链,如果通过规则检查,则该包被发给相应的本地进程处理;如果没通过规则检查,系统就会将这个包丢掉;
2.如果数据包的目的地址不是本机,也就是说,这个包将被转发,则系统将数据包送往FORWARD链,如果通过规则检查,则该包被发给相应的本地进程处理;如果没通过规则检查,系统就会将这个包丢掉;
3.如果数据包是由本地系统进程产生的,则系统将其送往OUTPUT链,如果通过规则检查,则该包被发给相应的本地进程处理;如果没通过规则检查,系统就会将这个包丢掉。
iptables在处理数据包时,将按照以上流程执行。数据包进入网卡时,它首先进入PREROUTING链,内核根据数据包目的IP判断是否需要转送出去。如果数据包就是进入本机的,它就会沿着图向下移动,到达INPUT链。数据包到了INPUT链后,任何进程都会收到它。本机上运行的程序可以发送数据包,这些数据包会经过OUTPUT链,然后到达POSTROUTING链输出。如果数据包是要转发出去的,且内核允许转发,数据包就会如图所示向右移动,经过FORWARD链,然后到达POSTROUTING链输出。
iptables规则表
1.filter表——三个链:INPUT、FORWARD、OUTPUT。
作用:过滤数据包
内核模块:iptables_filter
2.Nat表——三个链:PREROUTING、POSTROUTING、OUTPUT
作用:用于网络地址转换(IP、端口)
内核模块:iptable_nat
3.Mangle表——五个链:PREROUTING、POSTROUTING、INPUT、OUTPUT、FORWARD
作用:修改数据包的服务类型、TTL、并且可以配置路由实现QOS
内核模块:iptable_mangle
4.Raw表——两个链:OUTPUT、PREROUTING
作用:决定数据包是否被状态跟踪机制处理
内核模块:iptable_raw
规则链
1.INPUT——进来的数据包应用此规则链中的策略;
2.OUTPUT——外出的数据包应用此规则链中的策略;
3.FORWARD——转发数据包时应用此规则链中的策略;
4.PREROUTING——对数据包作路由选择前应用此链中的规则;
5.POSTROUTING——对数据包作路由选择后应用此链中的规则
相关管理操作
iptables -t filter -L cali-INPUT -v -n
把表 filter中的链cali-INPUT链中的所有规则显示出来。
iptables -t nat -S: 显示所有表nat中的所有链的所有规则。
一个规则说明
-A KUBE-EXTERNAL-SERVICES -p tcp -m comment --comment "jtkjdev/ingress-nginx-controller:http has no local endpoints" -m addrtype --dst-type LOCAL -m tcp --dport 30080 -j DROP
提供的 iptables
规则用于将特定类型的流量丢弃(DROP
),具体来说是针对端口 30080 的 TCP 流量,并且这条规则附带了一个注释,解释了其目的。让我们详细解析这条规则:
解析规则
-A KUBE-EXTERNAL-SERVICES -p tcp -m comment --comment "jtkjdev/ingress-nginx-controller:http has no local endpoints" -m addrtype --dst-type LOCAL -m tcp --dport 30080 -j DROP
-A KUBE-EXTERNAL-SERVICES
:在KUBE-EXTERNAL-SERVICES
链的末尾添加(-A
表示 append)这条规则。-p tcp
:这条规则只适用于 TCP 协议的数据包。-m comment --comment "..."
:为规则添加一个描述性的注释,这里说明了该规则的原因是“jtkjdev/ingress-nginx-controller:http 没有本地端点”。-m addrtype --dst-type LOCAL
:匹配目的地地址类型为本地(LOCAL
)的数据包。这意味着目标 IP 地址是主机自身的地址之一。-m tcp --dport 30080
:进一步限制到仅当目标端口(destination port)为 30080 时才匹配此规则。-j DROP
:如果所有条件都匹配,则执行的动作是丢弃(DROP
)数据包,即不响应也不转发。
规则的作用
这条规则的主要目的是阻止任何试图连接到本机 30080 端口的 TCP 流量。根据注释信息,这可能是因为与 jtkjdev/ingress-nginx-controller
相关的服务没有可用的本地端点来处理这些请求。因此,为了避免不必要的尝试和潜在的安全风险,直接将这些流量丢弃。
确认链所属表
要确认 KUBE-EXTERNAL-SERVICES
链属于哪个表,可以使用以下命令来列出各个表中的链,并寻找 KUBE-EXTERNAL-SERVICES
:
# 查看 filter 表中的链
sudo iptables -t filter -L -v -n
# 查看 nat 表中的链
sudo iptables -t nat -L -v -n
# 查看 mangle 表中的链
sudo iptables -t mangle -L -v -n
# 查看 raw 表中的链
sudo iptables -t raw -L -v -n
# 查看 security 表中的链
sudo iptables -t security -L -v -n
通常情况下,KUBE-EXTERNAL-SERVICES
链会出现在 filter
表中,因为它是 Kubernetes 用来管理外部服务访问的一部分。
注意事项
-
影响范围:确保理解这条规则的影响范围。它会阻止所有到达本机 30080 端口的 TCP 流量,包括合法的管理流量或监控流量。如果你确实需要保留某些类型的流量,考虑添加更具体的规则来允许它们通过。
-
测试和验证:在生产环境中应用此类规则之前,请务必先在一个受控环境中进行充分测试,以确保不会意外阻断必要的通信。
-
日志记录:有时为了调试目的,可以在实际丢弃数据包之前添加一条日志记录规则,以便跟踪哪些流量被阻止了。
-
自动化管理:在 Kubernetes 环境中,
iptables
规则通常是通过 kube-proxy 或其他网络插件自动管理的。手动修改这些规则可能会导致配置冲突或不稳定的行为。建议尽量依赖 Kubernetes 的内置机制来管理和调整网络策略。
相关指令
查看系统中iptables中 现在有多少表
cat /proc/net/ip_tables_names 查看系统中iptables中 现在有多少表
查看iptables 转发端口
iptables -t nat -S | grep 8848
k8s中的service的nodeport查看
比如定义了一个service: nodePort: 8888 ,但是通过在宿主机上 通过netstat -lntp并不能查到到香相关的tcp侦听端口,因为这种方式并不同直接启动一个socket侦听端口,而是通过iptables或者ipvs方式来进行转发的。可以通过以下指令查看:
iptables -t nat -S | grep 8888
iptables -t nat -L KUBE-NODEPORTS -n
在 Kubernetes 中,NodePort 类型的 Service 会在集群的每个节点上开放一个端口(默认范围 30000-32767
),用于将外部流量转发到 Service 对应的 Pod。然而,通过 netstat -lntp
可能看不到该端口的监听,原因如下:
1. kube-proxy 的工作模式
NodePort 的流量转发由 kube-proxy
组件实现,具体行为取决于其工作模式:
工作模式 | 监听端口是否可见? | 原因 |
---|---|---|
iptables | ❌ 不可见 | 流量通过 iptables 规则直接转发,不会在节点上创建 TCP 监听端口。 |
ipvs | ❌ 不可见 | 流量由内核的 IPVS 负载均衡器处理,同样不会创建 TCP 监听端口。 |
userspace | ✅ 可见 | (已废弃)旧模式,kube-proxy 会主动监听端口,但现代集群几乎不再使用此模式。 |