VPS上防火墙的安装与配置

Ubuntu Server 24.04 里的 iptables 与 ufw

ufw 和 iptables 的关系

在 Ubuntu Server 24.04 中,ufw 和 iptables 并不是并列的二选一方案,而是“前端工具与后端框架”的关系。简单来说:ufw 是 iptables 的简化配置工具,iptables 是真正生效的底层防火墙规则。

不要混用:对于生产环境,建议只选其一进行管理。

  • 如果你选择 ufw,就通过 ufw 命令管理。直接用 iptables 命令添加的规则虽然也会生效,但 ufw 重启(systemctl restart ufw)后会清除这些“外部”规则。
  • 如果你选择 iptables 或 nftables,建议先执行 sudo ufw disablesudo 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中显示。

  1. 禁止入,允许出,关闭路由;
  2. 禁止入不影响本地环路,比如ssh客户端的本地/远程隧道;
  3. 在操作规则时,未指定方向就是入。

在系统启动时启用/禁用防火墙: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

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注