k8s 基础入门篇之开启 firewalld
前面在部署k8s时,都是直接关闭的防火墙。由于生产环境需要开启防火墙,只能放行一些特定的端口, 简单记录一下过程。
1. firewall 与 iptables 的关系
1.1 防火墙(Firewall)
定义:
防火墙是网络安全系统,用于监控和控制进出网络的流量,基于预定义的规则允许或阻止数据包。它是广义上的概念,不依赖具体工具。
功能:流量过滤(允许/拒绝), 网络地址转换(NAT),端口转发,防御攻击(如 DDoS)
1.2. iptables
定义:
iptables
是 Linux
内核中实现防火墙功能的具体工具,通过配置规则控制网络流量。它是 Linux 系统上防火墙的底层实现之一。
核心机制:
- 表(
Tables
):按功能分类规则集,如filter
(过滤)、nat
(地址转换)、mangle
(修改数据包头)等。 - 链(
Chains
):规则生效的节点,如INPUT
(入站流量)、OUTPUT
(出站流量)、FORWARD
(转发流量)。 - 规则(
Rules
):定义匹配条件和动作(如ACCEPT、DROP、REJECT
)。
1.3 两者的关系
实现与工具:
防火墙是抽象的安全概念,iptables
是实现这一概念的具体工具。
iptables
通过操作 Linux
内核的 netfilter
框架(内核模块)来执行防火墙功能。
- netfilter 是内核中的核心引擎,负责执行流量处理。
- iptables 是用户空间的命令行工具,用于配置
netfilter
规则。 - nftables:新一代 Linux 防火墙工具,取代
iptables
,提供更简洁的语法和更高性能。
2. 开启 firewalld 遇到的问题
没有在FORWARD
中放行端口。
利用iptables
或 内核版本更高的系统中使用ntf
在 INPUT
链中添加 需要放行的端口,
只放开了 INPUT
的端口,没有放开 FORWARD
,因为pod id
是走的ipv4转发, 导致pod ip
与 主机节点ip
不通,跨节点时,pod ip
与service
的 cluster ip
也不通。
下面是一个基本的放行脚本:FORWARD
放行所有端口
#!/bin/bash# 定义允许访问的节点IP及VIP(空格分隔)
service_ip_list=("172.10.9.2" ""172.10.9.3" ""172.10.9.4" )pod_cidr=10.42.0.0/16
service_cluster_cidr=10.43.0.0/16
# 对外端口
external_port_list="22, 80, 443, 30000-32767"# 节点之间互通端口
node_tcp_port_list="179, 2379, 2380, 6443, 10250, 10260"input_chain='filter_IN_public_allow'
forward_chain='filter_FWD_public_allow'# 添加新规则
function add_rules() {echo "[*] 添加新规则..."nft add rule inet firewalld $input_chain tcp dport { $external_port_list } acceptfor ip in "${service_ip_list[@]}"; doout=`ip addr | grep $ip`if [ -z "$out" ]; thennft add rule inet firewalld $input_chain ip saddr $ip tcp dport { $node_tcp_port_list } acceptnft add rule inet firewalld $forward_chain ip saddr $ip acceptfidonenft add rule inet firewalld $input_chain ip saddr $pod_cidr acceptnft add rule inet firewalld $input_chain ip saddr $service_cluster_cidr acceptnft add rule inet firewalld $forward_chain ip saddr $pod_cidr acceptnft add rule inet firewalld $forward_chain ip saddr $service_cluster_cidr acceptecho "[+] 规则添加完"
}