Linux防火墙iptables学习指南!
🤔什么是 IPTables?
防火墙的工作原理非常简单。 它在可信网络和不可信网络之间建立了一道屏障,使你的系统免受恶意数据包的攻击。
但是,我们如何确定哪些是安全的,哪些是不安全的? 默认情况下,你确实有一些权限为你的防火墙设置规则,但要更详细地监控传入和传出的数据包,你最需要的是 IPTables。
IPTables 可用于个人计算,也可应用于整个网络。 使用 IPTables,我们将定义一系列规则,通过这些规则,我们可以监控、允许或阻止传入或传出的网络数据包。
😊了解 IPTables 的概念
在讨论 IPTables 时,我们必须理解 3 个术语:表
、链
和规则
。 这些都是非常重要部分。
🎈IPTables 中的 表
IPTables 中有 5 种表,每种表都有不同的规则。
-
Filter Table - 这是使用 IPTables 时的默认表和主要表。 这意味着只要在应用规则时没有提及任何特定表,规则就会应用到过滤表。 顾名思义,过滤表的作用是决定是否允许数据包到达目的地或拒绝其请求。
-
NAT(网络地址转换)- 顾名思义,该表允许用户决定网络地址的转换。 该表的作用是决定是否修改以及如何修改数据包地址的源地址和目标地址。
-
Mangle Table - 该表允许我们修改数据包的 IP 头。 例如,可以通过调整 TTL 来延长或缩短数据包所能承受的网络跳数。 同样,也可以根据自己的偏好修改其他 IP 标头。
-
RAW Table - 该表的主要用途是跟踪连接,因为它提供了一种标记数据包的机制,可将数据包视为正在进行的会话的一部分。
-
Security Table - 使用安全表,用户可以对网络数据包应用内部 SELinux 安全上下文标记。
在大多数使用情况下,表的最后两种类型(RAW 和 Security Table)并没有太多作用,只有前三个选项才被视为主表。
🎏IPTables 中的 链
它们在我们可以应用规则的网络路由点上发挥作用。 在 IPTables 表中,有 5 种类型的链。
请记住,并非每种类型的链都适用于每种类型的表。
-
Pre-routing - 任何传入数据包进入网络堆栈后都会应用此链,甚至在做出任何有关数据包最终目的地的路由决定之前,此链就已开始处理。
-
Input 链 - 这是数据包进入网络堆栈的节点。
-
Forward 链 - 数据包通过系统转发的节点。
-
Output 链 - 输出链应用于通过系统转发并流出的数据包。
-
Post-routing - 这与前路由链完全相反,一旦做出路由决定,就会应用到转发或发出的数据包上。
🎐IPTables 中的 规则
Rules 只是用户操纵网络流量的一组或单个命令。 一旦每条链开始运行,数据包将根据定义的规则进行检查。
如果某条规则不满足条件,则跳至下一条规则;如果满足条件,则根据目标值指定下一条规则。
每条规则都有两个组件:匹配组件 和 目标组件。
-
匹配组件 - 它们是定义规则的不同条件,可按协议、IP 地址、端口地址、接口和标头进行匹配。
-
目标组件 - 这是一旦条件满足就会触发的操作。
安装 IPTables
部分Linux发行版已经内置了 IPTables 防火墙,比如 Pop!_OS。
使用下面的命令在不同的 Linux 发行版内安装 IPTables:
sudo dnf install iptables-services // RHEL-Base
sudo apt install iptables // Debian-Base
重要提示: 如果正在使用 Firewalld,则必须在安装前禁用它。 要完全停止防火墙,必须使用以下命令:
sudo systemctl stop firewalld --now
sudo systemctl mask firewalld
安装 IPTables 后,就可以通过给定命令启用防火墙:
sudo systemctl enable iptables --now
查看服务运行状态:
systemctl status iptables
iptables服务运行状态
注意:在 Debian 12 中,iptables 防火墙功能已经内置于内核中,因此没有独立的服务状态。这意味着启动和停止 iptables 服务的概念不再适用,因此系统会报错无法找到 iptables.service。为了管理防火墙规则并确保它们在系统重启后自动加载,可以安装并使用 iptables-persistent 工具。使用命令 "netfilter-persistent save" 或者修改对应的规则文件("/etc/iptables/rules.v4rules.v6")保存规则。
IPTables 命令的基础知识
安装完成后,我们就可以开始使用 IPTables 了,这样就可以调整默认值,并根据自己的需要进行配置。
# 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)
匹配选项是检查链要求的条件。 可以从各种选项中进行选择,部分选项如下:
Protocols -p
Source IP -s
Destination IP -d
IN interface -i
OUT interface -o
就 TCP 而言,如下:
-sport
-dport
- -tcp-flags
行动组件(Action Component)
如果我们考虑操作部分,可用选项取决于表的类型,如 NAT,与其他表相比,mangle 表有更多选项。 通过使用操作,还可以锁定特定的表或链。
最常用的操作是跳转 -j
,它将为我们提供多个选项,例如:
-
ACCEPT
- 用于接受数据包并结束遍历。 -
DROP
- 用于丢弃数据包并结束遍历。 -
REJECT
- 与 DROP 很相似,但它会将被拒绝的数据包发送到源。 -
RETURN
- 这将停止数据包在子链中的遍历,并将特定数据包发送到上级链,但没有任何影响。
列出当前的 IPTables 规则
如果要检查默认情况下通过防火墙的内容,列出当前的规则集是一个常用的方法。 要列出已应用的规则,请使用给定的命令:sudo iptables -L
iptables 规则列表
允许/禁止特定端口的网络流量
如果要允许 HTTPS 网络流量,我们必须使用给定的命令来允许端口 443 :
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT
同样的,也可以通过给定命令禁用 HTTPS 网络流量:
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT
选项说明:
-
-p
用于检查指定的协议,在我们的例子中是 TCP。 -
--dport
用于指定目标端口。 -
-j
用于采取行动(接受或丢弃)。
用 IP 地址控制流量
可以通过 IP 地址控制网络流量。 不仅仅是一个或两个,还可以控制 IP 地址的范围。
要允许使用特定的 IP 地址,请使用给定的命令结构:
sudo iptables -A INPUT -s 192.168.1.123 -j ACCEPT // 允许
sudo iptables -A INPUT -s 192.168.0.234 -j DROP // 丢弃
如果需要,还可以利用给定的命令结构来控制 IP 地址范围:
sudo iptables -A INPUT -m iprange --src-range 192.168.0.1-192.168.0.255 -j REJECT
删除用户定义规则
有时,我们在创建规则时可能会犯错误,而克服这些错误的最佳方法就是删除它们。
sudo iptables -L --line-numbers
要删除规则,我们必须遵循给定的命令结构:
sudo iptables -D <INPUT/FORWARD/OUTPUT> <Number>
假设我想删除 INPUT 中的第 9 条规则,那么我将使用给定的命令:
sudo iptables -D INPUT 9
查看是否删除成功:
sudo iptables -L –line-numbers
保存已定义的 IPTables 规则
想知道为什么我们必须保存应用规则? 回答就是一旦系统重启,所有未保存的已定义规则都将被删除,因此保存这些规则至关重要。使用如下命令保存规则:
sudo /sbin/service iptables save // RHEL-Based
sudo /sbin/iptables-save // Debian-Based
🚀 五、高手进阶技巧
🔥 必学5大实战套路
-
最小权限原则
# 先禁止所有流量 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攻击
# 限制单个IP的并发连接数 iptables -A INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 50 -j REJECT
-
端口转发神器
# 将外网8080转发到内网192.168.1.100:80 iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to 192.168.1.100:80
-
只能日志分析
# 记录被拒绝的请求 iptables -A INPUT -j LOG --log-prefix "IPTABLES-DENIED: " # 查看日志 tail -f /var/log/messages | grep IPTABLES-DENIED
-
规则备份
iptables-save > /etc/iptables.rules # 备份 iptables-restore < /etc/iptables.rules # 恢复
避坑
-
测试规则前务必保持SSH连接
-
修改规则后立即保存配置
-
复杂规则建议使用注释功能:
iptables -A INPUT -s 10.0.0.0/24 -m comment --comment "内部网络访问" -j ACCEPT
-
定期使用
iptables -L -v
查看规则命中次数