【Linux】iptables使用详解(RT)

iptables 防火墙配置指南

目录

  • [1. 防火墙概述](#1. 防火墙概述 "#1-%E9%98%B2%E7%81%AB%E5%A2%99%E6%A6%82%E8%BF%B0")
  • [2. iptables 核心概念](#2. iptables 核心概念 "#2-iptables-%E6%A0%B8%E5%BF%83%E6%A6%82%E5%BF%B5")
  • [3. 环境准备](#3. 环境准备 "#3-%E7%8E%AF%E5%A2%83%E5%87%86%E5%A4%87")
  • [4. filter表规则配置](#4. filter表规则配置 "#4-filter%E8%A1%A8%E8%A7%84%E5%88%99%E9%85%8D%E7%BD%AE")
  • [5. nat表配置](#5. nat表配置 "#5-nat%E8%A1%A8%E9%85%8D%E7%BD%AE")
  • [6. 规则保存与恢复](#6. 规则保存与恢复 "#6-%E8%A7%84%E5%88%99%E4%BF%9D%E5%AD%98%E4%B8%8E%E6%81%A2%E5%A4%8D")
  • [7. 实战案例](#7. 实战案例 "#7-%E5%AE%9E%E6%88%98%E6%A1%88%E4%BE%8B")

1. 防火墙概述

1.1 防火墙种类

硬件防火墙
  • 适用场景:整个企业入口
  • 厂商
    • 三层路由:H3C、华为、Cisco(思科)
    • 深信服
    • Juniper
软件防火墙
  • 适用场景:开源软件、网站内部、封IP
  • 类型
    • iptables:写入Linux内核,服务于Docker
    • firewalld:CentOS 7 默认
云防火墙
  • 阿里云:安全组
  • 腾讯云:安全组
  • AWS:Security Groups

1.2 核心概念理解

概念层级 名称 比喻 说明
Netfilter 容器 一栋楼 Linux内核网络框架
表(tables) 存放链的容器 楼里的房子 不同功能分类
链(chains) 存放规则的容器 房子里的柜子 数据包处理流程
规则(Policy) 准许或拒绝规则 柜子里衣服的摆放规则 具体的过滤条件

2. iptables 核心概念

2.1 四表五链架构

四个表(Tables)

1. filter 表(默认表)

  • 功能:主机防火墙,过滤流入流出数据包
  • 应用场景:主机防火墙
链名称 功能说明
INPUT 过滤进入主机的数据包
FORWARD 转发流经主机的数据包(路由转发)
OUTPUT 处理从主机发出的数据包

2. nat 表

  • 功能:网络地址转换
  • 应用场景
    • 共享上网(POSTROUTING)
    • IP映射(PREROUTING)
    • 端口映射(PREROUTING)
链名称 功能说明 典型应用
PREROUTING 路由前处理,改变目标地址/端口 端口映射、IP映射
POSTROUTING 路由后处理,改变源地址/端口 共享上网(SNAT)
OUTPUT 改变本机发出数据包的目标地址 本机数据包NAT

3. raw 表

  • 功能:决定数据包是否被状态跟踪机制处理

4. mangle 表

  • 功能:修改数据包的服务类型、TTL等
五条链(Chains)
  • INPUT:入站数据包处理
  • OUTPUT:出站数据包处理
  • FORWARD:转发数据包处理
  • PREROUTING:路由前处理
  • POSTROUTING:路由后处理

3. 环境准备

3.1 停止firewalld服务

bash 复制代码
systemctl stop firewalld
systemctl disable firewalld

3.2 安装iptables服务

bash 复制代码
# 安装iptables服务
yum install -y iptables-services

# 验证安装
rpm -qa | grep iptable

3.3 加载相关内核模块

bash 复制代码
# 临时加载模块
modprobe ip_tables
modprobe iptable_filter
modprobe iptable_nat
modprobe ip_conntrack
modprobe ip_conntrack_ftp
modprobe ip_nat_ftp
modprobe ipt_state

# 写入配置文件永久生效
cat >> /etc/rc.local << EOF
modprobe ip_tables
modprobe iptable_filter
modprobe iptable_nat
modprobe ip_conntrack
modprobe ip_conntrack_ftp
modprobe ip_nat_ftp
modprobe ipt_state
EOF

chmod +x /etc/rc.d/rc.local

# 验证模块加载
lsmod | egrep 'filter|nat|ipt'

3.4 启动服务

bash 复制代码
# 启动并设置开机自启
systemctl enable iptables.service --now

# 检查服务状态
systemctl status iptables.service

# 查看默认规则
iptables -nL

3.5 常用参数详解

基础参数
参数 含义 示例
-L 显示表中的所有规则 iptables -L
-n 不反向解析IP和端口为名字 iptables -nL
-t 指定表,默认filter表 iptables -t nat -L
--line-numbers 显示规则行号 iptables -nL --line-numbers
操作参数
参数 含义 应用场景
-A append,追加规则到末尾 允许类规则
-I insert,插入规则到开头 拒绝类规则
-D delete,删除规则 iptables -D INPUT 1
-F flush,清空所有规则 重置配置
-P policy,设置链的默认策略 iptables -P INPUT DROP
匹配条件参数
参数 含义 示例
-p 指定协议(tcp/udp/icmp/all) -p tcp
--dport 目标端口 --dport 80
--sport 源端口 --sport 1024:65535
-s 源IP地址 -s 192.168.1.100
-d 目标IP地址 -d 10.0.0.1
-i 进入的网卡接口 -i eth0
-o 输出的网卡接口 -o eth1
-m 指定扩展模块 -m multiport
动作参数
参数 含义 区别
-j ACCEPT 接受数据包 允许通过
-j DROP 丢弃数据包 静默拒绝,不返回信息
-j REJECT 拒绝数据包 返回拒绝信息给发送方

4. filter表规则配置

4.1 基础端口控制

封禁特定端口
bash 复制代码
# 禁止SSH端口22
iptables -t filter -I INPUT -p tcp --dport 22 -j DROP

# 禁止HTTP端口80和HTTPS端口443
iptables -t filter -I INPUT -p tcp --dport 80 -j DROP
iptables -t filter -I INPUT -p tcp --dport 443 -j DROP
查看当前规则
bash 复制代码
# 查看所有规则(带行号)
iptables -nL --line-numbers

# 查看指定表规则
iptables -t filter -nL --line-numbers

4.2 删除规则

方法一:按行号删除
bash 复制代码
# 查看规则行号
iptables -nL --line-numbers

# 删除第1条规则
iptables -D INPUT 1
方法二:按规则内容删除
bash 复制代码
# 添加规则
iptables -I INPUT -p tcp --dport 80 -j DROP

# 删除相同的规则
iptables -D INPUT -p tcp --dport 80 -j DROP

4.3 IP地址控制

封禁单个IP
bash 复制代码
# 禁止特定IP访问
iptables -I INPUT -s 192.168.1.100 -j DROP
封禁网段
bash 复制代码
# 禁止整个网段访问特定端口
iptables -I INPUT -s 192.168.1.0/24 -p tcp --dport 80 -j DROP
白名单配置

方法一:使用排除符号!

bash 复制代码
# 只允许特定网段访问,其他全部拒绝
iptables -I INPUT ! -s 192.168.1.0/24 -j DROP

方法二:修改默认策略

bash 复制代码
# 设置允许规则
iptables -I INPUT -s 192.168.1.100 -j ACCEPT

# 修改默认策略为拒绝
iptables -P INPUT DROP

# 注意:操作完成后记得改回ACCEPT,避免锁定自己
iptables -P INPUT ACCEPT

4.4 多端口配置

连续端口范围
bash 复制代码
# 禁止端口范围10000-20000
iptables -I INPUT -p tcp --dport 10000:20000 -j DROP
不连续多端口(multiport模块)
bash 复制代码
# 禁止多个不连续端口
iptables -I INPUT -p tcp -m multiport --dport 80,443,8080 -j DROP

4.5 ICMP控制

了解ICMP类型
  • 类型0:回显应答(ping响应)
  • 类型8:回显请求(被ping)
控制ping功能
bash 复制代码
# 禁止别人ping自己(禁止类型8)
iptables -I INPUT -p icmp --icmp-type 8 -j DROP

# 检查效果
ping 目标IP  # 自己仍能ping别人
系统层面控制ping
bash 复制代码
# 查看当前设置
cat /proc/sys/net/ipv4/icmp_echo_ignore_all

# 永久禁止被ping
echo 'net.ipv4.icmp_echo_ignore_all=1' >> /etc/sysctl.conf
sysctl -p

4.6 连接状态匹配

bash 复制代码
# 允许已建立的连接
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

状态说明:

  • NEW:新连接
  • ESTABLISHED:已建立的连接
  • RELATED:相关连接
  • INVALID:无效连接

4.7 速率限制

bash 复制代码
# ICMP速率限制示例
iptables -F
iptables -I INPUT -p icmp -m limit --limit 10/minute --limit-burst 5 -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -P INPUT DROP

参数说明:

  • --limit 10/minute:每分钟允许10个数据包
  • --limit-burst 5:初始令牌桶大小为5

4.8 企业级防火墙配置模板

安全配置示例
bash 复制代码
#!/bin/bash
# 企业级iptables配置脚本

# 清空现有规则
iptables -F

# 允许SSH连接(修改为实际SSH端口)
iptables -I INPUT -p tcp --dport 22 -j ACCEPT

# 允许本地回环
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT

# 允许已建立的连接
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# 允许HTTP和HTTPS
iptables -A INPUT -p tcp -m multiport --dport 80,443 -j ACCEPT

# 允许内网网段
iptables -A INPUT -s 10.0.0.0/8 -j ACCEPT
iptables -A INPUT -s 172.16.0.0/12 -j ACCEPT
iptables -A INPUT -s 192.168.0.0/16 -j ACCEPT

# 设置默认策略
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT

5. nat表配置

5.1 共享上网配置(SNAT)

网络环境设置
bash 复制代码
# 在网关服务器上开启IP转发
echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.conf
sysctl -p
配置SNAT规则
bash 复制代码
# 固定公网IP的SNAT配置
iptables -t nat -I POSTROUTING -s 172.16.1.8 -j SNAT --to-source 192.168.121.7

# 动态IP的SNAT配置(如ADSL拨号)
iptables -t nat -A POSTROUTING -s 172.16.1.0/24 -j MASQUERADE
客户端网络配置
bash 复制代码
# 设置网关和DNS
nmcli connection modify ens36 ipv4.gateway 172.16.1.7 ipv4.dns 114.114.114.114
nmcli connection reload
nmcli connection up ens36

# 测试网络连接
ping www.baidu.com

5.2 端口转发配置(DNAT)

端口映射示例
bash 复制代码
# 将公网IP的9000端口映射到内网服务器的22端口
iptables -t nat -I PREROUTING -d 192.168.121.7 -p tcp --dport 9000 -j DNAT --to-destination 172.16.1.8:22

# 查看NAT规则
iptables -t nat -nL --line-numbers
测试端口转发
bash 复制代码
# 从外部连接映射端口
ssh root@192.168.121.7 -p 9000
# 实际会连接到172.16.1.8的22端口

5.3 IP映射配置

一对一IP映射
bash 复制代码
# 将公网IP完全映射到内网服务器
iptables -t nat -A PREROUTING -d 10.0.0.62 -j DNAT --to-destination 172.16.1.7

# 查看配置
iptables -t nat -nL

6. 规则保存与恢复

6.1 保存规则

bash 复制代码
# 保存当前规则到文件
iptables-save > /etc/sysconfig/iptables

# 或者保存到自定义文件
iptables-save > /root/iptables-backup-$(date +%Y%m%d).rules

6.2 恢复规则

bash 复制代码
# 从文件恢复规则
iptables-restore < /etc/sysconfig/iptables

# 从备份文件恢复
iptables-restore < /root/iptables-backup-20250114.rules

6.3 自动化脚本

bash 复制代码
#!/bin/bash
# iptables规则管理脚本

BACKUP_DIR="/etc/iptables-backup"
DATE=$(date +%Y%m%d_%H%M%S)

case "$1" in
    save)
        mkdir -p $BACKUP_DIR
        iptables-save > $BACKUP_DIR/iptables-$DATE.rules
        echo "规则已保存到: $BACKUP_DIR/iptables-$DATE.rules"
        ;;
    restore)
        if [ -f "$2" ]; then
            iptables-restore < "$2"
            echo "规则已从 $2 恢复"
        else
            echo "文件不存在: $2"
        fi
        ;;
    *)
        echo "使用方法: $0 {save|restore <文件路径>}"
        ;;
esac

7. 实战案例

7.1 Web服务器防火墙配置

bash 复制代码
#!/bin/bash
# Web服务器安全配置

# 基础配置
iptables -F
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT

# 允许loopback
iptables -I INPUT -i lo -j ACCEPT

# 允许已建立连接
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# SSH访问(限制来源)
iptables -A INPUT -s 管理IP -p tcp --dport 22 -j ACCEPT

# Web服务
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT

# 防暴力破解(限制SSH连接频率)
iptables -A INPUT -p tcp --dport 22 -m recent --name SSH --update --seconds 60 --hitcount 4 -j DROP
iptables -A INPUT -p tcp --dport 22 -m recent --name SSH --set -j ACCEPT

# 保存配置
iptables-save > /etc/sysconfig/iptables

7.2 企业网关配置

bash 复制代码
#!/bin/bash
# 企业网关iptables配置

# 清空规则
iptables -F
iptables -t nat -F

# 开启转发
echo 1 > /proc/sys/net/ipv4/ip_forward

# NAT配置(共享上网)
iptables -t nat -A POSTROUTING -s 192.168.0.0/16 -j MASQUERADE

# 端口转发(内网服务发布)
iptables -t nat -A PREROUTING -d 公网IP -p tcp --dport 80 -j DNAT --to-destination 192.168.1.10:80
iptables -t nat -A PREROUTING -d 公网IP -p tcp --dport 443 -j DNAT --to-destination 192.168.1.10:443

# 安全策略
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -s 192.168.0.0/16 -j ACCEPT
iptables -P FORWARD DROP

# 保存配置
service iptables save

7.3 数据库服务器配置

bash 复制代码
#!/bin/bash
# 数据库服务器防火墙配置

iptables -F

# 默认策略
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT

# 基础连接
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# SSH管理
iptables -A INPUT -s 管理网段 -p tcp --dport 22 -j ACCEPT

# 数据库服务(只允许应用服务器访问)
iptables -A INPUT -s 应用服务器IP1 -p tcp --dport 3306 -j ACCEPT
iptables -A INPUT -s 应用服务器IP2 -p tcp --dport 3306 -j ACCEPT

# 监控服务
iptables -A INPUT -s 监控服务器IP -p tcp --dport 10050 -j ACCEPT

# 保存规则
iptables-save > /etc/sysconfig/iptables

8. 故障排查与最佳实践

8.1 常见问题

问题1:配置规则后无法连接

解决方案:

bash 复制代码
# 检查规则顺序
iptables -nL --line-numbers

# 检查默认策略
iptables -P INPUT ACCEPT  # 临时解决

# 添加详细日志
iptables -A INPUT -j LOG --log-prefix "IPTABLES-DROP: "
问题2:规则重启后丢失

解决方案:

bash 复制代码
# 确保服务开机启动
systemctl enable iptables

# 保存规则
iptables-save > /etc/sysconfig/iptables

8.2 最佳实践

  1. 规则顺序很重要:更具体的规则放在前面
  2. 先配置允许规则:再设置默认拒绝策略
  3. 测试前保留管理连接:避免锁定自己
  4. 及时保存规则:避免重启丢失
  5. 使用脚本管理:便于批量部署和维护
  6. 定期备份规则:便于快速恢复

8.3 性能优化建议

  • 将常用规则放在前面减少匹配时间
  • 避免过度复杂的规则匹配
  • 合理使用连接状态匹配
  • 定期清理无用规则

9. 相关命令速查

常用命令组合

bash 复制代码
# 查看规则
iptables -nL --line-numbers
iptables -t nat -nL

# 添加规则
iptables -I INPUT -s IP地址 -j DROP    # 封IP
iptables -A INPUT -p tcp --dport 端口 -j ACCEPT  # 开放端口

# 删除规则
iptables -D INPUT 行号
iptables -F  # 清空所有规则

# NAT配置
iptables -t nat -A POSTROUTING -s 内网网段 -j MASQUERADE  # 共享上网
iptables -t nat -A PREROUTING -d 公网IP -p tcp --dport 外部端口 -j DNAT --to-destination 内网IP:内部端口

# 规则管理
iptables-save > /etc/sysconfig/iptables  # 保存
iptables-restore < /etc/sysconfig/iptables  # 恢复

参考文档编写时间:2025年1月14日
原始文档来源: www.cnblogs.com/xuruizhao/p...

本文档基于实际生产环境经验编写,涵盖了iptables的核心功能和常见应用场景。建议在生产环境使用前,先在测试环境充分验证。

相关推荐
wdfk_prog2 小时前
[Linux]学习笔记系列 -- bits
linux·笔记·学习
Xの哲學2 小时前
Linux epoll 深度剖析: 从设计哲学到底层实现
linux·服务器·网络·算法·边缘计算
iYun在学C2 小时前
驱动程序(注册字符设备)
linux·嵌入式硬件
延延oO2 小时前
zyzyzyzyzy
linux
小白不想白a2 小时前
linux排障:服务端口被打满
linux·服务器·网络
CryptoPP2 小时前
对接API获取马来西亚历史数据
linux·运维·服务器·金融·区块链
Cyber4K3 小时前
【Kubernetes专项】K8s集群1.31版本安装手册
linux·docker·云原生·容器·kubernetes
陈让然3 小时前
WSL2 ubuntu18.04扩容
linux·运维·ubuntu