TOC

Ubuntu 系统在 IPv6 环境下的公网暴露排查与加固

背景

家用宽带默认启用了 IPv6,并且 Ubuntu 24.04 主机可以通过 IPv6 地址直接使用 SSH 登录。这意味着设备获得了全球可路由地址,不再依赖 IPv4 NAT 的“隐身”效果。

这种情况本身并不表示系统已经被攻击,但确实意味着主机上的监听服务可能直接暴露在公网,需要对当前安全状态进行审计,并建立基本的防护措施。

安全检查:确认是否“全裸”以及是否存在入侵迹象

1. 检查防火墙状态

首先检查 Uncomplicated Firewall 是否启用:

sudo ufw status verbose

输出:

状态:不活动

说明 UFW 未启用。

2. 检查 nftables 规则

nftables 是 Linux 当前主流的包过滤框架:

sudo nft list ruleset

没有任何输出,说明没有自定义规则。

3. 检查 IPv6 默认策略

sudo ip6tables -L -n -v

输出:

Chain INPUT (policy ACCEPT)

这表示:

  • 所有 IPv6 入站连接默认允许;
  • 系统没有设置网络层访问控制;
  • 任何监听端口都可以被互联网直接访问。

4. 判断是否处于公网直接暴露状态

当同时满足以下条件时,可以认为系统处于“全裸”状态:

  1. 获得全球 IPv6 地址(scope global)。
  2. 防火墙未启用。
  3. INPUT 默认策略为 ACCEPT
  4. 存在监听服务(例如 SSH)。

这并不表示已被入侵,只表示攻击面完全暴露。

5. 检查当前登录用户

who
w

结果显示:

  • 当前只有一个登录用户:catroll
  • 登录方式为本地 GNOME 会话

没有陌生远程会话。

6. 检查系统账户

awk -F: '$3 >= 1000 {print $1}' /etc/passwd

输出:

nobody
catroll

系统中没有新增的可交互用户。

7. 审计 SSH 登录日志

sudo journalctl -u ssh --since "7 days ago" | grep Accepted

记录基本如下:

Accepted publickey for catroll ...

说明:

  • 登录均使用同一 SSH 公钥;
  • 登录用户均为 catroll
  • 来源地址均属于自己的 IPv6 地址段。

8. 检查 SSH 实际配置

配置文件中:

PermitRootLogin no
PasswordAuthentication no

表示:

  • 禁止 Root 登录;
  • 禁用密码认证;
  • 仅允许公钥登录。

运行时配置可通过以下命令确认:

sudo sshd -T | grep -E 'passwordauthentication|permitrootlogin|pubkeyauthentication'

期望输出:

passwordauthentication no
permitrootlogin no
pubkeyauthentication yes

安全加固:建立 IPv6 下的安全基线

1. 启用 UFW 防火墙

sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow OpenSSH
sudo ufw enable

这组命令的作用:

  • 默认拒绝所有入站连接;
  • 允许所有出站连接;
  • 保留 SSH 访问能力;
  • 正式启用防火墙。

验证:

sudo ufw status verbose

2. 确保 SSH 仅允许密钥登录

编辑配置文件:

sudo nano /etc/ssh/sshd_config

确保包含:

PermitRootLogin no
PasswordAuthentication no
PubkeyAuthentication yes

重启 SSH 服务:

sudo systemctl restart ssh

3. 安装 Fail2ban

Fail2ban 用于监控系统日志并自动封禁多次认证失败的来源地址。

安装:

sudo apt update
sudo apt install fail2ban

启动并设置开机自启:

sudo systemctl enable --now fail2ban

该命令等价于:

sudo systemctl enable fail2ban
sudo systemctl start fail2ban

4. 验证 Fail2ban 状态

查看服务状态:

sudo systemctl status fail2ban

查看启用的防护模块:

sudo fail2ban-client status

查看 SSH 防护详情:

sudo fail2ban-client status sshd

5. 如不需要公网 SSH,可直接关闭

通过防火墙禁止 SSH:

sudo ufw deny 22/tcp

或者彻底停止 SSH 服务:

sudo systemctl disable --now ssh

6. 建议的安全基线

适用于长期联网的 Ubuntu 桌面或服务器:

  • 启用 UFW。
  • 默认拒绝所有入站连接。
  • SSH 禁止 Root 登录。
  • SSH 禁用密码认证。
  • 仅允许公钥登录。
  • 安装 Fail2ban。
  • 定期审计登录日志。
  • 及时安装系统更新。
如果你有魔法,你可以看到一个评论框~