注意,该页面使用了较多mermaid渲染图,图片加载可能较慢,不影响文字。

SOVOS今天在折腾他的旧电脑。他家里有一台十年前的电脑啊非常地古老但是里面有一个非常珍贵的1TB机械硬盘啊可以拿来玩。反正就是不用白不用,不如拿来丢到桌子底下当个服务器玩。之前呢装的是debian,但是SOVOS最近需要用的一个工具需要ubuntu于是SOVOS就把笔记本电脑的系统给弄成ubuntu了。

1. 上网流程

1.1. 从两台机器开始

首先我得说一下上网流程。由于我学习的顺序非常混乱,所以我的博客写的顺序也非常混乱,我尽量按“网络为什么会一步步变复杂”的逻辑来厘清。

最简单的网络是什么样的?其实就是两台机器拿一根网线连起来。A 想给 B 发数据,B 想给 A 回数据,只要两边能听懂彼此的数据格式,这件事就结束了。

但是问题马上就来了:如果不是两台机器,而是三台、十台、一百台机器呢?总不能每两台机器之间都拉一根线吧。nn 台机器两两相连需要大约 n(n−1)2\frac{n(n-1)}{2} 根线,机器一多,线就会变成灾难。

所以人们很自然地想到:能不能把大家都接到一个“中间人”上?

graph TD
    A[主机 A] --- D[交换机 D]
    B[主机 B] --- D
    C[主机 C] --- D

于是就出现了类似上图这样的结构。ABC 三台主机都连接到 D 上,D 负责把数据转发给正确的机器。这个 D 就是交换机。

交换机大致工作在“同一个局域网内部”。你可以先把它理解成一个很聪明的插线板:大家都插在它上面,但它不是把所有数据都广播给所有人,而是会学习每个接口后面连接着谁,然后尽量把数据只转发给目标机器。

那么问题又来了:A 怎么知道自己要找的是 B 呢?在网络里,每台机器需要有一个地址。

1.2. IP 地址:机器在网络里的地址

在 IPv4 情况下,计算机能够拿来使用的地址是一个 32 位二进制数。为了方便人们阅读,它通常被分成 4 个 8 位数字,然后用点隔开,写起来就像这样:最小的是 0.0.0.0,最大的是 255.255.255.255。

比如在一个局域网里,可能有这样的地址:

  • A:192.168.1.2
  • B:192.168.1.3
  • C:192.168.1.4

这样 A 想访问 B 的时候,就可以说:“我要找 192.168.1.3。”交换机再帮它把数据送过去。

不过这里要注意:交换机本身并不是靠 IP 地址来转发以太网帧的,真正底层还会涉及 MAC 地址、ARP 等东西。为了先理解“上网流程”,这里可以先把它粗略理解成:同一个局域网内的机器,只要知道彼此的地址,就可以互相通信。

1.3. DNS:人不想背 IP 地址

现在机器之间终于可以互相访问了,但新的问题又出现了:IP 地址对于人类来说太难记了。

比如你肯定不想每天背一串数字去访问网站。于是人们发明了域名。相比 142.250.xxx.xxx 这种地址,www.google.com、www.baidu.com、www.bilibili.com 显然更适合人类记忆。

但是计算机最终通信时还是要找 IP 地址。也就是说,当你输入一个域名时,系统需要先知道:这个域名对应哪个 IP 地址?

负责回答这个问题的,就是 DNS 服务器。

sequenceDiagram
    participant U as 用户
    participant PC as 电脑
    participant DNS as DNS 服务器
    participant WEB as 目标服务器

    U->>PC: 输入 www.example.com
    PC->>DNS: 查询 www.example.com 的 IP
    DNS-->>PC: 返回 93.184.216.34
    PC->>WEB: 使用 IP 访问目标服务器
    WEB-->>PC: 返回网页数据

DNS 服务器和网络中的其他主机本质上也是一台机器,只不过它经常被别人问:

欸,www.example.com 对应的 IP 地址是多少?

它回答之后,你的电脑再拿着查到的 IP 地址去真正访问目标服务器。

所以一次最简化的访问流程可以理解为:

  1. 用户输入域名,比如 www.example.com。
  2. 电脑先去问 DNS:这个域名的 IP 是多少?
  3. DNS 返回一个 IP 地址。
  4. 电脑再向这个 IP 地址发送数据。

到这里,我们已经有了局域网、交换机、IP 地址和 DNS。看起来一切都挺美好,但如果世界上所有机器都放在同一个大网络里,问题会变得非常恐怖。

1.4. 为什么需要多层网络

如果全世界所有电脑都接在一个巨大的交换机网络里,会发生什么?

首先,规模会非常夸张。交换机需要记住海量设备的位置,广播类流量也可能被放大到不可接受。其次,管理也会非常混乱。学校、公司、家庭、机房不可能全都挤在同一个“平面”里。

还有一个非常现实的问题:IPv4 地址不够用。

IPv4 总共只有 32 位,理论上最多也就大约 2322^{32} 个地址,也就是 43 亿左右。这个数字看起来很大,但考虑到全球人口、手机、电脑、服务器、摄像头、路由器、各种 IoT 设备,就完全不够用了。

于是网络逐渐变成了分层结构:

  • 家里的设备组成一个家庭局域网。
  • 学校的设备组成校园网。
  • 公司有公司的内网。
  • 这些网络再通过更上层的网络互相连接。
graph TD
    subgraph Home[家庭局域网 192.168.1.0/24]
        Phone[手机]
        Laptop[电脑]
        Pad[平板]
    end

    subgraph School[校园网]
        S1[教学楼设备]
        S2[宿舍设备]
    end

    subgraph Company[公司内网]
        C1[办公电脑]
        C2[内部服务器]
    end

    Home --> ISP[运营商 / 上级网络]
    School --> ISP
    Company --> ISP
    ISP --> Internet[互联网]

这时就需要一个新的设备:路由器。

1.5. 路由器:连接不同网络的设备

交换机主要负责同一个局域网内部的通信,而路由器负责连接不同的网络。

比如你家里可能有这样一个网络:

  • 手机:192.168.1.10
  • 电脑:192.168.1.11
  • 平板:192.168.1.12
  • 路由器在内网的地址:192.168.1.1

这些设备都在家里的局域网里。它们互相访问时,可以在局域网内部完成。

但如果你的电脑想访问外面的服务器,比如 www.example.com,它会发现:目标 IP 地址不在我这个局域网里。那怎么办?

答案是:把数据交给路由器,让路由器帮我转发出去。

所以路由器通常至少有两个“方向”的接口:

  • 一个接口面向内网,比如家庭局域网,地址可能是 192.168.1.1。
  • 一个接口面向外网,比如运营商网络,地址由运营商分配。
graph LR
    subgraph LAN[家庭局域网]
        PC[电脑<br/>192.168.1.23]
        Phone[手机<br/>192.168.1.10]
        GW[路由器内网口<br/>192.168.1.1]
    end

    ISP[运营商网络]
    Internet[互联网服务器<br/>www.example.com]

    PC --- GW
    Phone --- GW
    GW --- ISP
    ISP --- Internet

内网设备访问外网时,数据大致会经过这样的路径:

  1. 电脑发现目标不在本地局域网。
  2. 电脑把数据发给默认网关,也就是路由器的内网地址。
  3. 路由器收到数据后,根据自己的路由表决定往哪里转发。
  4. 数据经过更多路由器,一跳一跳到达目标服务器。
  5. 目标服务器返回数据,数据再沿着网络回到你的路由器。
  6. 路由器再把数据交还给内网里的电脑。

这里的“默认网关”非常重要。

1.6. 网段和子网掩码:怎么判断对方是不是“自己人”

电脑怎么知道一个目标 IP 是不是在同一个局域网里?这就需要子网掩码。

比如一台电脑的配置是:

  • IP 地址:192.168.1.23
  • 子网掩码:255.255.255.0

255.255.255.0 的意思是:前 24 位是网络部分,后 8 位是主机部分。所以它也常写成:

1
192.168.1.23/24

这个 /24 就表示前 24 位是网络号。

在这个配置下,192.168.1.23/24 所在的网段是:

1
192.168.1.0/24

这个网段里常见的可用主机地址大致是:

1
192.168.1.1 ~ 192.168.1.254

其中:

  • 192.168.1.0 通常表示这个网段本身。
  • 192.168.1.255 通常是这个网段的广播地址。
  • 中间的地址可以分配给具体设备。

所以如果电脑要访问 192.168.1.50,它一算,发现对方也在 192.168.1.0/24 里,那就认为这是“自己人”,可以在局域网内部找它。

如果电脑要访问 8.8.8.8,它一算,发现这个地址不在 192.168.1.0/24 里,那就认为这是“外面的人”,需要交给网关。

flowchart TD
    Start[电脑准备访问一个目标 IP] --> Check{目标 IP 是否属于<br/>192.168.1.0/24?}
    Check -- 是 --> Local[在局域网内直接寻找目标]
    Check -- 否 --> Gateway[交给默认网关<br/>192.168.1.1]
    Gateway --> Router[路由器继续向外转发]

1.7. 网关:通往外部网络的门

网关可以理解成“离开当前网络时要走的门”。

在家庭网络里,网关通常就是路由器的内网地址,比如:

1
192.168.1.1

于是你的电脑可能有这样的网络配置:

1
2
3
4
IP 地址:192.168.1.23
子网掩码:255.255.255.0
默认网关:192.168.1.1
DNS 服务器:192.168.1.1 或 其他 DNS 地址

当电脑访问 192.168.1.50 时,发现对方和自己在同一个网段,就直接在局域网里找。

当电脑访问 8.8.8.8 时,发现对方不在同一个网段,就把数据发给默认网关 192.168.1.1,让路由器继续转发。

所以默认网关本质上就是:

当我不知道这个包该直接发给谁时,就先交给它。

1.8. NAT:很多内网设备共用一个外网地址

这里还有一个常见现象:家里那么多设备,为什么它们都能上网?难道每个设备都有一个公网 IPv4 地址吗?

通常不是。

家庭、公司、学校内部经常使用一些私有地址,比如:

  • 192.168.0.0/16
  • 172.16.0.0/12
  • 10.0.0.0/8

这些地址可以在内网里随便规划,但不能直接拿到公网互联网上当全球唯一地址使用。比如你家可以有一台 192.168.1.23,别人家也可以有一台 192.168.1.23,因为它们都只在各自的内网里有意义。

那内网设备怎么访问公网呢?这通常会用到 NAT,也就是网络地址转换。

简单说,内网电脑访问外网时,路由器会把数据包里的源地址从内网地址改成自己的外网地址,并记录这个连接是谁发起的。外面的服务器把响应发回路由器后,路由器再根据记录把数据转回内网里的那台电脑。

sequenceDiagram
    participant PC as 内网电脑 192.168.1.23
    participant R as 路由器/NAT 203.0.113.5
    participant S as 外网服务器

    PC->>R: 源地址 192.168.1.23,访问外网服务器
    R->>S: 改成源地址 203.0.113.5,再发出去
    S-->>R: 响应 203.0.113.5
    R-->>PC: 查记录,转回 192.168.1.23

所以从外部服务器的视角看,它可能只看到你家路由器的外网地址;但从你家内部看,其实是电脑、手机、平板等很多设备在共用这个出口。

这就是为什么 IPv4 不够用之后,NAT 变得非常常见。它让大量内网设备可以共享较少的公网 IPv4 地址。当然,NAT 不只是为了解决地址不够用,它也带来了内外网隔离等效果,但最直观的理解可以先从“多个内网设备共用一个外网出口”开始。

1.9. DHCP:这些地址都是从哪来的

现在我们已经提到了很多配置:

  • IP 地址
  • 子网掩码
  • 默认网关
  • DNS 服务器

那这些东西到底是从哪来的?难道每次联网都要手动填吗?

当然可以手动填,这叫静态配置。但大多数时候,我们接上网线或者连上 Wi-Fi 后,系统会自动获得这些配置。负责这件事的协议叫 DHCP。

DHCP 可以理解成局域网里的“自动分配员”。当你的电脑刚接入网络时,它还不知道自己该用什么 IP,于是会在局域网里问:

有没有 DHCP 服务器?我需要一个地址。

sequenceDiagram
    participant PC as 新接入的电脑
    participant DHCP as DHCP 服务器/路由器

    PC->>DHCP: DHCP Discover:有没有人能分配地址?
    DHCP-->>PC: DHCP Offer:可以给你 192.168.1.23
    PC->>DHCP: DHCP Request:那我就要这个地址
    DHCP-->>PC: DHCP ACK:确认,同时给你网关和 DNS

DHCP 服务器收到请求后,会告诉它类似这样的信息:

1
2
3
4
5
你的 IP 地址:192.168.1.23
你的子网掩码:255.255.255.0
你的默认网关:192.168.1.1
你的 DNS 服务器:192.168.1.1
租期:若干小时或若干天

在家庭网络里,这个 DHCP 服务器通常也在路由器上。所以家用路由器经常同时承担很多角色:

  • 作为交换机或无线 AP,让内网设备互相连接。
  • 作为路由器,连接内网和外网。
  • 作为默认网关,帮内网设备转发外部流量。
  • 作为 DHCP 服务器,自动分配 IP、网关、DNS 等配置。
  • 作为 DNS 转发器,帮内网设备转发 DNS 查询。
  • 作为 NAT 设备,让多个内网设备共用一个外网地址。

这也是为什么我们平时说的“路由器”其实经常不是一个纯粹的路由器,而是一个把交换、无线接入、路由、DHCP、NAT、DNS 转发等功能打包在一起的小盒子。

1.10. 小结:从简单到复杂

所以我们可以把上网流程按理解顺序串起来:

  1. 最开始,两台机器可以直接连线通信。
  2. 机器多了以后,两两连线太混乱,于是出现交换机,把多台机器组织成局域网。
  3. 每台机器需要地址,于是使用 IP 地址标识网络中的设备。
  4. 人不想记 IP 地址,于是出现域名和 DNS,用域名查询 IP。
  5. 网络规模继续扩大,不同局域网之间需要互联,于是出现路由器。
  6. 电脑用子网掩码判断目标是不是在同一个网段。
  7. 如果目标不在本地网段,就把数据交给默认网关。
  8. IPv4 地址不够用,大量内网使用私有地址,并通过 NAT 共用外网出口。
  9. 手动配置 IP、掩码、网关、DNS 太麻烦,于是 DHCP 负责自动分配这些信息。

这样再回头看“上网”这件事,它大概就是:先确定自己是谁,再判断目标在哪里;如果目标在本地,就本地找;如果目标在外面,就交给网关;如果目标写的是域名,就先问 DNS;如果自己的地址配置都不知道,就先找 DHCP 要一份。

2. 工具介绍

在真正配置网络之前,我觉得最需要先弄清楚的不是某个命令怎么写,而是:这些工具分别站在哪一层,它们之间是什么关系。

Linux 网络配置最容易把人绕晕的地方,就是工具名字太多了。Netplan、systemd-networkd、NetworkManager、ifupdown、wpa_supplicant、dhclient 全都可能出现。它们看起来都和“联网”有关,但并不是同一类东西。

如果把层级关系先捋清楚,后面就不容易乱配。

flowchart TD
    User[人写配置] --> Netplan[Netplan<br/>配置生成器]

    Netplan --> Networkd[systemd-networkd<br/>网络管理后端]
    Netplan --> NM[NetworkManager<br/>网络管理后端]

    Ifupdown[ifupdown<br/>较老的网络管理方式] -.不要和它们混用.-> Networkd
    Ifupdown -.不要和它们混用.-> NM

    Networkd --> NIC[网卡<br/>有线 / 无线]
    NM --> NIC
    Ifupdown --> NIC

    Networkd --> DHCP[DHCP<br/>获取 IP / 网关 / DNS]
    NM --> DHCP
    Ifupdown --> DHCP

    WPA[wpa_supplicant<br/>802.1X / Wi-Fi 认证] --> NIC

这张图是ai画的感觉有点不清晰。不过最想表达的是:

Netplan 不是和 systemd-networkd、NetworkManager 并列抢网卡的东西。它更像是一个上层配置入口,用来生成后端配置。

真正长期管理网卡的,通常是下面这些后端之一:

  • systemd-networkd
  • NetworkManager
  • ifupdown

它们容易互相冲突。一般来说,一张网卡最好只交给其中一个工具管理。

2.1. Netplan

Netplan 是 Ubuntu 里很常见的网络配置入口。

它本身通常不是那个一直在后台守着网卡的人。你写好 Netplan 配置以后,它会把配置翻译成后端真正能用的文件,然后交给 systemd-networkd 或 NetworkManager。

所以你看到 Netplan 时,要先问:

它后面用的是哪个 renderer?

常见的是:

1
renderer: networkd

或者:

1
renderer: NetworkManager

前者表示后端用 systemd-networkd,后者表示后端用 NetworkManager。

2.2. systemd-networkd

systemd-networkd 是一个网络管理后端。

它适合服务器这种网络环境比较固定的机器。比如一台旧电脑放在桌子底下当服务器,插着固定网线,不需要天天切 Wi-Fi,这种场景就很适合。

如果选择它,就尽量让它统一管理目标网卡。不要又让 NetworkManager 管同一张网卡,也不要手动长期跑一个 dhclient 来抢 DHCP。

2.3. NetworkManager

NetworkManager 也是一个网络管理后端。

它在桌面 Linux 上很常见,因为桌面电脑经常需要切换 Wi-Fi、热点、VPN、有线网络。图形界面里的网络设置很多时候就是它在背后工作。

如果是一台经常移动、经常换 Wi-Fi 的电脑,用它很正常。但如果是一台服务器,尤其是只想固定走有线网卡的服务器,用 systemd-networkd 通常会更清爽。

重点不是谁绝对更好,而是:

不要让 NetworkManager 和 systemd-networkd 同时管理同一张网卡。

2.4. ifupdown

ifupdown 是比较老的网络配置方式,Debian 系里以前很常见。

它通常通过类似 /etc/network/interfaces 的文件配置网络。现在新版本 Ubuntu Server 更常见的是 Netplan + systemd-networkd。

如果你在网上搜教程,很可能会搜到很多 ifup、ifdown、/etc/network/interfaces 相关内容。它们不一定错,但不一定适合你当前这台 Ubuntu 机器。

如果你的系统已经在用 Netplan,就不要随手再把 ifupdown 的配置混进去。

2.5. wpa_supplicant

wpa_supplicant 和前面几个不太一样。

它主要负责认证,比如:

  • Wi-Fi 密码认证。
  • 校园网有线 802.1X 认证。

它不是用来给你分配 IP、网关、DNS 的。它更像是在说:

先证明你有资格接入这个网络。

认证通过以后,后面通常还要靠 DHCP 获取 IP、网关和 DNS。

在我的校园网场景里,wpa_supplicant 负责有线 802.1X 认证,而 systemd-networkd 负责后续 DHCP 和路由配置。Netplan 则负责把这两边的配置生成出来。

2.6. dhclient

dhclient 是 DHCP 客户端,用来向 DHCP 服务器申请 IP、网关、DNS。

它本身不是一个完整的网络管理体系。你可以手动运行它让某张网卡获取地址,但如果系统已经由 systemd-networkd 或 NetworkManager 管理 DHCP,就不要再额外手动跑一个 dhclient 抢同一张网卡。

否则很容易出现:

1
2
3
4
看起来拿到了 IP
但是路由不对
重启以后配置又变了
某个工具以为自己管着网卡,另一个工具也以为自己管着网卡

2.7. 最重要的一句话

这些工具不用一次性学完,也不用一开始就搞懂每个配置项。真正重要的是先分清楚层级:

1
2
3
4
Netplan:上层配置入口,负责生成配置。
systemd-networkd / NetworkManager / ifupdown:真正管理网卡的后端,尽量三选一。
wpa_supplicant:负责认证,不负责分配 IP。
dhclient:负责 DHCP,但不要和后端网络管理器抢同一张网卡。

所以排查网络时,最先要问的不是“我该抄哪条命令”,而是:

现在到底是谁在管理这张网卡?

只要这个问题没弄清楚,后面越配置越乱的概率就非常高。

以上就是一些基本的概念。

3. 配置网络

有点难绷。因为我一开始不会配置网络,所以我是直接去问 Deepseek 怎么联网,然后一直照着它说的做。可能是因为我没用 Deepseek V4 pro,而是用的免费的网页版,甚至没用专家模式。现在回想起来真是个错误的选择。我跟着网页版 Deepseek 把我的 Ubuntu 网络配置得七零八碎,最后让 GPT 给我配置才重新配置好。

所以这一节我不打算一上来就甩一大堆配置文件。真正从 0 开始配置网络时,第一件事其实不是“写配置”,而是先弄清楚:

这台机器现在到底处于什么状态?

因为 Linux 网络最麻烦的地方往往不是“没有工具”,而是“工具太多了”。如果你一会儿用 ifupdown,一会儿用 NetworkManager,一会儿手动跑 dhclient,一会儿又让 Netplan 生成 systemd-networkd 配置,最后就会变成大家都想管同一张网卡,然后网络状态变得非常混乱。

我的最终目标其实很简单:

1
2
3
4
5
6
7
8
9
有线网卡 enp3s0
↓
802.1X 校园网认证
↓
DHCP 自动获取 IP、网关、DNS
↓
校园网网页登录
↓
真正访问外网

更具体一点,我最后采用的是:

1
2
3
4
5
6
7
8
9
10
11
Netplan
↓
systemd-networkd
↓
enp3s0 有线网卡
↓
Netplan 自动生成的 wpa_supplicant 有线 802.1X 认证
↓
DHCP 获取 IP、网关、DNS
↓
校园网网页登录程序

也就是说,我不再手动到处写 wpa_supplicant 配置,也不手动跑 dhclient,而是尽量只维护一个入口:Netplan 配置文件。

3.1. 第一步:先看有哪些网卡

首先你要知道,电脑上不止有一个所谓“网卡”的设备。包括但不限于:

  • 用来连接有线网络的以太网卡。
  • 用来连接 Wi-Fi 的无线网卡。
  • 某些 VPN 或虚拟化软件创建出来的虚拟网卡。

每个网卡都有自己的名字。我们首先要知道目标网卡叫什么。

最常用的是看简短列表:

1
ip -br link

如果想看更详细的信息,也可以用:

1
ip a

它是 ip address 的缩写,会列出所有网络接口的详细信息。

一般来说,名字形如 enp3s0 的是有线网卡,形如 wlp2s0 的是无线网卡。当然这个名字不一定完全一样,要以自己机器上显示的为准。

我这台机器里:

1
2
enp3s0  有线网卡
wlp2s0 无线网卡

而我想配置的是插网线的校园网,所以后面主要盯着 enp3s0。

3.2. 第二步:看现在是谁在管理网络

知道网卡名以后,还不能马上写配置。下一步要先看:现在到底是谁在管网络?

常见的可能性有:

  • NetworkManager 在管。
  • systemd-networkd 在管。
  • 老的 ifupdown 在管。
  • 什么都没管,但是有人手动跑了 dhclient 或 wpa_supplicant。

Ubuntu Server 上比较常见的是 Netplan + systemd-networkd。桌面版 Ubuntu 更常见的是 Netplan + NetworkManager。

可以简单看一下相关服务状态:

1
2
systemctl is-active systemd-networkd
systemctl is-active NetworkManager

我这台机器最后整理干净以后是:

1
2
systemd-networkd active
NetworkManager inactive

这说明我的后端应该使用 systemd-networkd,所以 Netplan 里应该写:

1
renderer: networkd

而不是:

1
renderer: NetworkManager

这里最重要的原则是:

不要让多个网络管理工具同时管理同一张网卡。

如果系统里同时残留了 NetworkManager、手动 dhclient、手写 wpa_supplicant、Netplan 生成配置,就很容易出现“看起来有 IP,但是不能上网”或者“重启以后又坏了”的情况。

3.3. 第三步:先读现有配置,不要急着改

网络配置一旦乱掉,远程连接可能会断。所以动手之前最好先看现有配置,并且备份。

Netplan 的配置通常在这里:

1
ls /etc/netplan

我这台机器对应的是:

1
/etc/netplan/50-cloud-init.yaml

正式修改之前,最好先备份一下。

然后再打开配置文件看它现在写了什么。要看一下有没有明显混乱。
对我来说,最后想要的是“只配置有线网卡 enp3s0”。如果我已经决定完全不用 Wi-Fi,那 Netplan 里就不应该再保留 wifis: 那一大块。

3.4. 第四步:确定这张网卡需要做什么

普通家庭有线网络可能很简单:插上网线,DHCP 拿地址,然后就能上网。

但我的校园网有个802.1X 认证。我还得经历:

1
2
3
4
5
6
7
8
9
网线接入
↓
802.1X 身份认证
↓
认证通过
↓
DHCP 获取 IP、网关、DNS
↓
可能还要网页登录

这里的 802.1X 认证由 wpa_supplicant 完成。虽然它名字里有 wpa,看起来很像 Wi-Fi 工具,但它也可以用于有线网络认证。关键在于它会以 wired 驱动方式运行。

我这里的认证类型是校园网很常见的一种:

1
PEAP + MSCHAPv2

所以 Netplan 配置里要包含 auth 部分,让 Netplan 帮我生成 wpa_supplicant 的配置。

3.5. 第五步:写一个干净的 Netplan 配置

整理完以后,我的目标配置大概长这样:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
network:
version: 2
renderer: networkd
ethernets:
enp3s0:
dhcp4: true
dhcp4-overrides:
route-metric: 100
auth:
key-management: eap
method: peap
identity: "你的校园网账号"
password: "你的校园网密码"
phase2-auth: mschapv2

这份配置的意思可以拆开看。

1
2
network:
version: 2

这是 Netplan 的基本结构。version: 2 基本固定这么写。

1
renderer: networkd

表示让 Netplan 生成给 systemd-networkd 使用的配置。

1
2
ethernets:
enp3s0:

表示我要配置的有线网卡是 enp3s0。

1
dhcp4: true

表示 IPv4 地址、默认网关、DNS 这些信息都通过 DHCP 自动获取,不手动写死。

1
2
dhcp4-overrides:
route-metric: 100

这是路由优先级。数字越小,优先级越高。如果机器上同时有有线和无线,这个值可以帮助系统优先走有线。如果只有一张有线网卡,其实没有那么重要。

1
2
3
4
auth:
key-management: eap
method: peap
phase2-auth: mschapv2

这一块就是 802.1X 认证配置。它告诉 Netplan:这张有线网卡接入网络前需要先用 EAP 认证。

这里真正需要换成你自己的,是账号和密码:

1
2
identity: "你的校园网账号"
password: "你的校园网密码"

3.6. 第六步:生成配置,再应用配置

写好 Netplan 以后,不要急着觉得万事大吉。Netplan 本身不是真正长期工作的网络守护进程,它更像是“配置生成器”。

可以先让它生成后端配置:

1
sudo netplan generate

如果没有输出,通常就是成功。

然后再应用:

1
sudo netplan apply

应用之后,Netplan 会生成后端真正使用的文件。对我这台机器来说,关键文件大概是:

1
2
/run/systemd/network/10-netplan-enp3s0.network
/run/netplan/wpa-enp3s0.conf

前者是给 systemd-networkd 用的,负责 DHCP、路由等网络配置。后者是给 wpa_supplicant 用的,负责有线 802.1X 认证。

换句话说,Netplan 帮我做了两件事:

  1. 生成 systemd-networkd 配置,让 enp3s0 通过 DHCP 拿地址。
  2. 生成 wpa_supplicant 配置,让 enp3s0 先完成有线 802.1X 认证。

这样就比我到处手动写配置文件清爽很多。

3.7. 第七步:看接口有没有真的配置成功

应用配置以后,不要只看“命令有没有报错”。网络配置最重要的是看最终状态。

可以看这张网卡的状态:

1
networkctl status enp3s0

比较理想的状态里,应该能看到类似:

1
2
3
4
State: routable (configured)
Address: 10.x.x.x
Gateway: 10.x.x.x
DNS: x.x.x.x

这里最关键的是几件事:

1
State: routable (configured)

这说明接口已经配置完成,并且可以路由。

1
2
3
Address
Gateway
DNS

这说明 DHCP 已经给你分配了 IP 地址、默认网关和 DNS。

这就和前面“上网流程”里讲的内容接上了。

3.8. 第八步:确认认证进程没有跑错

因为我的校园网需要 802.1X,所以还要看 wpa_supplicant 有没有正确跑起来。

可以看相关进程:

1
ps -ef | grep -E 'wpa_supplicant|systemd-networkd|dhclient' | grep -v grep

正常情况下,应该能看到 systemd-networkd,以及一个由 Netplan 生成配置启动的 wpa_supplicant。

比较关键的是它应该类似这样:

1
wpa_supplicant ... -c /run/netplan/wpa-enp3s0.conf -i enp3s0 -D wired

这里有两个重点:

  • -i enp3s0:说明它认证的是有线网卡 enp3s0。
  • -D wired:说明这是有线 802.1X 认证,不是 Wi-Fi 认证。

不应该看到:

1
dhclient enp3s0

因为我已经让 systemd-networkd 负责 DHCP 了,如果还有手动跑出来的 dhclient,就说明有抢着配置这张网卡,一定要避免这种情况。

3.9. 第九步:确认默认流量从哪里走

有时候机器上有多张网卡,比如有线、无线、Tailscale、Docker 虚拟网卡等。这时就算有线网卡有 IP,也不代表真正访问外网时会走它。

所以还要看路由。

最常用的是:

1
ip route

它会显示当前路由表。你通常希望看到一条默认路由,大概长这样:

1
default via 某个网关 dev enp3s0

更直接一点,可以问系统:如果我要访问 1.1.1.1,你准备从哪里出去?

1
ip route get 1.1.1.1

如果结果里有:

1
dev enp3s0

就说明访问公网时确实会走有线网卡。

这一步非常重要。因为“网卡有 IP”和“默认流量走这张网卡”不是一回事。

3.10. 第十步:最后才检查校园网网页登录

到这里,如果 802.1X 认证成功了,DHCP 也拿到了 IP、网关、DNS,默认路由也走 enp3s0,那么底层网络基本就通了。

每个学校的网页认证不一样,这一步就要自己去折腾一个联网的脚本了。

3.11. 第十一步:如果不用 Wi-Fi,就把 Wi-Fi 残留清掉

我这次希望服务器走有线,不想让它再用 Wi-Fi。所以最终配置里就不应该有 wifis: 块。

如果之前折腾的时候手动启用过 Wi-Fi 的 wpa_supplicant 服务,也应该停掉。否则它可能继续在后台跑,让你误判当前网络到底从哪里出去。

这一步的核心不是“必须禁用 Wi-Fi”,而是:

你要知道自己想让哪张网卡工作,并尽量让配置保持单一、干净。

对于我的旧电脑服务器来说,最干净的状态就是:

1
2
enp3s0  有 IP,负责出网
wlp2s0 不参与当前网络

3.12. 总结一下配置顺序

如果从 0 开始,我觉得比较稳的顺序应该是:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
1. 插上网线。
2. 用 ip -br link 看网卡名。
3. 确认目标网卡是 enp3s0。
4. 看 systemd-networkd 和 NetworkManager 谁在运行。
5. 决定只使用 Netplan + systemd-networkd。
6. 备份并整理 /etc/netplan/50-cloud-init.yaml。
7. 在 Netplan 里只配置 enp3s0。
8. 写入 DHCP 和 802.1X 认证信息。
9. netplan generate 检查能不能生成。
10. netplan apply 应用配置。
11. networkctl status enp3s0 看是否 routable/configured。
12. ps 检查 wpa_supplicant 是否以 wired 方式认证 enp3s0。
13. 确认没有残留 dhclient 抢配置。
14. ip route get 1.1.1.1 看默认流量是否走 enp3s0。
15. 如果被校园网门户 302 拦截,再运行网页登录程序。
16. 再次检查是否返回 204,确认真正联网。

最重要的判断标准其实只有三个:

第一,看谁在管理接口:

1
networkctl status enp3s0

第二,看有没有其他东西在抢配置:

1
ps -ef | grep -E 'dhclient|wpa_supplicant|NetworkManager|systemd-networkd'

第三,看默认流量实际从哪里出去:

1
ip route get 1.1.1.1

只要这三项是清楚的,后面的排查就不会太玄学。至少你知道问题到底卡在了哪一层:是网卡没起来,是 802.1X 没过,是 DHCP 没拿到地址,是默认路由不对,还是只是校园网网页登录还没完成。