[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-nft
和iptables-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)
默认策略是当数据包不匹配任何规则时的处理方式,仅支持ACCEPT
或DROP
:
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-save
与iptables-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_SAVE
和IPTABLES_V6_SAVE
设为no
。
总结
iptables 作为 Linux 系统中强大的防火墙工具,通过灵活的规则配置可实现精准的网络访问控制。本文从 Ubuntu 系统的基础配置入手,详细讲解了 iptables 的命令语法、规则操作、匹配条件及持久化方法,覆盖了初学者需掌握的核心知识点。
对于新手来说,建议从简单规则开始练习(如禁止 ping、开放常用端口),逐步理解 “表 - 链 - 规则” 的逻辑,再尝试结合状态匹配等高级功能。记住:规则的顺序很重要(匹配即停止),且一定要做好持久化,避免重启后规则丢失。