Featured image of post Linux设备上网原理与故障排查指南

Linux设备上网原理与故障排查指南

点击后跳出打印窗口 打印机选择打印为PDF

网络分层模型(5 层 / 7 层)

  • 物理层(Physical):负责比特流的传输与电气/光学信号转换。典型硬件包括网线、光纤、网络接口卡、集线器等;软件层面主要由驱动程序与固件控制信号发送。
  • 数据链路层(Data Link):在同一局域网内建立可靠链路,处理 MAC 地址、帧校验。硬件设备如交换机、网桥;对应软件是网卡驱动、内核中的以太网协议栈(如 Linux 的 eth 、bridge 模块)。
  • 网络层(Network):负责跨网络的寻址与路由(IP 协议)。硬件侧通常是三层交换机、路由器;软件侧包括操作系统的 IP 协议栈、路由表、ip 命令、iptables 等。
  • 传输层(Transport):提供端到端的传输控制(TCP、UDP)。主要由操作系统内核中的传输层实现,常见软件组件包括 socket API、netstat 、ss 。
  • 会话层(Session):管理会话、连接维护与同步,在现代实现里多由应用协议或中间件处理,如 RPC 框架、会话管理库。
  • 表示层(Presentation):负责数据格式、加密与解密,如 TLS/SSL、字符编码转换。对应软件包括OpenSSL、GnuTLS、序列化库(JSON、ProtoBuf)。
  • 应用层(Application):直接面向用户的网络应用协议,如 HTTP、SSH、FTP;对应软件是浏览器、SSH 客户端、数据库客户端等。
    说明:实际工程常使用 TCP/IP 5 层模型,将会话层与表示层合并到应用层。理解各层能帮助在故障排查时快速定位是物理问题、网络层问题还是应用配置问题。

上网原理概述

  • 网络接口:设备的有线网卡或无线网卡负责发送与接收数据,必须具备正确的硬件状态与驱动支持。
  • 数据链路:层通过网线、无线电波连接交换机、路由器等网络设备,形成局域网。
  • 网络层:使用 IP 协议,设备需要正确的 IP 地址、子网掩码和默认网关,才能与其他主机通信。
  • 传输层:常见的 TCP、UDP 协议负责提供可靠或快速的数据传输通道。
  • 应用层:浏览器、SSH、数据库客户端等具体应用通过网络协议访问远程服务。
  • DNS 与路由:DNS 负责将域名解析为 IP 地址;路由器根据路由表决定数据包转发路径,最终达到目标服务器或互联网。

各层常见故障与排查

物理层

  • 可能故障:电源中断、网线损坏、光模块松动、接口未插紧、无线开关关闭。
  • 观察与判定: 电源灯常亮或缓慢闪烁代表供电稳定;熄灭或快速闪烁为异常。
    网卡 Link/Act 灯常亮并伴随闪烁表示接通且有流量;全暗或变红说明物理链路断开。
    常见指示规律:“常亮=链路建立、闪烁=有流量”。百兆网口多为黄色/橙色常亮表示 100 Mbps 链路、绿色闪烁代表数据传输;千兆网口通常绿灯常亮表示 1000 Mbps 正常联通、黄灯/另一盏灯闪烁表示实时流量。
    若网线内部双绞对接错(例如部分线芯反接),常见现象是指示灯间歇亮灭、链路速率降到 10/100 Mbps、ethtool 显示大量 Tx/Rx errors 或 CRC 错误,数据传输极慢。标准 T568B 线序由 1 到 8 依次为:白橙、橙、白绿、蓝、白蓝、绿、白棕、棕;T568A 则为白绿、绿、白橙、蓝、白蓝、橙、白棕、棕。可使用网线测试仪检测八芯对应关系,或更换一根合格网线验证。
  • 排查步骤:重新插拔电源、确认插座或 UPS 供电;检查网线卡扣并尝试更换另一根线或端口;无线适配器按下硬件开关或功能键(如 Fn+F5)。
  • 解决建议:替换损坏线缆/光纤、修复或更换异常端口;必要时重启交换机/路由器;为易松动的接口配固定卡扣。

数据链路层

  • 可能故障:网卡未启用、驱动缺失、MAC 地址冲突、交换机 VLAN 配置错误。
  • 观察与判定: ip link show 显示接口 state DOWN 或接口未列出。
    dmesg 出现 device not found 、firmware missing 、Tx timeout 等信息。
    局域网内其他主机的 arp -a 中没有该主机 MAC,或提示冲突。
  • 排查步骤: sudo ip link set <接口> up 尝试启用;若失败继续排查。 lspci | grep -i ethernet 、lsusb | grep -i wireless 确认硬件被识别。
    dmesg | grep -i <接口> 检查驱动加载消息,必要时安装/更新内核模块(如 sudo modprobe e1000e )。
    与网络管理员核实交换机端口 VLAN/Trunk 配置是否正确。
  • 解决建议:重新安装驱动或固件、升级内核、调整 VLAN;若网卡故障则更换硬件。

网络层

  • 可能故障:IP/子网掩码/网关配置错误、DHCP 故障、路由缺失或错误、IP 冲突。

  • 观察与判定:

    • ip addr show 无 inet 地址或出现 169.254.x.x 。
    • ip route 缺少 default 网关或指向无效接口。
    • ping 同网段设备失败但物理层正常。
    • 能 ping 小包却无法传输大报文、HTTPS/SSH 连接容易超时,常见于 MTU 设置过小或被PPPoE/隧道额外封装压缩。
    • ip netns list 显示存在网络命名空间,或 ip -br addr 只在特定命名空间内可见接口,提示可能被容器/虚拟化隔离导致主命名空间无法访问。
  • 排查步骤:

    • 确认网络管理工具:

      • NetworkManager: systemctl is-active NetworkManager 为 active ; nmcli general status 能返回状态。
      • Netplan: ls /etc/netplan/ 有 YAML 文件; sudo netplan status 可查看当前配置。
      • systemd-networkd: systemctl is-active systemd-networkd 为 active ;配置在/etc/systemd/network/ 。
      • ifupdown(传统脚本):Debian/旧版 Ubuntu 使用 /etc/network/interfaces ,可用ifquery –list 查看。
      • 多个工具同时运行:如果 systemctl 显示 NetworkManager 和 systemd-networkd 均为active ,或 Netplan 配置与 NetworkManager 同时存在,可能出现互相覆盖,应决定保留其一,并停用/禁用其他服务(如 sudo systemctl disable –now systemd-networkd )。
      • 都未运行:若所有管理工具均显示 inactive ,网络接口可能由手工脚本或容器化平台接管。可临时使用 sudo ip addr add 、sudo ip route add 手动设定,并确认是否有网管脚本(如/etc/rc.local 、/usr/local/bin/*.sh )或云平台代理。
      • DHCP 请求被拒绝: sudo dhclient -v 输出包含 DHCPREQUEST on <接口> 后接 DHCPNAK 、No DHCPOFFERS received ,或 NetworkManager 日志出现 dhcp4 (接口): request denied 。此时说明网络联通正常但服务器拒绝分配地址,可临时配置静态 IP 保持通信,并将日志截图、MAC 地址与所需网段提交给 DHCP 管理员排查(检查地址池、认证策略、保留 IP 冲突等)。
    • 针对工具核对配置:

      • NetworkManager: nmcli dev show <接口> 、nmcli connection show 查看 IP、网关、DNS;必要时用 nm-connection-editor 或 nmcli connection edit 调整。

        • 命令方式设置静态 IP,参考脚本:
          1
          2
          3
          4
          5
          6
          
          nmcli connection modify <连接名> \
          ipv4.method manual \
          ipv4.addresses 192.168.1.10/24 \
          ipv4.gateway 192.168.1.1 \
          ipv4.dns "8.8.8.8 114.114.114.114"
          nmcli connection up <连接名>
          
        • 配置文件方式:编辑 /etc/NetworkManager/system-onnections/<连接名>.nmconnection ,可参考模板:
          1
          2
          3
          4
          5
          6
          7
          8
          9
          
          [connection]
          id=<连接名>
          type=ethernet
          [ipv4]
          method=manual
          addresses1=192.168.1.10/24,192.168.1.1
          dns=8.8.8.8;114.114.114.114
          [ipv6]
          method=ignore
          
          保存后执行 sudo nmcli connection reload && sudo nmcli connection up <连接名> 。
      • Netplan:编辑 /etc/netplan/*.yaml 中的 addresses 、gateway4 、nameservers ,执行 sudo netplan apply 或 sudo netplan try 。

        • 命令方式,参考脚本:
          1
          2
          3
          4
          5
          6
          
          sudo netplan set \
              network.ethernets.eth0.addresses=[192.168.1.10/24] \
              network.ethernets.eth0.gateway4=192.168.1.1 \
              network.ethernets.eth0.nameservers.addresses=
          [8.8.8.8,114.114.114.114]
          sudo netplan apply
          
        • 配置文件方式:在 YAML 中手工填写,模板示例:
           1
           2
           3
           4
           5
           6
           7
           8
           9
          10
          11
          12
          
          network:
              version: 2
              renderer: NetworkManager
              ethernets:
                  eth0:
                      addresses:
                          - 192.168.1.10/24
                      gateway4: 192.168.1.1
                      nameservers:
                          addresses:
                              - 8.8.8.8
                              - 114.114.114.114
          
          保存后运行 sudo netplan apply 。
      • ifupdown:查看 /etc/network/interfaces ,用 sudo ifdown <接口> && sudo ifup <接口> 让配置生效

        • 命令方式:临时运行 sudo ip addr add 192.168.1.10/24 dev eth0 、sudo ip route add default via 192.168.1.1 、在 /etc/resolv.conf 中写入 nameserver 8.8.8.8 ,重启后需重新配置。
        • 配置文件方式:在 /etc/network/interfaces 中添加,模板示例:
          1
          2
          3
          4
          5
          6
          
          auto eth0
          iface eth0 inet static
              address 192.168.1.10
              netmask 255.255.255.0
              gateway 192.168.1.1
              dns-nameservers 8.8.8.8 114.114.114.114
          
          保存后执行 sudo ifdown eth0 && sudo ifup eth0 。
    • DHCP: sudo dhclient -v <接口> ,关注是否收到 bound 日志;若 No DHCPOFFERS received ,检查 DHCP 服务或接入网络。若需恢复自动获取,可按所用工具配置成 DHCP 模式:

      • NetworkManager:编辑 /etc/NetworkManager/system-connections/<连接名>.nmconnection ,在 [ipv4] 段写入:
        1
        2
        3
        
        [ipv4]
        method=auto
        ignore-auto-dns=false
        
        保存后执行 sudo nmcli connection reload && sudo nmcli connection up <连接名> 。
      • Netplan:
        1
        2
        3
        4
        5
        6
        
        network:
            version: 2
            renderer: NetworkManager
            ethernets:
                eth0:
                    dhcp4: true
        
        保存后 sudo netplan apply 。
      • systemd-networkd:
        1
        2
        3
        4
        5
        
        [Match]
        Name=eth0
        
        [Network]
        DHCP=yes
        
        保存到 /etc/systemd/network/10-eth0.network 后 sudo systemctl restart systemdnetworkd
      • ifupdown:
        1
        2
        
        auto eth0
        iface eth0 inet dhcp
        
        写入 /etc/network/interfaces ,执行 sudo ifdown eth0 && sudo ifup eth0
    • 静态 IP:结合上一步确认的管理工具核对配置文件;应用后再查 ip addr 确认生效。

    • 路由: ip route get 8.8.8.8 确认出接口;必要时 sudo ip route add default via <网关> 。

    • MTU:使用 ping -M do -s 1472 8.8.8.8 测试是否出现 Frag needed ,或对比 ip link show <接口> 的 mtu 值;若存在隧道/PPPoE,可将 MTU 调小(如 1492/1450)并在配置文件中同步更新。

    • 命名空间隔离:若接口位于容器或 ip netns 环境,需进入对应命名空间( ip netns exec bash )检查配置,或调整 CNI/容器网络策略将接口暴露到宿主。

    • IP 冲突: arping <本机IP> 或 ip monitor neigh 观察是否收到冲突提示。

    • DHCP 被拒场景:联系 DHCP 管理员检查地址池是否耗尽、MAC 是否被限制、租约是否过期;必要时先配置临时静态 IP 保持联通,并记录 dhclient 输出、交换机端口信息,便于服务器侧解除限制或调整策略。

传输层

  • 可能故障:防火墙阻断、端口未监听或被占用、NAT 映射异常、连接被中途重置。
    • 观察与判定:
      • ss -tulpn / netstat -tulpn 查看监听端口与进程。
      • ufw status 、sudo iptables -L -n -v 显示有拒绝策略。
      • telnet / nc 到目标端口失败,但 ping 正常。
    • 排查步骤:
      • 临时关闭/放宽防火墙( sudo ufw disable 、sudo systemctl stop firewalld )验证是否为规则引起。
      • 检查 NAT/端口映射设置;在路由器或防火墙控制台查看转发表。
      • 使用 nc -vz <主机> <端口> 或 curl -I 验证端口连通;关注服务器日志是否出现 connectionreset
    • 解决建议:开放必要端口、调整 NAT 映射、释放被占用端口或修改服务端口、对路由器升级固件或重启。

会话层

  • 可能故障:会话超时、认证失败、VPN 隧道未建立、会话保持配置错误。
  • 观察与判定:
    • PN 客户端提示 auth failed 、 TLS handshake failed 或频繁掉线。
    • SSH、数据库等长连接频繁中断并报 connection reset by peer 。
    • 日志出现 session expired 、 token invalid 、 keepalive timeout 。
  • 排查步骤:
    • 确认系统时间与服务器同步( timedatectl 、 ntpstat )。若需要手动调整,可使用:

      1
      2
      
      sudo timedatectl set-timezone Asia/Shanghai
      sudo timedatectl set-time "2025-01-01 12:00:00"
      

      判断当前 NTP 服务由谁管理,可通过:

      1
      2
      3
      4
      5
      6
      
      timedatectl | grep "System clock synchronized"
      timedatectl show --property=NTPSynchronized
      systemctl list-units | grep -E 'ntp|chrony|timesync'
      systemctl status systemd-timesyncd
      systemctl status chronyd
      systemctl status ntpd
      

      哪个服务处于active (running)状态,通常即为当前同步源。
      检查时间服务器可达性,可以先ping ntp.aliyun.comdig ntp.aliyun.com 验证解析,再用ntpdate -q ntp.aliyun.comchronyc sources -n 观测延迟/偏差;必要时确认防火墙已放行UDP/123。
      systemd-timesyncd 正常与否可通过 timedatectl timesync-statusjournalctl -u systemd-timesyncd 查看;chrony 使用 chronyc trackingchronyc sources;若是传统 ntpd,可运行ntpq -p
      将系统加入 NTP 同步,步骤示例(systemd-timesyncd):

      1
      2
      3
      4
      5
      6
      7
      8
      
      sudo timedatectl set-ntp true
      # 或编辑 /etc/systemd/timesyncd.conf 指定上游:
      sudo tee /etc/systemd/timesyncd.conf <<'EOF'
      [Time]
      NTP=ntp.aliyun.com ntp.tencent.com
      FallbackNTP=time.windows.com time.google.com
      EOF
      sudo systemctl restart systemd-timesyncd
      

      对使用 chrony 的系统,可在 /etc/chrony.conf 添加:

      1
      2
      
      server ntp.aliyun.com iburst
      server ntp.tencent.com iburst
      

      保存后 sudo systemctl restart chronyd。完成后再次运行 timedatectlchronyc sources验证同步状态。
      传统 ntpd (ntpq) 配置示例可编辑 /etc/ntp.conf

      1
      2
      3
      4
      5
      6
      7
      
      driftfile /var/lib/ntp/ntp.drift
      restrict default kod nomodify notrap nopeer noquery
      restrict 127.0.0.1
      restrict ::1
      server ntp.aliyun.com iburst
      server ntp.tencent.com iburst
      server time.google.com iburst
      

      保存后执行 sudo systemctl restart ntpd,再通过 ntpq -p检查对时状态。
      常用时间服务器示例:

      • 国内: ntp.aliyun.comntp.tencent.comntp.ntsc.ac.cn (授时中心)、cn.pool.ntp.org
      • 海外: time.google.comtime.cloudflare.comtime.windows.compool.ntp.org
    • 查看 VPN/SSH/中间件日志(如 /var/log/openvpn.logjournalctl -u sshd )。

    • 检查会话保持配置:TCP keepalive、反向代理的超时时间、负载均衡的健康检查。

    • 若涉及安全设备策略,与管理员确认会话时长限制。

  • 解决建议:同步时间、更新凭证或口令、调高超时阈值、修正 VPN/代理配置。

表示层

  • 可能故障:证书过期/不受信任、加密套件不匹配、字符编码错误、压缩包损坏。
  • 观察与判定:
    • HTTPS 或 TLS 客户端报SSL certificate problem、浏览器提示证书无效。
    • 日志包含unsupported cipherbad record mac、编码转换异常。
  • 排查步骤:
    • openssl s_client -connect <主机>:443 检查证书链、有效期、协商的加密套件。
    • 确认系统信任库(/etc/ssl/certs)中存在根证书;必要时更新 CA 包。
    • 针对数据交换格式,使用iconvjqxmllint等工具验证内容合法性。
  • 解决建议:续签或替换证书、统一 TLS 版本与加密套件、修正编码/序列化逻辑、确保双方使用兼容的压缩方案。

应用层

  • 可能故障:服务未启动、配置错误、资源耗尽、依赖不可用、程序 BUG。
  • 观察与判定:
    • systemctl status <服务>显示failedinactive或进程不断重启。
    • 应用日志出现connection refusedpermission deniedcannot connect to database等。
    • top/htop显示 CPU、内存或磁盘耗尽。
  • 排查步骤:
    • 查看 journalctl -u <服务> 与应用自身日志(如/var/log/nginx/error.log/var/log/mysql/error.log )。
    • 使用应用提供的自检命令( nginx -t 、 named-checkconf 、 mysqladmin ping )。
    • 检查配置文件语法、路径、权限;确认依赖服务是否可达。
    • 通过 systemctl restart <服务> 测试恢复情况,必要时启用 debug 日志。
  • 解决建议:修正配置或权限、扩容资源、更新或回滚软件版本、修复程序 BUG、保障依赖组件稳定。

综合排查流程(按层推进)

  • 明确故障现象:记录目标地址、时间点、错误提示,确保排查有方向。
  • 物理层 → 数据链路层 → 网络层 → 传输层 → 会话层 → 表示层 → 应用层,逐级排除,勿跳层。
  • 每完成一层排查即进行测试(如重新 ping、访问服务),若问题解决及时记录;若未解决,再进入上一层。
  • 过程中保留命令输出与日志截图,方便回溯或向同事/厂商求助。

常用命令速查

  • 物理/链路:ip link showethtool <接口>lspcilsusbdmesg
  • 网络层:ip addrip routearp -adhclient
  • 传输层:ss -tulpnnetstat -anufw statusiptables -L -n -v
  • 会话层:journalctl -u sshd 、VPN客户端日志、timedatectlntpstat
  • 表示层:openssl s_clientcurl -viconv
  • 应用层:systemctl statusnginx -tmysqladmin pingtail -f <日志>

故障分析习惯与建议

  • 先处理最可能的简单问题,再深入复杂层级,避免误判。
  • 每次仅修改一项并立即验证,防止连续改动导致问题叠加。
  • 将排查过程、结果与最终方案记录成文档或脚本,方便下次复用。
  • 对关键服务建立监控、日志告警与定期巡检,提前发现异常。

常见“假性故障”示例

  • 无法 SSH:误以为网络断开,实则服务器未安装或未启动sshd,或禁止密码登录。可通过进程与端口(systemctl status sshdss -tnlp | grep 22) 验证。
  • PING不通:部分服务器禁用 ICMP 或被防火墙丢弃,但 TCP/HTTP 访问正常。遇到ping超时时,可以改用curlnctraceroute检查。
  • DNS 解析失败:手动修改/etc/resolv.conf后仍被 NetworkManager/Netplan覆盖,看似DNS不可用。
    • JelinaOS:
       1
       2
       3
       4
       5
       6
       7
       8
       9
      10
      11
      12
      13
      14
      15
      
      cat >$ROOTFS/etc/resolvconf.conf <<EOF
      resolv_conf=/etc/resolv.conf
      resolvconf=NO
      EOF
          chmod 644 $ROOTFS/etc/resolvconf.conf
      # avoid dhclient edit resolv.conf
          mkdir -p $ROOTFS/etc/dhcp/dhclient-enter-hooks.d/
          cat >$ROOTFS/etc/dhcp/dhclient-enter-hooks.d/nodnsupdate <<EOF
      make_resolv_conf() {
          :
      }
      EOF
          chmod 755 $ROOTFS/etc/dhcp/dhclient-enter-hooks.d/nodnsupdate
      ln -sf '../run/systemd/resolve/stub-resolv.conf' $rootfs/etc/resolv.conf
      ln -srf /run/systemd/resolve/stub-resolv.con
      
  • 网页打不开:浏览器提示证书错误或 403,误判为网络故障。实际是 HTTPS 证书过期、自签名未导入、或账号权限不足。
  • 端口扫描无响应:认为目标离线,但服务绑定在特定内网 IP 或只允许白名单访问。核对服务监听列表与防火墙规则。
使用 Hugo 构建
主题 StackJimmy 设计