更多云服务器知识,尽在hostol.com
你可能已经学会了使用ufw
这位友好的“社区保安”,为你服务器的大门,设置了简单的“访客准-入”规则,体验到了“一键开关”的便捷。
但当你的“社区”,要升级成一座拥有“军事区”、“商业区”、“使馆区”的复杂“城市”时;当你想制定更精细、更动态、更专业的“出入境管理条例”时,一位只会看“访客名单”的保安,就显得力不从心了。
今天,我们将深入“城防系统”的“控制核心”,去认识并驾驭那两位真正掌控着你服务器所有网络命脉的、更强大、也更专业的“上古守护神”——iptables
与firewalld
。掌握它们,你才算真正地,从一个“防火墙使用者”,晋升为了一个“网络规则的制定者”。
Linux服务器防火墙进阶:详解iptables与firewalld的规则配置
在我们开始之前,你必须先理解一个现实:你之前使用的ufw
,其实并不是一个“防火墙”,它更像一个“遥控器”。而它在后台真正“遥控”的那个强大无比的“电视机本体”,在大多数Debian/Ubuntu系统上,就是我们今天要聊的第一位大神——iptables
。
第一位大神:iptables
—— 严谨、强大、无处不在的“网络炼金术士”
iptables
是Linux内核中netfilter防火墙框架的“首席大祭司”。它古老、强大、无处不在,几乎所有的Linux发行版都离不开它。它的配置,就像是在编写一套“网络数据包的炼金法则”,拥有无与伦比的灵活性和控制力。
- 核心比喻:一座拥有三道“魔法门”的城堡 要理解
iptables
,你只需要记住它的三个核心“链 (Chains)”,你可以把它们想象成城堡的三道“魔法门”:INPUT
(输入链): 这是通往“城堡内部”的吊桥。所有目的地是你服务器本身的数据包(比如,用户访问你的网站,你SSH登录),都必须经过这道门的盘查。OUTPUT
(输出链): 这是从城堡“向外射箭”的箭垛。所有从你服务器主动发出的数据包(比如,你的服务器去请求一个API,或者返回网页给用户),都必须经过这道门的许可。FORWARD
(转发链): 这就像是你允许“盟军”穿过你的城堡,去攻击另一个敌人。它处理的是那些目的地不是你,但需要经过你的数据包。对于一台普通的服务器(而不是路由器),我们通常会把这条路彻底堵死。
iptables
的“魔法咒语”iptables
的命令,初看起来像天书,但一旦你理解了它的“语法”,就会发现其中的逻辑之美。1. 查看“规则之书” (-L
) 我们先来看看城堡里,现在都有哪些规则。
Bash
sudo iptables -L -v -n
-L
: List,列出规则。-v
: Verbose,显示更详细的信息。-n
: Numeric,以数字形式显示IP和端口,更快更清晰。 你可能会看到INPUT
、FORWARD
、OUTPUT
三张“规则列表”,以及它们的默认“策略 (policy)”,比如policy ACCEPT
(默认全部接受)或policy DROP
(默认全部丢弃)。
2. 篆刻“准入法则” (-A
) 现在,我们要亲手写入一条规则:允许所有来自我们自己家IP(比如22.33.44.55
)的SSH连接。
Bash
sudo iptables -A INPUT -p tcp -s 22.33.44.55 --dport 23456 -j ACCEPT
我们来为这句“咒语”进行“解咒”:
-A INPUT
:Append
,在INPUT
这条链的末尾,追加一条新规则。-p tcp
:protocol
,这条规则只适用于tcp
协议。-s 22.33.44.55
:source
,只适用于源地址是22.33.44.55
的数据包。--dport 23456
:destination port
,只适用于目标端口是23456
(我们修改后的SSH端口)的数据包。-j ACCEPT
:jump
,如果以上条件全部满足,就“跳转”到ACCEPT
这个动作,也就是“接受”和“放行”。
3. 擦除“错误法则” (-D
) 如果你写错了一条规则,可以用-D
(Delete)来删除它。
Bash
# 先查看带行号的规则列表
sudo iptables -L INPUT --line-numbers
# 假设要删除的是第5条规则
sudo iptables -D INPUT 5
iptables
的“阿喀琉斯之踵”——规则不持久 iptables
有一个让无数新手“一夜回到解放前”的特性:你用命令设置的所有规则,在服务器重启后,都会烟消云散! 为了解决这个问题,我们需要安装一个“记忆法术”:
Bash
# Ubuntu/Debian
sudo apt install iptables-persistent
# 安装过程中,它会问你是否要保存当前的IPv4和IPv6规则,选择“是”。
# 以后每次修改完规则,执行 sudo netfilter-persistent save 即可永久保存。
第二位大神:firewalld
—— 更现代、更聪明的“区域安保总管”
firewalld
是现代RHEL系(如CentOS 7+)默认的防火墙管理工具。如果说iptables
是一位需要你亲自去指导每一个“卫兵”动作的“老将军”,那么firewalld
就是一位更聪明的“区域安保总管”。
- 核心比喻:拥有多个“安全区域”的智能大厦
firewalld
最核心、也最颠覆性的理念,是“区域 (Zone)”。 它不再把服务器看作一个只有“进”和“出”的简单城堡。它把整栋“智能大厦”(服务器),划分成了多个拥有不同安全等级的“区域”。比如:public
(公共区域): 这是大厦的“临街大堂”。默认情况下,安保最严格,只信任最少的服务。所有连接到互联网的网卡,都应该被划入这个区域。internal
(内部区域): 这是大厦的“员工办公区”。安保等级可以适当放宽,允许内部员工(内网服务器)之间进行更多的互信访问。drop
(黑洞区域): 这是大厦的“垃圾焚化炉”。任何被扔进这个区域的连接,都会被立刻、无声地“焚毁”,连一个“拒绝”的回应都不会给。
firewalld
的“现代管理指令” (firewall-cmd
)firewalld
的所有操作,都通过firewall-cmd
这个命令来完成,它的语法,比iptables
要友好得多。- 1. 查看“安保状态”
Bash
sudo firewall-cmd --state # 查看防火墙是否在运行
sudo firewall-cmd --get-active-zones # 查看当前哪个区域正在被哪个网卡使用
sudo firewall-cmd --zone=public --list-all # 查看public区域的所有规则
2. 发布“许可令” 我们要为public
区域,永久地,开放HTTP和HTTPS服务。
Bash
sudo firewall-cmd --zone=public --add-service=http --permanent
sudo firewall-cmd --zone=public --add-service=https- --permanent
--add-service=http
:firewalld
已经预先为我们定义好了像http
(80),ssh
(22)这些常用服务的“套餐”,非常方便。--permanent
: 这是firewalld
最棒的特性之一! 加上这个参数,这条规则就会被永久保存。你再也不用担心重启后规则会丢失了。
3. 发布“自定义许可令” 我们要为public
区域,永久地,开放我们自定义的8080
端口。
Bash
sudo firewall-cmd --zone=public --add-port=8080/tcp --permanent
4. 让“新规章”立刻生效 所有带了--permanent
的修改,都需要执行一次“重新加载”,才能在当前会话中生效。
Bash
sudo firewall-cmd --reload
终极对决:我到底该用谁?
对比维度 | iptables |
firewalld |
底层原理 | 直接操作内核netfilter | 通过后端(默认是iptables)来管理规则 |
管理哲学 | “链”式思维,面向数据包 | “区域”式思维,面向网络接口 |
持久化 | 需要额外工具 (iptables-persistent ) |
内置 (--permanent 参数) |
动态更新 | 重启服务会中断连接 | reload 平滑重载,不中断连接 |
易用性 | 陡峭,但极其灵活 | 相对平缓,逻辑清晰 |
给你最直接的建议:
- 如果你正在使用CentOS 7+、RHEL 7+等现代企业级发行版: 请拥抱
firewalld
。 它是官方的、推荐的、更现代、也更安全的管理方式。 - 如果你使用的是Debian/Ubuntu,或者一个极简的Linux环境: 学习
iptables
是你的必修课。 它是最基础、最通用的“语言”。即使你日常使用ufw
,理解iptables
的底层逻辑,也会让你在排查疑难杂症时,功力大增。
你,已是“网络规则的立法者”
现在,你不再是一个只会开关ufw
这个“总电闸”的“住户”了。你成了一位能读懂底层“电路图”(iptables
)、并能熟练操作“智能家居总控面板”(firewalld
)的“首席安全工程师”。
你掌握的,是Linux网络安全最核心、最底层的“语法”。拥有了这份知识,你才能真正地,为你那座日益庞大的数字帝国,构建起一道随心所欲、坚不可摧的“次元壁”。