当前位置: 首页 > news >正文

[Linux入门] Ubuntu 系统中 iptables 的配置与使用

在 Linux 系统中,防火墙是保障网络安全的重要屏障,而 iptables 作为经典的防火墙工具,能够通过灵活的规则配置控制数据包的进出。对于初学者来说,掌握 iptables 的基本使用方法,不仅能提升系统安全性,还能加深对网络数据包流转的理解。

一、Ubuntu 系统中 iptables 的基础配置

默认情况下,Ubuntu 系统使用的是 nftables(nft)作为防火墙工具,若需使用 iptables,需先完成切换和基础配置。

1️⃣切换 iptables 版本(从 nft 到 legacy)

Ubuntu 中通过update-alternatives工具管理 iptables 的版本切换,步骤如下:

  • 查看当前 iptables 版本及优先级:

    bash

    update-alternatives --config iptables
    

    执行后会显示系统中可用的 iptables 版本(如iptables-nftiptables-legacy)及优先级,默认可能为iptables-nft

  • 设置iptables-legacy为高优先级:
    若需将iptables-legacy设为默认,可通过以下命令提高其优先级:

    bash

    update-alternatives --install /usr/bin/iptables iptables /usr/sbin/iptables-legacy 300
    

    数值300为优先级,需高于其他版本的优先级(如默认的iptables-nft优先级可能为 2)。

  • 手动指定默认版本:

    bash

    update-alternatives --set iptables /usr/sbin/iptables-legacy
    

2️⃣禁用冲突服务并安装工具

  • 禁用 ufw 和 nftables 服务(避免与 iptables 冲突):

    bash

    systemctl disable --now ufw  # 禁用UFW防火墙
    systemctl disable --now nftables  # 禁用nftables
    
  • 安装 iptables 持久化工具:
    为了让规则在系统重启后生效,需安装iptables-persistent

    bash

    apt install iptables-persistent
    
  • 启动并查看 iptables 服务状态:

    bash

    systemctl enable --now iptables  # 启动并设置开机自启
    systemctl status iptables  # 查看服务状态
    

    若状态显示 “active (exited)”,说明服务正常运行(iptables 以持久化配置方式工作,无常驻进程)。

二、iptables 命令核心语法与基础概念

iptables 通过 “表” 和 “链” 组织规则,核心命令格式如下:

bash

iptables [-t 表名] 管理选项 [链名] [匹配条件] [-j 控制类型]

1️⃣表与链:规则的 “容器”

  • 表(Table):iptables 通过不同的表区分规则的功能,默认使用filter表(负责数据包过滤),常用表还包括:

    • nat:用于网络地址转换(如端口映射);
    • mangle:用于修改数据包标记(如 TTL 值)。
  • 链(Chain):表中包含预定义的链,对应数据包的流转环节,filter表中常用链包括:

    • INPUT:处理进入本机的数据包;
    • OUTPUT:处理从本机发出的数据包;
    • FORWARD:处理经过本机转发的数据包(如路由器场景)。

2️⃣管理选项:规则的 “操作方式”

管理选项用于对规则执行添加、删除、查看等操作,常用选项如下:

选项功能描述
-A在链的末尾追加一条规则
-I在链中插入一条规则(默认插在第一条,可指定序号,如-I INPUT 2插在第二条)
-D删除链中的一条规则(可通过序号或规则内容指定)
-L列出链中的所有规则(如-L INPUT查看 INPUT 链)
-F清空链中的所有规则(如-F INPUT清空 INPUT 链,省略链名则清空整个表)
-P设置链的默认策略(如-P INPUT DROP表示 INPUT 链默认丢弃未匹配的数据包)
-n以数字形式显示地址和端口(避免 DNS 解析,加快命令执行)
-v显示规则的详细信息(如数据包计数、字节数)

3️⃣控制类型:数据包的 “处理结果”

控制类型决定匹配规则的数据包如何被处理,核心类型包括:

  • ACCEPT:允许数据包通过;
  • DROP:直接丢弃数据包,不返回任何响应(对攻击者更隐蔽);
  • REJECT:拒绝数据包通过,并返回响应信息(如 “端口不可达”);
  • LOG:在/var/log/messages中记录日志,然后将数据包交给下一条规则处理(不终止匹配流程)。

三、iptables 规则操作实战

掌握规则的添加、查看、删除等操作是使用 iptables 的基础,以下通过实例说明核心操作。

1️⃣添加规则:-A(追加)与-I(插入)

  • 追加规则(在链的末尾添加):
    允许所有 TCP 协议的入站数据包:

    bash

    iptables -A INPUT -p tcp -j ACCEPT  # -p tcp指定协议为TCP,-j ACCEPT表示允许
    
  • 插入规则(在指定位置添加,默认第一条):
    优先拒绝 ICMP 协议(禁止其他主机 ping 本机):

    bash

    iptables -I INPUT -p icmp -j REJECT  # 插入到INPUT链第一条
    iptables -I INPUT 2 -p udp -j ACCEPT  # 插入到INPUT链第二条,允许UDP协议
    

2️⃣查看规则:-L(列出)与辅助选项

  • 查看规则并显示序号(便于删除):

    bash

    iptables -L INPUT --line-numbers  # 查看INPUT链规则及序号
    
  • 以数字形式显示(快速查看,不解析主机名):

    bash

    iptables -n -L INPUT  # 数字形式显示INPUT链规则
    
  • 显示详细信息(包括数据包计数):

    bash

    iptables -v -n -L INPUT  # 详细显示INPUT链规则,含pkts(包数)、bytes(字节数)
    

3️⃣删除与清空规则:-D(删除)与-F(清空)

  • 删除指定规则(通过序号或内容):
    删除 INPUT 链的第二条规则:

    bash

    iptables -D INPUT 2
    
  • 清空规则(清空指定链或整个表):

    bash

    iptables -F INPUT  # 清空INPUT链
    iptables -F  # 清空默认filter表的所有链
    iptables -t nat -F  # 清空nat表的所有链
    

4️⃣默认策略:-P(Policy)

默认策略是当数据包不匹配任何规则时的处理方式,仅支持ACCEPTDROP

bash

iptables -P FORWARD DROP  # FORWARD链默认丢弃未匹配的转发数据包
iptables -P OUTPUT ACCEPT  # OUTPUT链默认允许未匹配的出站数据包

查看当前默认策略:

bash

iptables -S  # 显示所有链的默认策略及规则

四、规则的匹配条件:精准控制数据包

匹配条件是 iptables 规则的核心,决定规则对哪些数据包生效。根据依赖关系,分为三类:通用匹配、隐含匹配、显式匹配。

1️⃣通用匹配:独立生效,无需依赖

通用匹配不依赖特定协议或模块,可直接使用,常见类型:

  • 协议匹配(-p):指定数据包的协议(如 tcp、udp、icmp):

    bash

    iptables -A INPUT -p icmp -j DROP  # 丢弃所有ICMP协议数据包(禁止ping入)
    
  • 地址匹配(-s源地址、-d目标地址):指定 IP 或网段:

    bash

    iptables -A FORWARD -s 192.168.1.11 -j REJECT  # 拒绝源地址为192.168.1.11的转发包
    iptables -A INPUT -s 10.20.30.0/24 -j DROP  # 封锁10.20.30.0/24网段的入站包
    
  • 网络接口匹配(-i入站接口、-o出站接口):指定数据包经过的网卡:

    bash

    # 从外网接口ens33进入的私有地址数据包(如192.168.x.x)直接丢弃
    iptables -A INPUT -i ens33 -s 192.168.0.0/16 -j DROP
    

2️⃣隐含匹配:依赖特定协议

隐含匹配需以指定协议为前提(如 tcp、udp、icmp),无需手动加载模块,常见类型:

  • 端口匹配(--sport源端口、--dport目标端口):仅适用于 tcp/udp:

    bash

    # 允许转发DNS查询(UDP协议,目标端口53)
    iptables -A FORWARD -p udp --dport 53 -j ACCEPT
    # 开放FTP服务端口(20-21)及被动模式端口(24500-24600)
    iptables -A INPUT -p tcp --dport 20:21 -j ACCEPT
    iptables -A INPUT -p tcp --dport 24500:24600 -j ACCEPT
    
  • ICMP 类型匹配(--icmp-type):仅适用于 icmp 协议(如 ping 请求 / 响应):

    bash

    # 禁止其他主机ping本机(拒绝ICMP请求,类型8),但允许本机ping其他主机(接受响应,类型0)
    iptables -A INPUT -p icmp --icmp-type 8 -j DROP
    iptables -A INPUT -p icmp --icmp-type 0 -j ACCEPT
    

3️⃣显式匹配:需手动加载模块

显式匹配依赖额外内核模块,需通过-m 模块名指定,常见类型:

  • 多端口匹配(multiport模块):同时指定多个端口(逗号分隔):

    bash

    # 开放邮件服务相关端口(25、80、110、143)
    iptables -A INPUT -p tcp -m multiport --dport 25,80,110,143 -j ACCEPT
    
  • IP 范围匹配(iprange模块):指定连续 IP 范围(起始 - 结束):

    bash

    # 禁止转发源IP在192.168.4.21-192.168.4.28之间的TCP数据包
    iptables -A FORWARD -p tcp -m iprange --src-range 192.168.4.21-192.168.4.28 -j DROP
    
  • MAC 地址匹配(mac模块):通过 MAC 地址限制(仅适用于局域网):

    bash

    # 封锁MAC地址为00:0c:29:c0:55:3f的主机访问
    iptables -A INPUT -m mac --mac-source 00:0c:29:c0:55:3f -j DROP
    
  • 状态匹配(state模块):基于连接状态控制(常用状态:NEW/ESTABLISHED/RELATED):

    bash

    # 仅允许已建立的TCP连接(如本机请求后的应答包)
    iptables -A INPUT -p tcp -m state --state ESTABLISHED -j ACCEPT
    # 禁止伪造的TCP请求(非SYN包的新连接)
    iptables -A FORWARD -m state --state NEW -p tcp ! --syn -j DROP
    

五、iptables 策略持久化:避免规则丢失

默认情况下,iptables 规则仅保存在内存中,系统重启后会丢失。需通过工具将规则持久化到磁盘

1️⃣手动保存与恢复:iptables-saveiptables-restore

  • 保存规则:将当前规则导出到文件:

    bash

    # 保存filter表规则到/etc/iptables/rules.v4(IPv4)
    iptables-save -t filter > /etc/iptables/rules.v4
    # 保存IPv6规则
    ip6tables-save > /etc/iptables/rules.v6
    
  • 恢复规则:从文件加载规则:

    bash

    # 恢复IPv4规则
    iptables-restore /etc/iptables/rules.v4
    # 恢复时保留数据包计数器
    iptables-restore -c /etc/iptables/rules.v4
    

2️⃣自动持久化:iptables-persistent工具

iptables-persistent可自动在系统启动时加载规则,适合新手使用。

  • 安装工具:

    bash

    apt-get update
    apt-get install iptables-persistent
    

    安装时会提示保存当前 IPv4/IPv6 规则,按需选择即可。

  • 保存当前规则:

    bash

    netfilter-persistent save  # 保存规则到配置文件
    
  • 重新加载规则(手动修改规则文件后):

    bash

    netfilter-persistent reload
    

  • 禁用自动加载(如需临时关闭):
    编辑/etc/default/iptables-persistent,将IPTABLES_V4_SAVEIPTABLES_V6_SAVE设为no

总结

iptables 作为 Linux 系统中强大的防火墙工具,通过灵活的规则配置可实现精准的网络访问控制。本文从 Ubuntu 系统的基础配置入手,详细讲解了 iptables 的命令语法、规则操作、匹配条件及持久化方法,覆盖了初学者需掌握的核心知识点。

对于新手来说,建议从简单规则开始练习(如禁止 ping、开放常用端口),逐步理解 “表 - 链 - 规则” 的逻辑,再尝试结合状态匹配等高级功能。记住:规则的顺序很重要(匹配即停止),且一定要做好持久化,避免重启后规则丢失。

http://www.lryc.cn/news/608481.html

相关文章:

  • 公共卫生场景下漏检率↓76%:陌讯动态特征融合算法在口罩识别中的实战解析
  • GaussDB having 的用法
  • 适 配 器 模 式
  • 电力系统分析笔记:发电机与变压器的数学建模与运行状态详解
  • SPI通信中CS片选的两种实现方案:硬件片选与软件片选
  • Anthropic:跨越生产效能拐点的AI增长飞轮
  • Munge 安全认证和授权服务的工作原理,以及与 Slurm 的配合
  • 交互 Codeforces Round 1040 Interactive RBS
  • 深入 Go 底层原理(十一):Go 的反射(Reflection)机制
  • 基于深度学习的医学图像分析:使用GAN实现医学图像增强
  • SpringBoot 启动富文本文字更改
  • 基于 LightGBM 的二手车价格预测
  • 一种基于入侵杂草优化算法(IWO)的聚类算法,并与K-Means、高斯混合模型(GMM)进行对比,Matlab
  • 用键盘快速移动Word和WPS文字中的选中段落
  • 【笔试真题】2024秋招京东后端开发岗位-第一批笔试
  • 数据链路层、NAT、代理服务、内网穿透
  • 使用 MySQL Shell 进行 MySQL 单机到 InnoDB Cluster 的数据迁移实践
  • 数字化生产管理系统设计
  • 从零开始构建AI Agent评估体系:12种LangSmith评估方法详解
  • cuda编程笔记(12)--学习cuFFT的简单使用
  • Java单元测试和设计模式
  • 【LeetCode 热题 100】739. 每日温度——(解法一)单调栈+从右到左
  • 【语音技术】什么是动态实体
  • 【Django】-6- 登录用户身份鉴权
  • Mybatis学习之获取参数值(四)
  • 第14届蓝桥杯Python青少组中/高级组选拔赛(STEMA)2023年1月15日真题
  • STM32学习记录--Day6
  • 如何解决pip安装报错ModuleNotFoundError: No module named ‘seaborn’问题
  • Baumer工业相机堡盟工业相机如何通过YoloV8深度学习模型实现道路车辆事故的检测识别(C#代码UI界面版)
  • SpringBoot 服务器配置