【iptables】介绍 路由 转发 nat ,nodeport

 介绍

  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 表:主要用于包过滤,包含 INPUTFORWARDOUTPUT
  • nat 表:用于网络地址转换,包含 PREROUTINGPOSTROUTINGOUTPUT
  • mangle 表:用于特殊的包修改,包含 PREROUTINGINPUTFORWARDOUTPUTPOSTROUTING
  • raw 表:用于配置连接跟踪,包含 PREROUTINGOUTPUT
  • security 表:用于安全性增强,包含 INPUTOUTPUTFORWARD

数据包处理顺序

  1. 接收数据包

    • 当数据包到达网络接口时,内核首先接收到这个数据包。
  2. PREROUTING 链

    • 在路由决策之前,数据包会进入 PREROUTING 链。这一链允许你在数据包被路由之前对其进行修改(例如,进行目的地址转换,或丢弃数据包)。
    • 在这一阶段,iptables 的规则可以影响后续的路由决策。比如,你可以使用 DNAT(目的地址转换)来改变数据包的目标地址。
  3. 路由决策

    • 数据包经过 PREROUTING 链后,内核会根据路由表(routing table)来决定数据包的去向。此时,内核会查找目的地址,并决定数据包应该被发送到哪个接口。
  4. INPUT 链如果数据包的目标是本机):

    • 如果数据包的目标地址是本地系统(例如,访问本地服务),则数据包会进入 INPUT 链。在这一链中,你可以对发往本地的流量进行进一步的过滤。
  5. FORWARD 链(如果数据包是转发的):

    • 如果数据包的目标不是本地系统,而是要被转发到其他网络,数据包会进入 FORWARD 链。
  6. OUTPUT 链(对于本地生成的数据包):

    • 如果数据包是由本地系统生成并要发送到外部,则会经过 OUTPUT 链。
  7. 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 用来管理外部服务访问的一部分。

注意事项

  1. 影响范围:确保理解这条规则的影响范围。它会阻止所有到达本机 30080 端口的 TCP 流量,包括合法的管理流量或监控流量。如果你确实需要保留某些类型的流量,考虑添加更具体的规则来允许它们通过。

  2. 测试和验证:在生产环境中应用此类规则之前,请务必先在一个受控环境中进行充分测试,以确保不会意外阻断必要的通信。

  3. 日志记录:有时为了调试目的,可以在实际丢弃数据包之前添加一条日志记录规则,以便跟踪哪些流量被阻止了。

  4. 自动化管理:在 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 会主动监听端口,但现代集群几乎不再使用此模式。
### 解决Node.js应用程序无法通过外部网络访问的问题 对于Node.js应用程序无法从外网访问的情况,可以从以下几个方面着手解决问题: #### 防火墙设置检查 确保服务器上的防火墙允许来自外部的连接到达Node.js应用监听的端口。如果使用的是Linux系统,默认情况下可能会有iptables或其他防火墙软件阻止未授权的入站流量。可以通过命令`sudo ufw status`查看Ubuntu系统的防火墙状态,在CentOS上可以使用`firewall-cmd --list-all`来获取当前配置详情[^1]。 为了开放特定端口(假设Node.js服务运行于3000端口),可以在Ubuntu执行如下操作: ```bash sudo ufw allow 3000/tcp ``` 而在CentOS环境下,则应采用以下指令: ```bash sudo firewall-cmd --zone=public --add-port=3000/tcp --permanent sudo systemctl restart firewalld.service ``` #### 端口转发配置调整 当Node.js程序部署在一个私有的内部网络环境中时,可能需要借助路由器或NAT设备来进行端口映射。这一步骤涉及到将公共互联网中的某个端口号指向内网机器的实际IP地址及其对应的本地服务端口。例如,若希望外界能够通过80端口访问位于LAN内的某台计算机所托管的应用实例,则需登录至宽带猫/无线路由管理界面完成相应设定[^2]。 另外一种方法是利用像Cpolar这样的第三方隧道解决方案快速建立安全稳定的内外网通信桥梁。按照官方文档指导安装并启动客户端之后,只需简单几条命令即可轻松创建一条通往目标主机指定进程的有效路径。 #### 绑定服务器公网IP 确认Node.js应用已经绑定了正确的接口地址而不是仅仅限于localhost(127.0.0.1)。通常来说,应该让其监听所有的可用网络适配器(`0.0.0.0`)以便接收到来自任何地方的数据包。修改代码片段如下所示: ```javascript const express = require('express'); const app = express(); // 设置app.listen()函数参数为0.0.0.0:port_number形式 app.listen(process.env.PORT || 3000, '0.0.0.0', () => { console.log(`Server running on port ${process.env.PORT || 3000}`); }); ``` 此外,还需保证该节点所在物理位置确实拥有合法有效的公有IPv4/v6资源可供分配给虚拟机或者容器环境下的子网成员共享使用。如果是云服务商提供的VPS产品一般默认即具备此特性;而对于家庭级ADSL线路而言则往往受限较多,建议联系ISP客服咨询具体情况后再做决定。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值