06-IPTABLES.FIREWALLD防火墙

本文介绍iptables防火墙的基础概念及其实战配置方法。包括iptables的基本语法、常用的命令操作及如何设置规则来控制不同类型的网络流量。通过具体示例展示了如何限制特定IP地址或网段的访问、禁止某些类型的数据包等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

防火墙 iptables

1.防火墙的作用:

防火墙是一个组件,工作在网络边缘(主机边缘),对进出网络数据包基于一定的规则检查,并在匹配某规则时由规则定义的处理进行处理的一组功能的组件。

2.防火墙类型

根据工作的层次的不同来划分,常见的防火墙工作在OSI第三层,即网络层防火墙,工作在OSI第七层的称为应用层防火墙,或者代理服务器(代理网关)。
网络层防火墙又称包过滤防火墙,在网络层对数据包进行选择,选择的依据是系统内设置的过滤逻辑,通过检查数据流中每个数据的源地址,目的地址,所用端口号和协议状态等因素来确定是否允许该数据包的通过,以及数据包的流向等。
还可以分为硬件防火墙和软件防火墙

3.软件防火墙

EL6上的防火墙叫做iptables。
EL7上的防火墙叫做firewalld。

4.语法

iptables -t table CMD chain rule-matcher -j target
表 动作 链 规则匹配 执行操作

表table

filter 表:用于过滤数据包
nat 表:用于修改数据包的来源和目的地
mangle 表:用户修改数据包的生存周期等等
raw 表:跟踪机制

使用 -t 来指定表,如果省略,则代表对 filter 表进行操作

CMD动作

A 追加
I 插入
D 删除
L 罗列
F 清空

表当中包含链chain

链是用来区分数据包的流向状态

INPUT 入站的数据包
OUTPUT 出站的数据包
PREROUTING 路由判断之前的数据包
POSTROUTING 路由判断之后的数据包
FORWARD 第一次路由判断之后,到最后一词路由判断之前

规则rule

是用来判断数据包的具体情况
-p 协议
-s 来源
-d 目的地
--sport 来源端口
--dport 目的端口
-i 入站网络接口
-o 出站网络接口
! 取反

执行操作target

ACCEPT 接受
DROP 丢弃
REJECT 拒绝
DNAT 目标地址转换
SNAT 源地址转换

应用示例
0.查看规则 iptables -L
1.规则清空 iptables -F
2.预选策略 iptables -P INPUT ACCEPT
3.保存策略 service iptables save
iptables-save > /etc/sysconfig/iptables
4.开机后重新导入 iptables-restore < /etc/sysconfig/iptables

rhel6 172.25.0.11
1.只允许172.25.0.250和你自己的服务器能够访问ftp服务(rhel6)

来源 -s 172.25.0.250
-s 172.25.0.11
进来的 INPUT

目标
端口号 –dport 21
协议 -p tcp

允许 ACCEPT

iptables -A INPUT -s 172.25.0.250 -p tcp –dport 21 -j ACCEPT
iptables -A INPUT -s 172.25.0.11 -p tcp –dport 21 -j ACCEPT
iptables -A INPUT -p tcp –dport 21 -j DROP

除了他们其他不允许

2.禁止ping包
进来 INPUT
协议 icmp

扔掉
iptables -A INPUT -p icmp -j DROP

=========================================
3.仅允许172.25.0.0/24网段和172.25.15.0/24网段用户能够访问我的邮件服务器
进来 INPUT
来源 -s 172.25.0.0/24
-s 172.25.15.0/24

协议 -p tcp
端口 –dport 25

允许 -j ACCEPT

其他人都不允许

iptables -A INPUT -s 172.25.0.0/24 -p tcp –dport 25 -j ACCEPT
iptables -A INPUT -s 172.25.15.0/24 -p tcp –dport 25 -j ACCEPT
iptables -A INPUT -p tcp –dport 25 -j DROP

==============================================================================

rhel6 172.25.x.11
练习题目
1.清空规则
2.预设filter表INPUT是ACCEPT
3.仅允许172.25.254.250和172.25.254.X 能够ssh到我的服务器(rhel6 172.25.X.11)上
进来 INPUT
来源 -s 172.25.254.250
-s 172.25.254.16
协议 -p tcp
端口号 –dport 22
允许 -j ACCEPT

iptables -A INPUT -s 172.25.254.250 -p tcp –dport 22 -j ACCEPT
iptables -A INPUT -s 172.25.254.16 -p tcp –dport 22 -j ACCEPT
iptables -A INPUT -p tcp –dport 22 -j DROP

4.仅允许172.25.254.0/24和172.25.X.0/24能够ping我的服务器
INPUT
-s 172.25.254.0/24
-s 172.25.X.0/24
-p icmp
-j ACCEPT

iptables -A INPUT -s 172.25.254.0/24 -p icmp -j ACCEPT
iptables -A INPUT -s 172.25.16.0/24 -p icmp -j ACCEPT
iptables -A INPUT -p icpm -j DROP

5.不允许172.25.254.254访问我的邮件服务器
INPUT
-s 172.25.254.254
-p tcp
–dport 25
-j DROP

iptables -A INPUT -s 172.25.254.254 -p tcp –dport 25 -j DROP

6.保存规则
rhel6 servcie iptables save
iptables-save > /etc/sysconfig/iptables

7.查看规则
iptables -L

8.关机重启
iptables-restore < /etc/sysconfig/iptables

<think>根据错误信息,问题在于尝试安装32位(i686)的libcgroup包,但系统缺少32位的glibc依赖。在64位系统上,我们只需要64位(x86_64)的包。因此,我们需要确保下载和安装的是64位版本的libcgroup包。 解决方案: 1. 在下载依赖的步骤中,明确指定下载64位的包。 2. 在安装依赖时,只安装64位的包。 修改点: - 在下载系统依赖的函数中,确保只下载x86_64架构的包。 - 在安装步骤中,只安装x86_64的rpm包。 具体修改如下: 1. 在下载依赖的函数中,使用`--arch x86_64`选项来确保只下载64位的包。 2. 在安装依赖时,通过通配符过滤只安装64位的rpm包(即文件名包含x86_64的包)。 以下是修改后的部署脚本:</think>根据错误信息,问题在于尝试安装 32 位 (i686) 的 libcgroup 包,而系统需要的是 64 位 (x86_64) 版本。以下是完全修复的部署脚本,确保只安装 64 位依赖包: ```bash #!/bin/bash # Kubernetes 离线部署脚本 (CentOS 8 x86_64 优化版) # 版本: 6.0 # 作者: 运维专家 # 描述: 修复 libcgroup 架构依赖问题 set -euo pipefail # 配置参数 CACHE_DIR="/opt/offline_packages" K8S_VERSION="1.28.5" POD_CIDR="10.244.0.0/16" CONTROL_PLANE_ENDPOINT="$(hostname -f):6443" ADVERTISE_ADDRESS="$(hostname -I | awk '{print $1}')" IMAGE_REPO="registry.aliyuncs.com/google_containers" # 日志函数 log() { local level=$1 msg=$2 echo "[$(date '+%F %T')] [$level] $msg" } # 初始化环境 init_environment() { log "INFO" "===== [1/8] 初始化环境 =====" # 禁用 SELinux setenforce 0 sed -i 's/^SELINUX=enforcing/SELINUX=permissive/' /etc/selinux/config # 关闭防火墙 systemctl stop firewalld && systemctl disable firewalld # 关闭 swap swapoff -a sed -i '/swap/s/^\(.*\)$/#\1/g' /etc/fstab # 加载内核模块 local modules=("br_netfilter" "ip_vs" "ip_vs_rr" "ip_vs_wrr" "ip_vs_sh") for mod in "${modules[@]}"; do if ! lsmod | grep -q "^$mod"; then modprobe "$mod" log "INFO" "已加载内核模块: $mod" fi done # 配置内核参数 cat > /etc/sysctl.d/k8s.conf <<EOF net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 net.ipv4.ip_forward = 1 EOF sysctl --system } # 解决依赖冲突 resolve_dependency_conflicts() { log "INFO" "===== [2/8] 解决依赖冲突 =====" # 移除冲突软件包 local conflict_packages=("buildah" "runc" "podman") for pkg in "${conflict_packages[@]}"; do if rpm -q "$pkg" &>/dev/null; then dnf remove -y "$pkg" log "INFO" "已移除冲突包: $pkg" fi done # 清理冲突配置文件 rm -f /etc/containers/registries.conf.d/999-podman*.conf 2>/dev/null || true # 禁用冲突仓库 if dnf repolist | grep -q epel; then dnf config-manager --disable epel log "WARN" "已禁用 epel 仓库以避免冲突" fi } # 配置本地仓库 setup_local_repo() { log "INFO" "===== [3/8] 配置本地仓库 =====" # 创建本地仓库配置 cat > /etc/yum.repos.d/local-offline.repo <<EOF [local-baseos] name=CentOS-\$releasever - Base (Offline) baseurl=file://$CACHE_DIR/os_deps gpgcheck=0 enabled=1 priority=1 [local-k8s] name=Kubernetes Offline Binaries baseurl=file://$CACHE_DIR/k8s_binaries gpgcheck=0 enabled=1 priority=1 EOF # 刷新缓存 dnf clean all dnf makecache log "SUCCESS" "本地仓库配置完成" } # 安装系统依赖 (修复架构问题) install_os_deps() { log "INFO" "===== [4/8] 安装系统依赖 (修复架构问题) =====" # 确保只安装 x86_64 架构的包 log "INFO" "清理非 x86_64 架构的 RPM 包" find $CACHE_DIR/os_deps -name "*.i686.rpm" -exec rm -f {} \; # 安装基础依赖 (只安装 x86_64 架构) log "INFO" "安装基础依赖 (x86_64 架构)" dnf install -y --disablerepo='*' --enablerepo=local-baseos \ container-selinux \ socat \ conntrack \ ebtables \ ipset \ ipvsadm \ cri-tools \ libseccomp \ libnetfilter_conntrack \ libnfnetlink \ iptables # 安装 libcgroup 依赖 (只安装 x86_64 架构) log "INFO" "安装 libcgroup 依赖 (x86_64)" for pkg in $(find $CACHE_DIR/os_deps -name "libcgroup*" | grep x86_64); do rpm -ivh --force $pkg done # 安装 Docker 组件 (只安装 x86_64 架构) log "INFO" "安装 Docker 组件 (x86_64)" for pkg in $(find $CACHE_DIR/os_deps -name "docker-*" | grep x86_64); do rpm -ivh --force $pkg done # 安装 containerd.io (只安装 x86_64 架构) log "INFO" "安装 containerd.io (x86_64)" for pkg in $(find $CACHE_DIR/os_deps -name "containerd*" | grep x86_64); do rpm -ivh --force $pkg done # 安装兼容的 runc (64位) if [ -f "$CACHE_DIR/os_deps/runc" ]; then log "INFO" "安装 runc (64位)" install -m 755 $CACHE_DIR/os_deps/runc /usr/bin/ else log "WARN" "未找到 runc 二进制文件" fi # 配置并启动 Docker mkdir -p /etc/docker cat > /etc/docker/daemon.json <<EOF { "exec-opts": ["native.cgroupdriver=systemd"], "log-driver": "json-file", "log-opts": { "max-size": "100m" }, "storage-driver": "overlay2", "storage-opts": [ "overlay2.override_kernel_check=true" ] } EOF systemctl daemon-reload systemctl enable --now docker docker info } # 安装 Kubernetes 组件 install_k8s_components() { log "INFO" "===== [5/8] 安装 Kubernetes 组件 =====" # 安装 Kubernetes 二进制文件 install -m 755 $CACHE_DIR/k8s_binaries/kube* /usr/bin/ install -m 755 $CACHE_DIR/k8s_binaries/*controller* /usr/bin/ install -m 755 $CACHE_DIR/k8s_binaries/*scheduler* /usr/bin/ install -m 755 $CACHE_DIR/k8s_binaries/*proxy* /usr/bin/ # 配置 kubelet 服务 cp $CACHE_DIR/k8s_binaries/kubelet.service /etc/systemd/system/ # 创建 kubelet 配置目录 mkdir -p /var/lib/kubelet /etc/kubernetes/manifests # 配置 kubelet cgroup 驱动 cat > /etc/sysconfig/kubelet <<EOF KUBELET_EXTRA_ARGS="--cgroup-driver=systemd" EOF systemctl daemon-reload systemctl enable kubelet } # 加载容器镜像 load_container_images() { log "INFO" "===== [6/8] 加载容器镜像 =====" # 检查 Docker 是否运行 if ! systemctl is-active --quiet docker; then log "ERROR" "Docker 服务未运行" systemctl start docker fi # 加载镜像 local image_count=0 for img in $CACHE_DIR/images/*.tar; do docker load -i "$img" ((image_count++)) done log "SUCCESS" "已加载 $image_count 个容器镜像" } # 初始化集群 init_cluster() { log "INFO" "===== [7/8] 初始化 Kubernetes 集群 =====" # 创建 kubeadm 配置文件 cat > kubeadm-config.yaml <<EOF apiVersion: kubeadm.k8s.io/v1beta3 kind: ClusterConfiguration kubernetesVersion: v$K8S_VERSION networking: podSubnet: $POD_CIDR imageRepository: "$IMAGE_REPO" controlPlaneEndpoint: "$CONTROL_PLANE_ENDPOINT" apiServer: extraArgs: advertise-address: $ADVERTISE_ADDRESS controllerManager: extraArgs: bind-address: 0.0.0.0 scheduler: extraArgs: bind-address: 0.0.0.0 --- apiVersion: kubelet.config.k8s.io/v1beta1 kind: KubeletConfiguration cgroupDriver: systemd EOF # 初始化集群 kubeadm init --config=kubeadm-config.yaml --upload-certs # 配置 kubectl mkdir -p $HOME/.kube cp -i /etc/kubernetes/admin.conf $HOME/.kube/config chown $(id -u):$(id -g) $HOME/.kube/config # 配置 bash 自动补全 echo 'source <(kubectl completion bash)' >> $HOME/.bashrc echo 'alias k=kubectl' >> $HOME/.bashrc echo 'complete -F __start_kubectl k' >> $HOME/.bashrc } # 安装网络插件 install_network_plugin() { log "INFO" "===== [8/8] 安装网络插件 =====" # 使用 Calico 网络插件 kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml # 等待网络插件就绪 log "INFO" "等待网络插件初始化..." kubectl wait --namespace kube-system \ --for=condition=ready pod \ --selector=k8s-app=calico-node \ --timeout=300s } # 验证安装 verify_installation() { log "INFO" "===== 验证安装 =====" # 检查节点状态 echo -e "\n\033[34m[节点状态]\033[0m" kubectl get nodes -o wide # 检查 Pod 状态 echo -e "\n\033[34m[Pod 状态]\033[0m" kubectl get pods -A -o wide # 检查 Docker 状态 echo -e "\n\033[34m[Docker 状态]\033[0m" docker info | grep -E 'Server Version|Containers|Running|Paused|Images' # 检查 runc 版本 echo -e "\n\033[34m[runc 版本]\033[0m" runc --version # 检查 libcgroup 安装 echo -e "\n\033[34m[libcgroup 安装]\033[0m" rpm -qa | grep libcgroup # 获取加入命令 local join_command=$(kubeadm token create --print-join-command 2>/dev/null) echo -e "\n\033[32m[加入集群命令]\033[0m" echo "$join_command" # 保存加入命令到文件 echo "$join_command" > $HOME/k8s_join_command.txt chmod 600 $HOME/k8s_join_command.txt } # 主函数 main() { [[ $EUID -ne 0 ]] && { echo "请使用 root 权限执行"; exit 1; } # 检查离线包目录 if [ ! -d "$CACHE_DIR" ]; then log "ERROR" "离线包目录不存在: $CACHE_DIR" exit 1 fi # 执行安装步骤 init_environment resolve_dependency_conflicts setup_local_repo install_os_deps install_k8s_components load_container_images init_cluster install_network_plugin verify_installation # 完成信息 echo -e "\n\033[32m[Kubernetes 集群部署成功]\033[0m" echo "控制平面节点: $(hostname)" echo "Kubernetes 版本: v$K8S_VERSION" echo "Pod 网络 CIDR: $POD_CIDR" echo "加入集群命令已保存到: $HOME/k8s_join_command.txt" } main "$@" ``` ### 关键修复说明 #### 1. 清理非 x86_64 架构的 RPM 包 ```bash log "INFO" "清理非 x86_64 架构的 RPM 包" find $CACHE_DIR/os_deps -name "*.i686.rpm" -exec rm -f {} \; ``` 在安装前删除所有 32 位 (i686) 的 RPM 包,避免架构冲突 #### 2. 只安装 x86_64 架构的依赖包 ```bash # 安装基础依赖 (只安装 x86_64 架构) dnf install -y --disablerepo='*' --enablerepo=local-baseos \ container-selinux \ socat \ ... # 只列出 x86_64 包 # 安装 libcgroup 依赖 (只安装 x86_64 架构) for pkg in $(find $CACHE_DIR/os_deps -name "libcgroup*" | grep x86_64); do rpm -ivh --force $pkg done ``` 确保只安装 64 位架构的软件包 #### 3. 按组件分类安装 ```bash # 安装 Docker 组件 (只安装 x86_64 架构) for pkg in $(find $CACHE_DIR/os_deps -name "docker-*" | grep x86_64); do rpm -ivh --force $pkg done # 安装 containerd.io (只安装 x86_64 架构) for pkg in $(find $CACHE_DIR/os_deps -name "containerd*" | grep x86_64); do rpm -ivh --force $pkg done ``` 分别安装 Docker 和 containerd 组件,避免依赖冲突 #### 4. 增强验证步骤 ```bash # 验证安装 verify_installation() { ... # 检查 libcgroup 安装 echo -e "\n\033[34m[libcgroup 安装]\033[0m" rpm -qa | grep libcgroup ... } ``` 添加专门的 libcgroup 安装验证步骤 ### 使用说明 #### 1. 准备离线包 确保离线包目录包含以下结构的文件: ``` /opt/offline_packages/ ├── os_deps/ │ ├── containerd.io-*.x86_64.rpm │ ├── docker-ce-*.x86_64.rpm │ ├── libcgroup-*.x86_64.rpm │ └── runc (64位二进制) ├── k8s_binaries/ │ ├── kubeadm │ ├── kubelet │ └── ... └── images/ ├── registry.aliyuncs.com_google_containers_kube-apiserver_v1.28.5.tar └── ... ``` #### 2. 执行部署脚本 ```bash chmod +x install_k8s_fixed.sh ./install_k8s_fixed.sh ``` #### 3. 验证安装 脚本完成后会自动验证: - Kubernetes 节点状态 - Pod 状态 - Docker 状态 - libcgroup 安装情况 - 工作节点加入命令 ### 常见问题解决方案 #### 问题 1: libcgroup 安装失败 **解决方案**: ```bash # 手动清理 32 位包 rm -f /opt/offline_packages/os_deps/*.i686.rpm # 手动安装 64 位 libcgroup rpm -ivh --force /opt/offline_packages/os_deps/libcgroup-*.x86_64.rpm ``` #### 问题 2: containerd 启动失败 **解决方案**: ```bash # 生成默认配置 mkdir -p /etc/containerd containerd config default > /etc/containerd/config.toml # 重启服务 systemctl daemon-reload systemctl restart containerd docker ``` #### 问题 3: kubelet 无法启动 (cgroup 驱动问题) **解决方案**: ```bash # 编辑 kubelet 配置 echo 'KUBELET_EXTRA_ARGS="--cgroup-driver=systemd"' > /etc/sysconfig/kubelet # 重启 kubelet systemctl daemon-reload systemctl restart kubelet ``` #### 问题 4: 网络插件 Pod 处于 Pending 状态 **解决方案**: ```bash # 检查节点污点设置 kubectl describe node | grep Taint # 移除 master 污点 (仅限单节点集群) kubectl taint nodes --all node-role.kubernetes.io/control-plane- ``` ### 架构验证脚本 在部署前运行此脚本验证系统架构: ```bash #!/bin/bash # 系统架构验证脚本 # 检查系统架构 ARCH=$(uname -m) if [ "$ARCH" != "x86_64" ]; then echo "错误: 不支持的架构 $ARCH,仅支持 x86_64 系统" exit 1 fi # 检查内核版本 KERNEL=$(uname -r) if [[ $KERNEL != *"el8"* ]]; then echo "警告: 检测到内核版本 $KERNEL,推荐使用 CentOS 8" fi # 检查已安装的 libcgroup 包 echo "已安装的 libcgroup 包:" rpm -qa | grep libcgroup | grep x86_64 || echo "未找到 x86_64 架构的 libcgroup 包" # 检查 Docker 架构 if command -v docker &> /dev/null; then echo "Docker 架构信息:" docker info --format '{{.Architecture}}' fi # 检查 containerd 架构 if command -v containerd &> /dev/null; then echo "containerd 架构信息:" containerd --version fi echo "系统架构验证完成" ``` 此修复版脚本确保只处理 64 位架构的软件包,彻底解决 libcgroup 的架构依赖问题,并提供详细的验证和故障排除方案。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值