Ubuntu 20.04在使用时会出现网络不通的情况。由于网络上大量指南教程相互抄袭,让各位排查桌面版本用的NetworkManager
。我这里写一个用于18.04以上版本的Server系统网络故障排查指南。
服务器版Ubuntu使用netplan来管理网络!
netplan可靠性并没有想象中那么完美!
Ubuntu可靠性达不到我能接受的程度!
CentOS已经完蛋了!
RedHat上手有一定的学习成本而且要花钱买!
综上!
你需要学会排查Ubuntu网络问题。
问题现象
192.168.4.33无法访问网络
- Minio所在9001端口无法访问
- SSH无法登录
初步判断
我们进行了跨网段的业务访问,中间经历了
由于访问其他192.168.4.0/24的业务都是正常的,所以我们初步估计的排查点包含上面两个位置。
推荐排查方向
我们将从排查点1进行排查,首先确定机器内外是否正常通信,再判断机器内部是否出现故障。
故障排查点1检查
机器硬盘、内存、CPU占用排查
如果业务无法访问,最大的可能是资源被打爆了
1 2 3 4 5 6
# 检查磁盘占用 df -h # 检查内存占用 free -h # 检查CPU占用 top
磁盘占用可以使用
du -sh *
一层层排查占用最高的文件夹,手动去调整。内存占用则需要
ps aux | head -1;ps aux |grep -v PID |sort -rn -k +4 | head -20
查看占用前20的进程,可以针对性的KILL掉。CPU占用则直接根据top显示情况KILL进程。
检查VPN或SDN是否正常
如果你在云上有机器但需要连接到本地局域网络的需求,会用到这个。
常见的开源实现包括OpenVPN、WireGuard、ZeroTier等,如果你有这些网络工具,请根据对应工具手册进行排查。
ping检测
1
ping 192.168.4.33
确保ICMP协议没有被阻拦,检查能否ping通。
路由排查
1
ip route show
检查路由是否正常,是否设置网关,是否存在阻断等。如果存在路由问题,请编辑路由,或根据日志排查出路由被编辑的原因。
临时关闭防火墙
1 2 3 4
# 查看当前ufw状态 ufw status # 关闭ufw ufw disable
临时关闭防火墙,再次访问故障业务端口,检查是否能够正常访问,这一步排除防火墙的影响。
如果使用了Docker等容器产品,可能ufw已经被这些产品关闭,注意在关闭防火墙前检查一下
ufw status
,确保关闭防火墙前的状态,不要影响到其他产品的状态。使用Python HTTP服务器测试其他端口是否能够正常访问
1
python3 -m http.server --bind 0.0.0.0 10001
10001
端口如果被占用可以使用其他未被占用的端口。防火墙应当仍处于关闭状态。 这一步和第一步排查的区别在于:
- ICMP 属于网络层协议,工作在IP数据报层。
- TCP/UDP 属于传输层协议,工作在IP层之上。
- ICMP 常用于网络层核心功能。
- TCP/UDP 用于应用层程序间通信。
在公网环境中,有可能存在某些中间设备禁止ICMP报文的情况,为了适应这种情况,我们一般会多检查一次应用层。
检查网卡配置问题
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
user@archive-deployments:~$ ip addr 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000 link/ether 00:15:5d:03:41:10 brd ff:ff:ff:ff:ff:ff inet 192.168.4.33/24 brd 192.168.4.255 scope global eth0 valid_lft forever preferred_lft forever inet6 fe80::215:5dff:fe03:4110/64 scope link valid_lft forever preferred_lft forever 3: br-95073cd31fb9: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default link/ether 02:42:91:58:9c:d0 brd ff:ff:ff:ff:ff:ff inet 172.24.0.1/16 brd 172.24.255.255 scope global br-95073cd31fb9 valid_lft forever preferred_lft forever inet6 fe80::42:91ff:fe58:9cd0/64 scope link valid_lft forever preferred_lft forever 4: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default link/ether 02:42:5d:ff:24:62 brd ff:ff:ff:ff:ff:ff inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0 valid_lft forever preferred_lft forever inet6 fe80::42:5dff:feff:2462/64 scope link valid_lft forever preferred_lft forever 6: veth423d5b3@if5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master br-95073cd31fb9 state UP group default link/ether b2:e5:1e:12:c2:cb brd ff:ff:ff:ff:ff:ff link-netnsid 0 inet6 fe80::b0e5:1eff:fe12:c2cb/64 scope link valid_lft forever preferred_lft forever 10: veth1e84c8b@if9: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default link/ether 4e:56:51:b2:c2:c2 brd ff:ff:ff:ff:ff:ff link-netnsid 2 inet6 fe80::4c56:51ff:feb2:c2c2/64 scope link valid_lft forever preferred_lft forever
这里注意观察
eth0
网卡的IP地址、MAC地址、网关和子网掩码,确保没有错误。如果机器是虚拟机,请在宿主机或者管理平台检查对应的网卡IP地址、MAC地址、VLAN等是否存在差异。
动态IP的情况
对于动态IP的情况,我在其他集群环境里遇到过IP丢失的问题。这种情况一般需要重启netplan或者重新配置netplan配置文件。
配置路径在
/etc/netplan/00-installer-config.yaml
里,注意这里的文件名可能不同。修改完配置重启netplan,重新执行
netplan apply
。另外,需要检查
dhclient
是否正常。网卡eth0丢失的情况
如果机器是虚拟机,请检查宿主机的网卡是否正确挂载
如果机器是实体机,请更换网卡确保PCIE接口没有问题,同时将换下来的卡插在其他设备上测试确保网卡正常
如果上述排查没有问题,继续检查netplan
故障排查点2检查
一般情况下问题都出现在故障点1,经过上面的排查就可以基本解决问题了,但如果系统内部经常有访问
当对外排查正常无误时,一般需要排查应用是否正常。
能访问的理由只能是配置无误,但故障的理由却是各有各的不同,这里我只能提供一些最基础的排查方案,后续则可以根据基础排查的现象和结果进行进一步筛查。
检查端口占用
1
lsof -i:端口号
如果业务对外的端口占用没有输出或输出的IP不对,请检查
应用是否正确绑定了网卡
进程是否仍然在运行。一些可能的情况是在开发时错误的绑定了
127.0.0.1:端口号
,或者绑定到了其他端口号上,具体情况需要根据日志和配置文件进行详细检查。如果使用Docker,请仔细检查内部的监听端口和外部的暴漏端口是否能够正确对应,以及对外暴漏端口绑定的网卡是否正确。
容器内的业务是否绑定到机器名或域名上,但对应机器名或域名没有在DNS上绑定到外部IP。
一般常见于WEB业务,比较明显的现象是浏览器跳转到了某一个特殊的域名,并且这个域名无法访问。
应用出现错误
例如之前在某台机器上使用Docker部署
Atlassian Jira
和Atlassian Confluence
,跑一周左右,Docker后台进程会出现无响应状态,通过外部端口管理该Docker或通过内部Socket管理该Docker均提示Docker操作超时。这种情况需要考虑重启Docker以及内部的容器业务来解决。
其他可能的情况
- 驱动问题。查看
dmesg
日志,试着更新驱动版本。 - 网卡工作模式不正确。某些虚拟网卡需要设置为
bridge
模式才能通信。 - selinux。可以使用
setenforce 0
设置临时关闭selinux测试。 - 其他内核参数问题,如禁用了ICMP重定向等。
- 与虚拟化环境相关的网络配置问题。
排查时先检查网卡硬件状态,然后确认IP和路由配置,最后可以查看日志获得更多信息。