在今天,网络已经成为社会中不可或缺的一部分,无论是流媒体传输(例如上 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):

第一位

第二/四位

第三/五位

显示名称

en/wl/ww

o/p/s

N

类别

设备的属性

设备的位置/总线标识

设备的编号/端口标识

含义

以太网(有线网)/无线局域网/无线广域网

板载/PCI 总线插槽/PCI 热插拔

如上所述

例如:

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 的文件。用编辑器打开它:

默认配置其实是系统根据当前网络连接情况自动生成的,但我们可以增添一些额外的配置项:

  1. dns:用于 ipv4,指的是网络所用的 DNS 服务器. 常见的有 8.8.8.8(Google 公共 DNS)和 1.1.1.1(Cloudflare DNS)等。有多个 DNS 地址时,每一个 DNS 的 IP 地址需要用分号分隔,不得带有空格。

  2. address1:用于 ipv4,指的是当前设备的 IPv4 地址。格式为 "IP 地址/掩码,网关"。

  3. [proxy]:网络代理,常用于加速镜像。可以设置 http, https, ftp, socks 等。

  4. 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 地址和网关是否已经修改为你想要的:

pingcurl 测试连通情况:

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

C/C++ 新人开发者,主攻 UE5,业余 Linux 运维