双层阻断,完整验收
先以 Cloud Firewall 阻断 IPv6,再由 sysctl 与 systemd-networkd 固化 IPv4-only;全过程保留第二路 SSH、Lish Console、备份和回滚。
目标:禁止 Linode 的 IPv6 入站、出站和 Ubuntu 系统 IPv6,同时保留 FinalShell/SSH 的 IPv4 访问,并确保代理浏览器继续通过 VPS 公网 IPv4 正常访问互联网。
01一、实施目标与边界
最终状态应同时满足:
- Linode Cloud Firewall 不接受 IPv6 入站,也不允许 IPv6 出站。
- Ubuntu 的
all、default、lo和eth0均禁用 IPv6。 eth0不再通过 Router Advertisement 或自动配置取得 IPv6。- SSH 只通过 VPS 公网 IPv4 连接,端口保持实际 SSH 端口。
- VPS 的 IPv4 地址、IPv4 默认路由和
systemd-networkd保持正常。 - 代理浏览器出口显示 VPS 公网 IPv4,不出现可用公网 IPv6,也不暴露本地真实公网 IP。
本文默认 SSH 端口为 22。如果实际端口不是 22,下文所有 22 均替换为实际端口。
02二、操作前建立安全绳
- 登录 Linode Cloud Manager,确认可以打开该主机的 Lish Console。
- 保持当前 FinalShell/SSH 会话不要关闭。
- 在 Linode Cloud Manager 中确认 VPS 的公网 IPv4 地址。
- 在 FinalShell 中直接填写该公网 IPv4,不使用可能解析出 AAAA 记录的域名,也不使用 IPv6 地址。
- 再打开一个 FinalShell 窗口,使用 VPS 公网 IPv4 登录。
- 两个 FinalShell 窗口都能登录后再继续。
1. 执行前置检查
执行:
sudo ss -lntp4 | grep ':22 '
systemctl is-active systemd-networkd
sudo test -f /etc/systemd/network/05-eth0.network && echo OK必须看到:
TCP 22 正在监听
active
OK如果 SSH 的 IPv4 监听、systemd-networkd 状态或 /etc/systemd/network/05-eth0.network 任意一项不符合预期,停止操作,先解决该问题。
03三、配置 Linode Cloud Firewall
进入:
Cloud Manager → Firewalls → 选择已绑定该 Linode 或其 Public Interface 的 Firewall → Rules
1. Inbound 最终配置
默认策略:
Inbound Policy: DROP只保留以下必要规则:
| 顺序 | Label | Protocol | Ports | Sources | Action |
|---|---|---|---|---|---|
| 1 | allow-ssh-ipv4 | TCP | 22 | All IPv4 | ACCEPT |
要求:
- 不添加 IPv6 来源。
- 不添加 UDP 入站规则。
- 不增加 Inbound
443、53或其他与本次目标无关的端口。 - 如果已有允许 SSH 的 IPv6 规则,删除或禁用。
- 如果确认本地公网 IPv4 长期固定,可在完成全部验证后把
All IPv4收紧为你的公网IPv4/32。
2. Outbound 最终配置
默认策略:
Outbound Policy: ACCEPT把以下四条规则放在所有 Outbound 规则的最上方:
| 顺序 | Label | Protocol | Ports | Destinations | Action |
|---|---|---|---|---|---|
| 1 | block-ipv6-tcp | TCP | All Ports | All IPv6 | DROP |
| 2 | block-ipv6-udp | UDP | All Ports | All IPv6 | DROP |
| 3 | block-ipv6-icmp | ICMP | 不填写 | All IPv6 | DROP |
| 4 | block-ipv6-ipencap | IPENCAP | 不填写 | All IPv6 | DROP |
要求:
- 删除或下移位于这四条规则之前、且会允许 IPv6 的冲突规则。
- 不要把 Outbound Policy 设为
DROP,除非已经另外建立完整的 IPv4 放行规则。 - 确认 Firewall 状态为 Enabled。
- 确认 Firewall 已绑定到目标 Linode;如果主机使用 Linode Interfaces,确认绑定到对应的 Public Interface。
- 点击 Save Changes。
3. 立即验证 IPv4 SSH
不要关闭原 SSH 会话。另开一个 FinalShell 窗口,使用 VPS 公网 IPv4 建立新连接:
主机:VPS 公网 IPv4
协议:SSH
端口:22 或实际 SSH 端口只有新窗口能够正常登录后,才继续修改 Ubuntu。
04四、备份现有网络配置
整段复制执行:
fix_stamp=$(date +%Y%m%d-%H%M%S)
fix_backup="/root/ipv6-fix-backup-$fix_stamp"
sudo mkdir -p "$fix_backup"
sudo cp -a /etc/systemd/network/05-eth0.network "$fix_backup/"
if [ -f /etc/sysctl.d/99-disable-ipv6.conf ]; then
sudo cp -a /etc/sysctl.d/99-disable-ipv6.conf "$fix_backup/"
fi
if [ -f /etc/systemd/network/05-eth0.network.d/90-disable-ipv6.conf ]; then
sudo mkdir -p "$fix_backup/05-eth0.network.d"
sudo cp -a /etc/systemd/network/05-eth0.network.d/90-disable-ipv6.conf "$fix_backup/05-eth0.network.d/"
fi
echo "$fix_backup"
sudo ls -la "$fix_backup"记下屏幕显示的 /root/ipv6-fix-backup-日期时间 目录。后续发生异常时,这个目录用于恢复修改前的配置。
05五、写入 Ubuntu IPv6 禁用配置
整段复制执行:
sudo install -d -m 0755 /etc/sysctl.d
sudo tee /etc/sysctl.d/99-disable-ipv6.conf >/dev/null <<'EOF'
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
net.ipv6.conf.lo.disable_ipv6 = 1
net.ipv6.conf.eth0.autoconf = 0
net.ipv6.conf.eth0.accept_ra = 0
net.ipv6.conf.eth0.disable_ipv6 = 1
EOF前三项从系统全局、默认接口和回环接口禁用 IPv6;后三项专门阻止 eth0 自动配置、接受 RA 和继续启用 IPv6。
06六、禁止 eth0 自动取得 IPv6
整段复制执行:
sudo install -d -m 0755 /etc/systemd/network/05-eth0.network.d
sudo tee /etc/systemd/network/05-eth0.network.d/90-disable-ipv6.conf >/dev/null <<'EOF'
[Network]
IPv6AcceptRA=no
LinkLocalAddressing=ipv4
EOF
sudo systemd-analyze cat-config systemd/network/05-eth0.network
sudo networkctl reload
sudo journalctl -u systemd-networkd --no-pager -n 30确认输出中存在:
IPv6AcceptRA=no
LinkLocalAddressing=ipv4不要通过 SSH 执行:
networkctl reconfigure eth0该命令可能立即重配正在承载 SSH 的网卡,增加远程断联风险。这里只执行 networkctl reload,把完整应用留到计划内重启。
07七、立即应用并验证 VPS
1. 应用配置
按顺序执行:
sudo sysctl --system
sudo sysctl -w net.ipv6.conf.eth0.autoconf=0
sudo sysctl -w net.ipv6.conf.eth0.accept_ra=0
sudo sysctl -w net.ipv6.conf.eth0.disable_ipv6=12. 检查 sysctl、地址与路由
执行:
sysctl net.ipv6.conf.all.disable_ipv6
sysctl net.ipv6.conf.default.disable_ipv6
sysctl net.ipv6.conf.lo.disable_ipv6
sysctl net.ipv6.conf.eth0.disable_ipv6
sysctl net.ipv6.conf.eth0.autoconf
sysctl net.ipv6.conf.eth0.accept_ra
ip -6 address show
ip -6 route show
ip -4 address show dev eth0
ip -4 route show应满足:
all/default/lo/eth0 disable_ipv6 = 1
eth0 autoconf = 0
eth0 accept_ra = 0
ip -6 address 无可用地址
ip -6 route 无可用路由
IPv4 地址和默认路由正常3. 检查 IPv4 与 IPv6 出口
执行:
curl -4 --connect-timeout 10 https://ifconfig.co
curl -6 --connect-timeout 5 https://ifconfig.co
curl -4 -sS -o /dev/null -w 'HTTP=%{http_code}\n' --connect-timeout 10 --max-time 20 https://www.google.com/generate_204
curl -6 -sS -o /dev/null -w 'HTTP=%{http_code}\n' --connect-timeout 5 --max-time 10 https://www.google.com/generate_204合格结果:
ifconfig.co 的 IPv4 测试返回 VPS 公网 IPv4
ifconfig.co 的 IPv6 测试连接失败
IPv4 generate_204 测试返回 HTTP=204
IPv6 generate_204 测试连接失败4. 再次测试 SSH
保持当前会话不关闭,再开一个 FinalShell 窗口,使用 VPS 公网 IPv4 登录。新窗口登录成功后再继续。
08八、验证代理与指纹浏览器
- 关闭使用该 VPS 代理的浏览器 Profile。
- 重新打开该 Profile。
- 执行代理检测。
- 依次打开:
https://www.google.com/https://www.tiktok.com/https://www.browserscan.net/https://test-ipv6.com/
必须满足:
Google 可以打开
TikTok 可以打开
出口显示 VPS 公网 IPv4
没有可用公网 IPv6
WebRTC 不显示本地真实公网 IP09九、关闭 VPS 的 Network Helper
只有在 Cloud Firewall、Ubuntu 即时验证、第二路 SSH 和代理浏览器全部通过后,才执行本节。
1. 使用 Linode Interfaces
- 保持 Lish Console 打开。
- 在 Cloud Manager 关闭 VPS。
- 打开:
VPS → Network → Interface Settings。 - 关闭 Enable Network Helper。
- 点击 Save。
- 启动 VPS。
2. 使用 Legacy Configuration Profile
- 打开:
VPS → Configurations → Edit。 - 找到 Filesystem/Boot Helpers。
- 关闭 Auto-configure networking。
- 点击 Save Changes。
- 重启 VPS。
只关闭当前 VPS 自己的 Network Helper,不修改账户全局设置。
10十、重启后最终验收
确认 Lish Console 可用后执行:
sudo reboot主机启动后,用 VPS 公网 IPv4 登录并执行:
systemctl is-active systemd-networkd
sysctl net.ipv6.conf.all.disable_ipv6
sysctl net.ipv6.conf.default.disable_ipv6
sysctl net.ipv6.conf.lo.disable_ipv6
sysctl net.ipv6.conf.eth0.disable_ipv6
sysctl net.ipv6.conf.eth0.autoconf
sysctl net.ipv6.conf.eth0.accept_ra
ip -6 address show
ip -6 route show
ip -4 address show dev eth0
ip -4 route show
curl -4 --connect-timeout 10 https://ifconfig.co
curl -6 --connect-timeout 5 https://ifconfig.co
curl -4 -sS -o /dev/null -w 'HTTP=%{http_code}\n' --connect-timeout 10 --max-time 20 https://www.google.com/generate_204
curl -6 -sS -o /dev/null -w 'HTTP=%{http_code}\n' --connect-timeout 5 --max-time 10 https://www.google.com/generate_204最终合格标准:
| 检查项 | 合格结果 |
|---|---|
systemd-networkd | active |
all/default/lo/eth0 disable_ipv6 | 全部为 1 |
eth0 autoconf | 0 |
eth0 accept_ra | 0 |
| IPv6 地址与路由 | 无可用地址、无可用路由 |
| IPv4 地址与默认路由 | 正常 |
| IPv4 出口 | 返回 VPS 公网 IPv4,generate_204 返回 HTTP=204 |
| IPv6 出口 | 连接失败 |
| FinalShell | 使用 VPS 公网 IPv4正常登录 |
| 代理浏览器 | Google、TikTok 正常,出口为 VPS 公网 IPv4,无可用公网 IPv6 |
11十一、防止 SSH 被锁死的全过程规则
- 先保存 Cloud Firewall 的 IPv4 SSH 入站规则,再修改 Ubuntu。
- 全程保留一个已连接的 SSH 会话,并用第二个窗口测试新连接。
- FinalShell 直接使用 VPS 公网 IPv4,不使用域名或 IPv6 地址。
- 未确认本地公网 IPv4 固定前,SSH 来源保持
All IPv4。 - 不要把 Inbound Policy 设为
DROP后却不配置TCP 22 / IPv4 / ACCEPT。 - 不要把 Outbound Policy 设为
DROP,除非已建立完整的 IPv4 放行规则。 - 不要通过 SSH 执行
networkctl reconfigure eth0。 - 应用配置和重启前确认 Lish Console 可用,并记住备份目录。
12十二、SSH 无法登录时回滚
通过 Linode Cloud Manager 打开 Lish Console,执行:
sudo sysctl -w net.ipv6.conf.default.disable_ipv6=0
sudo sysctl -w net.ipv6.conf.all.disable_ipv6=0
sudo sysctl -w net.ipv6.conf.lo.disable_ipv6=0
sudo sysctl -w net.ipv6.conf.eth0.disable_ipv6=0
sudo sysctl -w net.ipv6.conf.eth0.autoconf=1
sudo sysctl -w net.ipv6.conf.eth0.accept_ra=1
sudo test -f /etc/sysctl.d/99-disable-ipv6.conf && \
sudo mv /etc/sysctl.d/99-disable-ipv6.conf /etc/sysctl.d/99-disable-ipv6.conf.disabled
sudo test -f /etc/systemd/network/05-eth0.network.d/90-disable-ipv6.conf && \
sudo mv /etc/systemd/network/05-eth0.network.d/90-disable-ipv6.conf \
/etc/systemd/network/05-eth0.network.d/90-disable-ipv6.conf.disabled如果需要恢复备份文件,先把下面的路径替换为第四节记录的实际备份目录,再执行:
fix_backup="/root/ipv6-fix-backup-日期时间"
sudo cp -a "$fix_backup/05-eth0.network" /etc/systemd/network/05-eth0.network
if [ -f "$fix_backup/99-disable-ipv6.conf" ]; then
sudo cp -a "$fix_backup/99-disable-ipv6.conf" /etc/sysctl.d/99-disable-ipv6.conf
fi然后在 Cloud Manager 中:
- 检查 Cloud Firewall,恢复
Inbound Policy: DROP与TCP 22 / All IPv4 / ACCEPT。 - 如果此前关闭了 Network Helper,关闭 VPS 并重新启用当前 VPS 的 Network Helper。
- 保存并启动 VPS。
- 使用 VPS 公网 IPv4重新登录。