首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >运维必修课:Linux防火墙指南|IPTables 入门

运维必修课:Linux防火墙指南|IPTables 入门

作者头像
一根头发丝的宽度
发布2026-05-06 18:36:57
发布2026-05-06 18:36:57
1530
举报
🤔什么是 IPTables?

防火墙的工作原理非常简单。 它在可信网络和不可信网络之间建立了一道屏障,使你的系统免受恶意数据包的攻击。

但是,我们如何确定哪些是安全的,哪些是不安全的? 默认情况下,你确实有一些权限为你的防火墙设置规则,但要更详细地监控传入和传出的数据包,你最需要的是 IPTables。

IPTables 可用于个人计算,也可应用于整个网络。 使用 IPTables,我们将定义一系列规则,通过这些规则,我们可以监控、允许或阻止传入或传出的网络数据包。

😊了解 IPTables 的概念

在讨论 IPTables 时,我们必须理解 3 个术语:规则。 这些都是非常重要部分。

🎈IPTables 中的 表

IPTables 中有 5 种表,每种表都有不同的规则。

  1. Filter Table - 这是使用 IPTables 时的默认表和主要表。 这意味着只要在应用规则时没有提及任何特定表,规则就会应用到过滤表。 顾名思义,过滤表的作用是决定是否允许数据包到达目的地或拒绝其请求。
  2. NAT(网络地址转换)- 顾名思义,该表允许用户决定网络地址的转换。 该表的作用是决定是否修改以及如何修改数据包地址的源地址和目标地址。
  3. Mangle Table - 该表允许我们修改数据包的 IP 头。 例如,可以通过调整 TTL 来延长或缩短数据包所能承受的网络跳数。 同样,也可以根据自己的偏好修改其他 IP 标头。
  4. RAW Table - 该表的主要用途是跟踪连接,因为它提供了一种标记数据包的机制,可将数据包视为正在进行的会话的一部分。
  5. Security Table - 使用安全表,用户可以对网络数据包应用内部 SELinux 安全上下文标记。

在大多数使用情况下,表的最后两种类型(RAW 和 Security Table)并没有太多作用,只有前三个选项才被视为主表。

🎏IPTables 中的 链

它们在我们可以应用规则的网络路由点上发挥作用。 在 IPTables 表中,有 5 种类型的链。

请记住,并非每种类型的链都适用于每种类型的表。

  1. Pre-routing - 任何传入数据包进入网络堆栈后都会应用此链,甚至在做出任何有关数据包最终目的地的路由决定之前,此链就已开始处理。
  2. Input 链 - 这是数据包进入网络堆栈的节点。
  3. Forward 链 - 数据包通过系统转发的节点。
  4. Output 链 - 输出链应用于通过系统转发并流出的数据包。
  5. Post-routing - 这与前路由链完全相反,一旦做出路由决定,就会应用到转发或发出的数据包上。
🎐IPTables 中的 规则

Rules 只是用户操纵网络流量的一组或单个命令。 一旦每条链开始运行,数据包将根据定义的规则进行检查。

如果某条规则不满足条件,则跳至下一条规则;如果满足条件,则根据目标值指定下一条规则。

每条规则都有两个组件:匹配组件目标组件

  1. 匹配组件 - 它们是定义规则的不同条件,可按协议、IP 地址、端口地址、接口和标头进行匹配。
  2. 目标组件 - 这是一旦条件满足就会触发的操作。
安装 IPTables

部分Linux发行版已经内置了 IPTables 防火墙,比如 Pop!_OS

使用下面的命令在不同的 Linux 发行版内安装 IPTables:

代码语言:javascript
复制
sudo dnf install iptables-services  // RHEL-Base
sudo apt install iptables  // Debian-Base

重要提示: 如果正在使用 Firewalld,则必须在安装前禁用它。 要完全停止防火墙,必须使用以下命令:

代码语言:javascript
复制
sudo systemctl stop firewalld --now
sudo systemctl mask firewalld

安装 IPTables 后,就可以通过给定命令启用防火墙:

代码语言:javascript
复制
sudo systemctl enable iptables --now

查看服务运行状态:

代码语言:javascript
复制
systemctl status iptables

iptables服务运行状态

注意:在 Debian 12 中,iptables 防火墙功能已经内置于内核中,因此没有独立的服务状态。这意味着启动和停止 iptables 服务的概念不再适用,因此系统会报错无法找到 iptables.service。为了管理防火墙规则并确保它们在系统重启后自动加载,可以安装并使用 iptables-persistent 工具。使用命令 "netfilter-persistent save" 或者修改对应的规则文件("/etc/iptables/rules.v4rules.v6")保存规则。

IPTables 命令的基础知识

安装完成后,我们就可以开始使用 IPTables 了,这样就可以调整默认值,并根据自己的需要进行配置。

代码语言:javascript
复制
# iptables -t {type of table} -options {chain points} {condition or matching component} {action}
表 - Table

第一部分是-t,在这里我们可以从 5 个可用的表格选项中进行选择,如果从命令中删除-t 部分,就会使用默认的过滤表类型。

链 - Chain Options

第二部分是链条。 在这里,可以选择不同的链点选项,这些选项如下所示:

  • -A - 在链的末尾向链添加新规则。
  • -C - 检查规则是否满足链的要求。
  • -D - 允许用户从链中删除现有规则。
  • -F - 这将删除用户定义的每一条规则。
  • -I - 允许用户在指定位置添加新规则。
  • -N - 创建一个全新的链。
  • -v - 与列表选项一起使用时,提供详细信息。
  • -X - 删除链。
匹配组件(Matching Component)

匹配选项是检查链要求的条件。 可以从各种选项中进行选择,部分选项如下:

代码语言:javascript
复制
Protocols -p
Source IP -s
Destination IP -d
IN interface -i
OUT interface -o

就 TCP 而言,如下:

代码语言:javascript
复制
-sport
-dport
- -tcp-flags
行动组件(Action Component)

如果我们考虑操作部分,可用选项取决于表的类型,如 NAT,与其他表相比,mangle 表有更多选项。 通过使用操作,还可以锁定特定的表或链。

最常用的操作是跳转 -j,它将为我们提供多个选项,例如:

  • ACCEPT - 用于接受数据包并结束遍历。
  • DROP - 用于丢弃数据包并结束遍历。
  • REJECT - 与 DROP 很相似,但它会将被拒绝的数据包发送到源。
  • RETURN - 这将停止数据包在子链中的遍历,并将特定数据包发送到上级链,但没有任何影响。
列出当前的 IPTables 规则

如果要检查默认情况下通过防火墙的内容,列出当前的规则集是一个常用的方法。 要列出已应用的规则,请使用给定的命令:sudo iptables -L

iptables 规则列表

允许/禁止特定端口的网络流量

如果要允许 HTTPS 网络流量,我们必须使用给定的命令来允许端口 443 :

代码语言:javascript
复制
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT

同样的,也可以通过给定命令禁用 HTTPS 网络流量:

代码语言:javascript
复制
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT

选项说明:

  • -p 用于检查指定的协议,在我们的例子中是 TCP。
  • --dport 用于指定目标端口。
  • -j 用于采取行动(接受或丢弃)。
用 IP 地址控制流量

可以通过 IP 地址控制网络流量。 不仅仅是一个或两个,还可以控制 IP 地址的范围。

要允许使用特定的 IP 地址,请使用给定的命令结构:

代码语言:javascript
复制
sudo iptables -A INPUT -s 192.168.1.123 -j ACCEPT  // 允许
sudo iptables -A INPUT -s 192.168.0.234 -j DROP  // 丢弃

如果需要,还可以利用给定的命令结构来控制 IP 地址范围:

代码语言:javascript
复制
sudo iptables -A INPUT -m iprange --src-range 192.168.0.1-192.168.0.255 -j REJECT
删除用户定义规则

有时,我们在创建规则时可能会犯错误,而克服这些错误的最佳方法就是删除它们。

代码语言:javascript
复制
sudo iptables -L --line-numbers

要删除规则,我们必须遵循给定的命令结构:

代码语言:javascript
复制
sudo iptables -D <INPUT/FORWARD/OUTPUT> <Number>

假设我想删除 INPUT 中的第 9 条规则,那么我将使用给定的命令:

代码语言:javascript
复制
sudo iptables -D INPUT 9

查看是否删除成功:

代码语言:javascript
复制
sudo iptables -L –line-numbers
保存已定义的 IPTables 规则

想知道为什么我们必须保存应用规则? 回答就是一旦系统重启,所有未保存的已定义规则都将被删除,因此保存这些规则至关重要。使用如下命令保存规则:

代码语言:javascript
复制
sudo /sbin/service iptables save  // RHEL-Based
sudo /sbin/iptables-save  // Debian-Based
🚀 五、高手进阶技巧
🔥 必学5大实战套路

最小权限原则

代码语言:javascript
复制
# 先禁止所有流量
iptables -P INPUT DROP
# 再逐步开放必要端口
iptables -A INPUT -p tcp --dport 22 -j ACCEPT  # SSH
iptables -A INPUT -p tcp --dport 80 -j ACCEPT  # HTTP

防御CC攻击

代码语言:javascript
复制
# 限制单个IP的并发连接数
iptables -A INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 50 -j REJECT

端口转发神器

代码语言:javascript
复制
# 将外网8080转发到内网192.168.1.100:80
iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to 192.168.1.100:80

只能日志分析

代码语言:javascript
复制
# 记录被拒绝的请求
iptables -A INPUT -j LOG --log-prefix "IPTABLES-DENIED: "
# 查看日志
tail -f /var/log/messages | grep IPTABLES-DENIED

规则备份

代码语言:javascript
复制
iptables-save > /etc/iptables.rules  # 备份
iptables-restore < /etc/iptables.rules  # 恢复
避坑

测试规则前务必保持SSH连接

修改规则后立即保存配置

复杂规则建议使用注释功能

代码语言:javascript
复制
iptables -A INPUT -s 10.0.0.0/24 -m comment --comment "内部网络访问" -j ACCEPT

定期使用iptables -L -v查看规则命中次数

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-05-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 一根头发丝的宽度 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 🤔什么是 IPTables?
  • 😊了解 IPTables 的概念
    • 🎈IPTables 中的 表
    • 🎏IPTables 中的 链
    • 🎐IPTables 中的 规则
  • 安装 IPTables
  • IPTables 命令的基础知识
    • 表 - Table
    • 链 - Chain Options
    • 匹配组件(Matching Component)
    • 行动组件(Action Component)
    • 列出当前的 IPTables 规则
    • 允许/禁止特定端口的网络流量
    • 用 IP 地址控制流量
      • 删除用户定义规则
    • 保存已定义的 IPTables 规则
  • 🚀 五、高手进阶技巧
    • 🔥 必学5大实战套路
  • 避坑
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档