ufw 和 iptables 的关系
在 Ubuntu Server 24.04 中,ufw 和 iptables 并不是并列的二选一方案,而是“前端工具与后端框架”的关系。简单来说:ufw 是 iptables 的简化配置工具,iptables 是真正生效的底层防火墙规则。
不要混用:对于生产环境,建议只选其一进行管理。
- 如果你选择 ufw,就通过
ufw命令管理。直接用iptables命令添加的规则虽然也会生效,但 ufw 重启(systemctl restart ufw)后会清除这些“外部”规则。 - 如果你选择 iptables 或 nftables,建议先执行
sudo ufw disable并sudo systemctl mask ufw彻底禁用 ufw,避免下次重启时 ufw 覆盖掉你手写的复杂规则。
对于 Ubuntu Server 24.04 作为云服务器或基础物理机的场景:
- 默认推荐 ufw。因为它足够简单,能应对 90% 的安全组配置需求(开放端口、限制来源 IP),且 Ubuntu 官方对其测试充分,不易出错。
- 只有在需要配置 NAT 转发、端口重定向(如将 80 转发到 8080)、复杂的连接追踪限速 或 多路由表策略 时,才有必要直接操作 iptables/nftables。
总结:ufw 是管理防火墙规则的“便捷接口”,iptables/nftables 是真正执行过滤的“底层引擎”。在 Ubuntu 24.04 上,除非有复杂的路由转发需求,否则使用 ufw 管理防火墙更为安全、高效。
iptables
1、重新安装
# 确认是否被卸载
which iptables
sudo iptables --version
# 安装前禁用 ufw 防止被其他服务重新激活,因为有冲突。
sudo systemctl status ufw
sudo ufw disable
sudo systemctl mask ufw
# 安装 iptables 及持久化组件,过程中会询问是否保存当前规则(此时规则为空),选择两次 Yes 即可。
sudo apt update
sudo apt install iptables iptables-persistent -y
iptables 不是一个需要启动的后台进程(如 nginx 或 mysql),而是一个直接工作在内核空间的内核模块。安装完成后,相关的内核功能就已经就绪了,默认是没有添加任何拦截规则,因此不会对你的 SSH 连接造成任何影响。
2、要让防火墙真正生效,你需要按照以下步骤手动添加规则,并确保持久化。
# 允许 SSH(默认端口 22,如已修改请替换)
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# 允许回环接口(本地通信)
sudo iptables -A INPUT -i lo -j ACCEPT
# 允许已建立连接和关联连接(保证 SSH 会话不断)
sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
# 设置默认策略:入站丢弃,转发丢弃,出站允许
sudo iptables -P INPUT DROP
sudo iptables -P FORWARD DROP
sudo iptables -P OUTPUT ACCEPT
# 开放 Http/Https
sudo iptables -A INPUT -p tcp --dport 80,443 -j ACCEPT
格式为:
sudo iptables -A|I INPUT|OUTPUT [N] -p tcp|udp [-s <源IP>] [-d <目标IP>] --dport <目标端口> -j ACCEPT|DROP
# -A是追加到规则末尾,-I是插入为规则第N条,省略N就是最前面为第1条。
# --dport <目标端口> 必须与 -p tcp|udp 配合使用
3、确认与验证 iptables
# 查看当前规则
sudo iptables -L -v -n
# 查看当前规则,带序号
sudo iptables -L -v --line-numbers -n
输出内容如下:
Chain INPUT (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
1396 104K ACCEPT 6 -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:22
56 5502 ACCEPT 0 -- lo * 0.0.0.0/0 0.0.0.0/0
61 7225 ACCEPT 0 -- * * 0.0.0.0/0 0.0.0.0/0 ctstate RELATED,ESTABLISHED
0 0 ACCEPT 6 -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:80
1 60 ACCEPT 6 -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:443
Chain FORWARD (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 349 packets, 112K bytes)
pkts bytes target prot opt in out source destination
关键测试:保持当前 SSH 窗口不要关闭,另开一个终端尝试新 SSH 连接。若能成功登录,说明规则正确;若无法登录,立即在当前窗口执行以下命令恢复:
sudo iptables -P INPUT ACCEPT # 临时放行所有入站
sudo iptables -F # 清空所有规则
4、验证成功后,持久化规则:
# 最后,持久化规则
sudo netfilter-persistent save
run-parts: executing /usr/share/netfilter-persistent/plugins.d/15-ip4tables save
run-parts: executing /usr/share/netfilter-persistent/plugins.d/25-ip6tables save
# 确认是否开机自动启动
sudo systemctl status iptables
sudo systemctl status netfilter-persistent
# 重启难
sudo reboot
删除规则
# 只查看 INPUT,显示序号
sudo iptables -L INPUT --line-numbers -n -v
# 删除序号3的INPUT规则
sudo iptables -D INPUT 3
ufw
查看防火墙状态:sudo ufw status [verbose|numbered]
- 如果输出是
Status: inactive表示为 ufw 为关闭状态。
状态:激活
日志: on (low)
默认:deny (incoming), allow (outgoing), disabled (routed)
新建配置文件: skip
启用状态下显示规则信息,verbose为显示详细信息,而numbered会显示规则编号。注意:默认规则,只会在ufw status verbose中显示。
- 禁止入,允许出,关闭路由;
- 禁止入不影响本地环路,比如ssh客户端的本地/远程隧道;
- 在操作规则时,未指定方向就是入。
在系统启动时启用/禁用防火墙:sudo ufw enable|disable,注意:在远程ssh连接时,启用ufw后,要立即允许22端口访问 。
增加允许传入规则:允许任一主机通过tcp协议连接22端口;由于默认是deny,所有一般不需要增加禁止规则,如果需要,将allow改为deny。
$ sudo ufw allow 22/tcp
$ sudo ufw status
状态: 激活
至 动作 来自
- -- --
22/tcp ALLOW Anywhere
22/tcp (v6) ALLOW Anywhere (v6)
删除现有传入规则:sudo ufw delete allow 22/tcp
增加允许传入规则:
# 允许指定IP主机(192.168.121.2),连接指定本机任意网络接口 IP上的3306端口,注意是任何协议
$ sudo ufw allow from 192.168.121.2 to any port 3306
$ sudo ufw status
状态: 激活
至 动作 来自
- -- --
3306 ALLOW 192.168.121.2
# 以下两个命令的作用是相同的:允许任意主机,使用TCP协议,连接到本机3306端口上
$ sudo ufw allow proto tcp from any to any port 3306
$ sudo ufw allow 3306/tcp
删除允许传入规则:
$ sudo ufw delete {numbered}|<添加规则时的内容>
# sudo ufw delete allow proto tcp from 192.168.121.2 to any port 3306
使修改生效:sudo ufw reload
启用的步骤顺序
sudo iptables --version
sudo systemctl status ufw
sudo ufw status numbered
# 此时为关闭时,先不能直接启用,需要先允许ssh连接。
sudo ufw allow 22/tcp
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
# 在关闭状态下,查看配置的规则
sudo ufw show added
# 启用ufw,提示:该命令可能会中断现有的ssh连接。是否继续操作 (y|n)
$ sudo ufw enable
Command may disrupt existing ssh connections. Proceed with operation (y|n)? y
Firewall is active and enabled on system startup
sudo ufw status numbered|verbose输出内容的区别
$ sudo ufw status numbered
Status: active
To Action From
-- ------ ----
[ 1] 22/tcp ALLOW IN Anywhere
[ 2] 80/tcp ALLOW IN Anywhere
[ 3] 443/tcp ALLOW IN Anywhere
[ 4] 22/tcp (v6) ALLOW IN Anywhere (v6)
[ 5] 80/tcp (v6) ALLOW IN Anywhere (v6)
[ 6] 443/tcp (v6) ALLOW IN Anywhere (v6)
$ sudo ufw status verbose
Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), disabled (routed)
New profiles: skip
To Action From
-- ------ ----
22/tcp ALLOW IN Anywhere
80/tcp ALLOW IN Anywhere
443/tcp ALLOW IN Anywhere
22/tcp (v6) ALLOW IN Anywhere (v6)
80/tcp (v6) ALLOW IN Anywhere (v6)
443/tcp (v6) ALLOW IN Anywhere (v6)
最后执行 sudo ufw reload
发表回复