AI 创作声明:本系列文章由笔者借助 ChatGPT, Kimi K2, 豆包和 Cursor 等 AI 工具创作,有很大篇幅的内容完全由 AI 在我的指导下生成。如有错误,还请指正。
前言
网络连接是现代桌面的基础功能,涉及硬件驱动、固件加载、网络管理和 DNS 解析等多个环节。
本文将从网卡驱动开始,经过内核网络栈,到达应用层,了解 Linux 网络系统的完整架构,包括如何配置网络连接,如何设置防火墙规则,以及如何诊断各种网络问题。
网络连接与管理
网络连接是现代桌面的基础功能,涉及硬件驱动、固件加载、网络管理和 DNS 解析等多个环节。网络故障是最常见的桌面问题之一,理解其工作原理有助于快速定位和解决连接问题。
1.1 网络架构概览
现代 Linux 桌面大多使用 systemd-networkd 配合 iwd 进行网络管理,形成完整的网络解决方案。
虽然目前仍有部分系统默认使用 NetworkManager 管理网络,用 wpa_supplicant 管理 WiFi, 但这已经不够「现代」了(逃
网络协议栈:
- 硬件层:网卡驱动和固件
- 链路层:MAC 地址管理和链路检测
- 网络层:IP 地址配置和路由管理
- 传输层:TCP / UDP 连接管理
- 应用层:DNS 解析和服务发现
主要组件:
- systemd-networkd:网络接口管理,处理 DHCP 和静态配置
- iwd:无线网络管理,支持 WPA2 / WPA3
- systemd-resolved:DNS 解析和缓存
1.2 网络连接流程
有线网络:
- 内核加载网卡驱动
- 检测链路状态(网线连接)
- systemd-networkd 通过 DHCP 获取 IP 配置
- 配置路由和 DNS
无线网络:
- 加载无线网卡驱动和固件
- iwd 扫描可用网络
- 选择网络并进行认证(WPA2 / WPA3)
- 建立连接后通过 DHCP 获取 IP
网络管理命令:
# 查看接口状态
ip link show
ip addr show
# 无线网络管理(iwd)
iwctl station wlan0 scan
iwctl station wlan0 connect "SSID"
# 网络服务状态
systemctl status systemd-networkd iwd
# DNS 解析测试
resolvectl query example.com
resolvectl status
1.3 IPv4 / IPv6 双栈配置
现代网络正在往 IPv6 迁移的过程中,目前仍有许多站点都只支持 IPv6,因此 IPv4+IPv6 双栈成为一个过渡方案,systemd-networkd 提供完整的双栈支持。
双栈特点:
- IPv4:通过 DHCP 获取配置,32 位地址
- IPv6:通过 Router Advertisement 获取,128 位地址
- 并行工作:两个协议栈同时运行
- IPv6 优先:通常有 IPv6 的会优先走 IPv6 网络,没有才走 IPv4.
- Linux 中通过 glibc 的
getaddrinfo()来实现该逻辑,可通过/etc/gai.conf调整该函数的地址排序算法。因为 APP 通常直接使用第一条记录发起连接,所以/etc/gai.conf通常能直接决定系统中是 IPv6 优先还是 IPv4 优先。
- Linux 中通过 glibc 的
双栈验证:
# 查看 IPv4 配置
ip -4 addr show
ip -4 route
# 查看 IPv6 配置
ip -6 addr show
ping -6 2001:4860:4860::8888
# DNS 双栈测试
nslookup -type=A google.com
nslookup -type=AAAA google.com
1.4 网络故障排查
连接问题诊断流程:
- 硬件层面:
# 检查接口存在
ip link show
# 查看驱动加载
dmesg | grep -i firmware
lspci | grep -i network
- 链路层面:
# 有线:检查链路状态
ethtool eth0
# 无线:扫描网络
iw dev wlan0 scan | grep SSID
- 网络配置:
# DHCP 状态
journalctl -u systemd-networkd
# IP 配置检查
ip addr show dev eth0
# 路由表
ip route
- DNS 解析:
# DNS 配置
resolvectl status
cat /etc/resolv.conf
# 解析测试
dig @8.8.8.8 example.com
nslookup example.com
常见问题与解决:
- 无法获取 IP:检查 DHCP 服务、网线连接、无线密码
- DNS 解析失败:验证 DNS 服务器配置、检查 systemd-resolved 状态
- IPv6 无连接:确认路由器支持 IPv6、检查
IPv6AcceptRA配置 - 连接不稳定:查看信号强度、检查驱动兼容性
防火墙与网络安全
2.1 nftables 防火墙配置
nftables 是现代 Linux 的防火墙解决方案,它提供比 iptables 更简洁的语法和更好的性能。
基本概念:
- 表(Table):包含链和规则的容器
- 链(Chain):规则的有序列表
- 规则(Rule):匹配条件和动作
- 集合(Set):用于批量匹配的地址或端口列表
nftables 的四表五链、规则等概念跟 iptables 是完全一致的,这一部分可以参考我之前的文章iptables 及 docker 容器网络分析, 这里不再赘述。
NixOS 配置示例:
# configuration.nix
networking.nftables = {
enable = true;
ruleset = ''
# 定义表
table inet filter {
# 定义链
chain input {
type filter hook input priority 0; policy drop;
# 允许回环接口
if lo accept
# 允许已建立的连接
ct state established,related accept
# 允许 SSH
tcp dport 22 accept
# 允许 HTTP/HTTPS
tcp dport {80, 443} accept
# 允许 DNS
udp dport 53 accept
tcp dport 53 accept
# 允许 DHCP
udp dport 67 accept
udp dport 68 accept
# 允许 ICMP
icmp type {echo-request, echo-reply, destination-unreachable} accept
ip6 nexthdr icmpv6 icmpv6 type {echo-request, echo-reply, destination-unreachable} accept
}
chain forward {
type filter hook forward priority 0; policy drop;
}
chain output {
type filter hook output priority 0; policy accept;
}
}
'';
};
常用 nftables 命令:
建议继续学习
- 如何拿下简短的域名 (累计阅读 16,863)
- Linux如何统计进程的CPU利用率 (累计阅读 16,204)
- 从输入 URL 到页面加载完成的过程中都发生了什么事情? (累计阅读 15,803)
- 我的 RHCA 之路 (累计阅读 13,924)
- Linux内存点滴 用户进程内存空间 (累计阅读 13,046)
- 自建DNS以防止GFW干扰 (累计阅读 13,023)
- 给程序员新手的一些建议 (累计阅读 13,024)
- Linux 性能监控、测试、优化工具 (累计阅读 12,949)
- 关于linux内存free的一些事情 (累计阅读 12,744)
- ps - 按进程消耗内存多少排序 (累计阅读 12,603)