在今天,网络已经成为社会中不可或缺的一部分,无论是流媒体传输(例如上 b 站或看 YouTube)还是在线会议(例如 Slack Huggle, 钉钉或 Zoom),里面都和网络息息相关。在 Windows 里面一般都有图形化的界面方便我们连接和管理网络,但是在古早的(例如 Debian 3)和服务器 Linux 上呢?可能就只能通过命令行管理了。这就是我们今天要探讨的,从命令行管理 Linux 的网络。
网络接口的命名方式
传统的命名规则统一是 ethN 或 wlanN,其中 eth 是以太网(Ethernet)的缩写,wlan 是无线局域网(Wireless Local Area Network)的首字母缩写,N 表示“第 N 个设备”。它们是由内核和 udev 决定的,但有一个很致命的缺点:“名称漂移”(当硬件发生变化,如插入 USB 网卡、PCI 热插拔时,导致设备名称改变的现象)。
后来,随着相较于 sysV 更好的 systemd 出现和普及,以及网络的迅猛发展,上面的问题进一步被放大,采用新的命名标准已经迫在眉睫。于是,从 RHEL 7,Debian 8 和 Ubuntu 15.04 开始,Linux 引入了新的可预测命名规则(Predictable Network Interface Names):
例如:
enp0s2 表示有线网设备,其位置在 PCI 总线 0 的第 2 个插槽。
wlp2s1 表示无线局域网设备,其位置在 PCI 总线 2 的第 1 个插槽(也就是一般所说的无线网卡,例如 Intel AX211, Qualcomm NFA765 等)。
ens33 表示有线网设备,位于 PCI 热插拔第 33 号插槽上。这是 VMware 虚拟机的网卡。
初识 NetworkManager
NetworkManager(网络管理器)是 Linux 系统内一个非常重要的程序,用于当网络设备可用时保持设备和连接开启并激活。一般来说,有线网会自动连接,而无线网需要使用其他手段(例如 Arch Linux 安装时的 iwctl 等)。
默认状态下,NetworkManager 是启用并处于激活状态的。可以查看它的状态(注意权限和严格按照给定的大小写!):
systemctl status NetworkManager
在 GNOME 和 KDE Plasma 内(也有其他的桌面环境),NetworkManager 会以 GUI 的形式出现。然而,在服务器上,我们不可能总是有桌面环境,因此直接输入 NetworkManager 可能是不会有任何反应的。要管理网络,就必须使用其他的方法。
配置网络参数
CentOS Stream 9/RHEL 9 以上
直接修改配置文件
它们的网卡配置文件都位于 /etc/NetworkManager/system-connections/ 目录下。
具体的网卡类型取决于你所使用的设备,可以通过 ip addr show 查看。
例如,我们现在要配置 VMware 虚拟机网卡 ens33,在 system-connections 目录下有一个名为 ens33.nmconnection 的文件。用编辑器打开它:

默认配置其实是系统根据当前网络连接情况自动生成的,但我们可以增添一些额外的配置项:
dns:用于 ipv4,指的是网络所用的 DNS 服务器. 常见的有
8.8.8.8(Google 公共 DNS)和1.1.1.1(Cloudflare DNS)等。有多个 DNS 地址时,每一个 DNS 的 IP 地址需要用分号分隔,不得带有空格。address1:用于 ipv4,指的是当前设备的 IPv4 地址。格式为 "IP 地址/掩码,网关"。
[proxy]:网络代理,常用于加速镜像。可以设置 http, https, ftp, socks 等。
mac-address-blacklist:用于 ethernet,指的是 MAC 地址(物理地址)黑名单。
这种方法要改的配置项很多,非常容易出错,因此不建议使用。
使用 nmcli
一个更加简单(且建议)的方法是,使用 nmcli 命令,它是管理网卡配置时常用的。
例如,要显示当前所有配置的网卡信息(名称,UUID,类型,设备):
nmcli con show
加上具体的名称(NAME 一列)时会显示该设备的所有网络配置信息。
如果要修改某一项,它的语法结构如下(如果记不住属性,请使用 Tab 自动补全):
nmcli connection modify <interface_name> <property> <ip/prefix>
# Using Abbreviation (use Tab for auto-completion)
nmcli con mod <interface_name> <property> <ip/prefix>在修改之前,请务必先检查系统可用的 IP 网段和网关地址,否则会因使用不存在的网关而导致无法联网:

例如,要修改网卡 ens33 的 IPv4 地址为 192.168.40.184,掩码为 24:
nmcli connection modify ens33 ipv4.addresses 192.168.40.184/24在修改后设置网关(gateway):
nmcli connection modify ens33 ipv4.gateway 192.168.40.2
# You can use "ip route" for getting gateway请不要使用公网 IP(除非你有)和广播地址(x.x.x.255,无法通信)作为 IP 地址或网关!
总之,要想完成网络连接配置,必须修改的部分有:
connection.id
connection.uuid
connection.interface_name
ipv4.addresses
ipv4.gateway
ipv4.method(如果你手动指定了 IP 地址、网关和 DNS 服务器,请改成 manual)
ipv4.dns
结束后,重启网络设置:
nmcli connection reload
nmcli connection up ens33检查一下 IP 地址和网关是否已经修改为你想要的:

用 ping 或 curl 测试连通情况:


Debian 12/Ubuntu 22.04 以上
提示:非 ESM 用户不建议使用 Debian 11 或者 Ubuntu 20.04,前者即将停止支持(建议尽快迁移至 Debian 12 Bookworm),而后者已经停止 LTS 支持。
Debian 12 和 Ubuntu 22.04 都支持直接修改配置文件和使用 nmcli,但它们的服务器版也有自己的网络管理器 netplan. 它使用的是 yaml 语法,和 CentOS/RHEL 里面的 Ansible 以及 Docker Compose 是一类,都属于声明式语言。
netplan 是从 Debian 12 和 Ubuntu 16.04 开始引入的新一代网络管理器,它既支持传统的 NetworkManager,又支持 systemd-networkd,设计目的是消除不同配置工具带来的学习门槛和差异性(就像 Linux 桌面环境一样各家有各家的做法……)。这里我们使用 Zorin OS 18 作为演示。
先进入到 netplan 的配置目录 /etc/natplan 下:

可以看到,里面空空如也(也有可能是在 /lib/netplan 目录下有配置),是因为我们还没有设定配置,或者操作系统自动生成的配置不在这里。我们新建一个(后缀名不是 .yml):
sudo nano 00-netplan-cfg.yaml将下面的模版复制粘贴进新的文件中:
network:
version: 2
renderer: NetworkManager它的意思是让系统使用传统的 nmcli 作为网络管理器(只要检测到以太网设备连接,就以 DHCP 模式启动该设备)。
如果想要用 networkd 作为网络管理器(注意此时不会自动启动网络设备,除非像下面那样指定配置!),则下面是一个示例:
network:
version: 2
renderer: networkd
ethernets:
ens33:
dhcp4: false
addresses:
- 192.168.40.134/24
nameservers:
addresses:
- 1.1.1.1
- 8.8.8.8
routes:
- to: default
via: 192.168.40.2上面这些只是使用 netplan 的一部分,具体的细节可以参考这篇文章。由于篇幅限制,后面会单独出一期讲这个。
配置主机名称
我们在 Windows 上常说的计算机名称,在 Linux 上叫做 hostname,而本地主机则称为 localhost. 如果想查看,可以使用如下命令:
hostname # basic
hostnamectl # professional某些系统在安装的时候并不会指定主机名称(例如 CentOS 10 Stream),而是会指定一个临时的主机名(Transient Hostname),这样一来就需要我们手动指定。
还记得之前提到的 hostnamectl 命令吗?现在就需要用到它了。
hostnamectl set-hostname YOUR_HOSTNAME这样可以设定或更改自己的主机名。
或者,我们也可以直接修改 /etc/hostname 文件内的名称,但是这种方法需要重启系统,对服务器来说并不友好,因此不建议。
其他有用的命令
如果你要查找当前服务器正在使用的端口:ss -tnl
如果你正在寻找当前 IP 网段内的用户:ip neigh