Ubuntu 20.04服务器禁用IPv6后网络崩溃的诊断与彻底禁用方案求助
兄弟,我看了你遇到的问题——为了搞定FTP的IPv6连接无法自动 fallback 到IPv4的问题,你用sysctl禁用了IPv6,结果FTP正常了,但服务器每隔40小时左右就网络崩溃,只能重启,而且主机那边还不给排查,确实头疼。先帮你梳理下问题根源,再给你一套彻底解决的方案。
首先明确你的环境:
- 系统:Ubuntu 20.04
- 服务栈:cPanel 106.0.13、PHP 8.1、MySQL 8、LiteSpeed Web Server、Elasticsearch 7.17、Redis 7
- 业务:Magento 2.4.5商店每日通过远程FTP更新商品/库存/价格,IPv6连接不稳定且无法自动切换到IPv4
问题根源分析
从你给出的syslog报错(systemd-networkd-wait-online和nm-online超时)以及未修改的netplan配置来看,核心问题是你用sysctl强制禁用了IPv6,但netplan里还保留着完整的IPv6地址、网关和路由配置。系统的网络服务(比如systemd-networkd)还在持续尝试处理IPv6的网络配置,长时间的配置冲突导致服务资源耗尽,最终引发网络崩溃。
第一步:先做诊断确认
在服务器正常运行时,先执行这些命令确认当前状态,方便定位问题:
检查sysctl的IPv6禁用是否生效:
sysctl net.ipv6.conf.all.disable_ipv6 sysctl net.ipv6.conf.default.disable_ipv6正常应该输出
1,如果不是,执行sudo sysctl -p重新加载配置。查看网卡的IPv6状态:
ip -6 addr show enp3s0f0如果还能看到IPv6地址,说明sysctl的禁用没完全覆盖,或者netplan还在推送IPv6配置。
查看网络服务的状态:
sudo systemctl status systemd-networkd sudo systemctl status NetworkManager看是否有持续的IPv6相关报错(比如路由配置失败、地址获取超时等)。
第二步:彻底禁用IPv6的正确方案
因为Ubuntu 20.04用netplan管理网络,不能只靠sysctl禁用,必须同步修改netplan配置,彻底移除所有IPv6相关设置,否则系统服务会一直和禁用规则冲突。
1. 修改netplan配置文件
你的netplan配置文件在/etc/netplan/目录下(通常文件名类似00-installer-config.yaml),用编辑器打开:
sudo nano /etc/netplan/00-installer-config.yaml
把enp3s0f0的配置修改成完全移除IPv6相关项的版本,注意yaml的缩进必须用2个空格,不能用制表符:
network: version: 2 ethernets: enp3s0f0: accept-ra: false dhcp4: true match: macaddress: fc:34:97:b0:54:57 nameservers: addresses: # 换成IPv4 DNS,避免IPv6 DNS解析问题 - 8.8.8.8 - 8.8.4.4 routes: # 只保留原来的IPv4路由,删掉所有IPv6路由 set-name: enp3s0f0
2. 应用并测试netplan配置
为了避免修改后断网,先执行测试命令:
sudo netplan try
这个命令会应用配置并等待120秒,如果网络出现问题会自动回滚,确认没问题后按回车永久生效。如果测试没问题,再执行:
sudo netplan apply
3. 完善sysctl的禁用规则
除了你原来的两行,再加几个参数确保所有接口都彻底禁用IPv6:
echo "net.ipv6.conf.lo.disable_ipv6 = 1" | sudo tee -a /etc/sysctl.conf echo "net.ipv6.conf.enp3s0f0.disable_ipv6 = 1" | sudo tee -a /etc/sysctl.conf echo "net.ipv6.conf.all.autoconf = 0" | sudo tee -a /etc/sysctl.conf echo "net.ipv6.conf.default.autoconf = 0" | sudo tee -a /etc/sysctl.conf
然后重新加载sysctl配置:
sudo sysctl -p
4. 调整网络服务的等待规则
因为systemd-networkd-wait-online服务默认会等待IPv6网络就绪,现在禁用了IPv6,需要修改服务参数让它忽略IPv6:
sudo systemctl edit systemd-networkd-wait-online
在打开的编辑器中添加以下内容:
[Service] ExecStart= ExecStart=/lib/systemd/systemd-networkd-wait-online --ignore=ipv6
保存退出后,重新加载服务配置并重启服务:
sudo systemctl daemon-reload sudo systemctl restart systemd-networkd-wait-online
第三步:后续观察与排查
做完以上配置后,观察服务器运行情况,如果还是出现网络崩溃:
- 查看
/var/log/syslog和/var/log/daemon.log,找网络相关的报错(比如路由表异常、网卡驱动问题等) - 检查cPanel的网络设置,因为cPanel可能会自动修改网络配置,确保它没有重新启用IPv6
备注:内容来源于stack exchange,提问作者Alex Smith

