跳转至内容

网络配置

来自 ArchWiki
(重定向自 Configuring network)

本文描述了如何在 OSI Layer 3 及以上配置网络连接。介质相关的具体配置在 /Ethernet/Wireless 子页面处理。

检查连接

本文章或章节需要扩充。

原因: 第 4 步不清楚,#路由表 没有解释正确的设置是什么样的。(在 Talk:Network configuration 中讨论)

要排除网络连接故障,请按以下条件检查并确保您满足它们

  1. 您的 网络接口 已列出并启用。否则,请检查设备驱动程序——请参见 /Ethernet#Device driver/Wireless#Device driver
  2. 您已连接到网络。网线已插入或您已 连接到无线局域网
  3. 您的网络接口具有 IP 地址
  4. 您的 路由表 设置正确。
  5. 您可以 ping 一个本地 IP 地址(例如您的默认网关)。
  6. 您可以 ping 一个公共 IP 地址(例如 9.9.9.9,这是由 Quad9 Foundation 运营的一个 DNS 服务器,是一个方便测试的地址)。
  7. 检查您是否可以解析域名(例如 archlinux.org)。
注意 如果您的网络在安装过程中正常,但在新系统中无法 ping 通,即使已安装了正确的网络服务(例如 NetworkManager),请检查您的网络是否需要设备身份验证(例如学校网络)。如果是,请等待大约 2 小时后重试。原因可能是安装后系统的 主机名 与安装过程中使用的 archiso 不同,导致身份验证失败,从而忽略了来自新系统的连接请求。

Ping

ping 用于测试您是否可以到达一个主机。

$ ping www.example.com
PING www.example.com (93.184.216.34) 56(84) bytes of data.
64 bytes from 93.184.216.34 (93.184.216.34): icmp_seq=1 ttl=56 time=11.632 ms
64 bytes from 93.184.216.34 (93.184.216.34): icmp_seq=2 ttl=56 time=11.726 ms
64 bytes from 93.184.216.34 (93.184.216.34): icmp_seq=3 ttl=56 time=10.683 ms
...

对于收到的每个回复,ping 实用程序将打印一行类似上面的内容,直到您交互式中断(Ctrl+c)。有关更多信息,请参阅 ping(8) 手册。请注意,计算机可以配置为不响应 ICMP 回显请求。[1]

如果您收到错误消息(参见 ping 错误指示)或没有回复,这可能与配置不完整有关,也可能与您的默认网关或互联网服务提供商 (ISP) 有关。您可以运行 traceroute 来进一步诊断到主机的路由。

网络管理

本文或本节需要在语言、wiki 语法或风格方面进行改进。请参阅 Help:Style 获取参考。

原因: 分为使用 iproute2 的手动配置和使用 DHCP & SLAAC 的自动配置。(在 Talk:Network configuration#Style_notice_in_Network_Management_section 中讨论)

要设置网络连接,请按以下步骤进行

  1. 确保您的 网络接口 已列出并启用。
  2. 连接到网络。插入网线或 连接到无线局域网
  3. 配置您的网络连接:
注意 安装镜像使用

手动

iproute2

本文或本节需要在语言、wiki 语法或风格方面进行改进。请参阅 Help:Style 获取参考。

原因: 此部分不适合放在 #网络管理 下——它并不 *管理* 任何东西,只是介绍了 iproute2 包。(在 Talk:Network configuration 中讨论)

iproute2base 元软件包 的一个依赖项,它提供了 ip(8) 命令行界面,用于管理 网络接口IP 地址路由表。请注意,使用 ip 进行的配置会在重启后丢失。要实现持久化配置,您可以使用脚本和 systemd 单元 来自动化 ip 命令。另外请注意,ip 命令通常可以缩写,但为了清晰起见,本文档中会完整拼写它们。

注意 Arch Linux 已弃用 net-tools,转而使用 iproute2[2] 另请参见 已弃用的 Linux 网络命令及其替代品

静态 IP 地址

大多数标准的 网络管理器 以及 dhcpcd 都可以配置静态 IP 地址。

要手动配置静态 IP 地址,请按照 #IP 地址 中的描述添加 IP 地址,设置您的 路由表配置您的 DNS 服务器

IP 地址

IP 地址 使用 ip-address(8) 进行管理。

列出 IP 地址

$ ip address show

向接口添加 IP 地址

# ip address add address/prefix_len broadcast + dev interface
请注意
注意 确保手动分配的 IP 地址与 DHCP 分配的地址不冲突。

从接口删除 IP 地址

# ip address del address/prefix_len dev interface

删除匹配特定标准的地址,例如特定接口的所有地址

# ip address flush dev interface
提示 IPv4 地址可以使用 ipcalc (ipcalc) 计算。

路由表

路由表用于确定您是否可以直接到达一个 IP 地址,或者您应该使用哪个网关(路由器)。如果没有其他路由匹配 IP 地址,则使用 默认网关

路由表使用 ip-route(8) 进行管理。

PREFIX 是 CIDR 表示法或 default,用于指定默认网关。

列出 IPv4 路由

$ ip route show

列出 IPv6 路由

$ ip -6 route show

添加路由

# ip route add PREFIX via address dev interface

删除路由

# ip route del PREFIX via address dev interface

自动配置

本文章或章节需要扩充。

原因: 解释 SLAAC。(在 Talk:Network configuration 中讨论)

自动网络配置是通过 动态主机配置协议 (DHCP) 实现的。网络上的 DHCP 服务器在收到 DHCP 客户端的请求后,提供 IP 地址、默认网关 IP 地址,并可选择性地提供 DNS 名称服务器。

有关 DHCP 服务器的比较表,请参见 Router#DNS and DHCP

网络管理器

网络管理器允许您在所谓的网络配置文件中管理网络连接设置,以便于切换网络。

提示 您可以使用 dhcping 来检查 DHCPv4 服务器是否正在运行。
注意 每个网络接口都应由一个 DHCP 客户端或网络管理器管理,因此建议在系统上只运行一个 DHCP 客户端或网络管理器。
软件 连接类型 无线身份验证 IP 地址、路由和 DNS 管理 接口
以太网 PPPoE 移动宽带 静态 IP DHCP 客户端 域名解析 CLI TUI GUI
dhclient1 2 内置 是(写入 /etc/resolv.conf
dhcpcd 启动 wpa_supplicant3 内置 (使用 resolvconf 或写入 /etc/resolv.conf dhcpcd-uiAUR
ConnMan 是(通过 ofonoAUR 是(通过 wpa_supplicantiwd 内置 (运行内置解析器并写入 /etc/resolv.conf connmanctl(1)
netctl (通过 ppp 是(通过 ppp 是(通过 wpa_supplicant dhcpcddhclient (使用 resolvconf netctl(1) wifi-menu(1)4
NetworkManager (通过 ppp (通过 modemmanager 是(通过 wpa_supplicantiwd 内置,dhclientdhcpcd5 (使用 systemd-resolvedresolvconf 或写入 /etc/resolv.conf nmcli(1) nmtui(1)
systemd-networkd 2 内置 是(使用 systemd-resolved networkctl(1)
wpa_supplicant IEEE 802.1X wpa_cli(8) wpa_supplicant_guiAUR
iwd IEEE 802.1X 内置 (使用 systemd-resolvedresolvconf iwctl(1) impala iwgtkAUR
  1. 自 2022 年初起不再维护。ISC 建议不再用于生产环境。
  2. 无线身份验证可以单独使用 wpa_supplicantiwd 进行配置。
  3. 无线身份验证必须单独使用 wpa_supplicant 进行配置。
  4. 只能管理 Wi-Fi 连接。
  5. NetworkManager 不使用 dhcpcd 进行 DHCPv6,请参见 NetworkManager#DHCP client

网络接口

网络接口由 udev 管理,并通过 systemd.link(5) 文件进行配置。默认配置使用 可预测的网络接口名称 为您的 网络接口控制器 分配名称,该名称的前缀为 en(有线/ 以太网)、wl(无线/ WLAN)或 ww(移动宽带/ WWAN)。请参阅 systemd.net-naming-scheme(7)

提示
  • 系统 /usr/lib/systemd/network/99-default.link 文件通常足以满足大多数情况。
  • 要更改接口名称,请参见 #更改接口名称#恢复为传统接口名称
  • 您可以通过运行 udevadm test-builtin net_setup_link /sys/path/to/network/device(作为 root 用户)来诊断 .link 文件的相关问题。
  • 如果系统固件决定重新编号设备,添加或删除 PCIe 设备后,可预测的网络接口名称可能会发生变化。请参见 systemd issue 33347
  • iwd 包包含一个 .link 文件,该文件会禁用可预测的网络接口名称。仅安装此包就会阻止所有网络接口被重命名为可预测的名称。请参见 iwd#Wireless device is not renamed by udev

列出网络接口

有线和无线接口名称都可以在 ls /sys/class/netip link 中找到。请注意,lo虚拟回环接口,不用于建立网络连接。

无线设备名称也可以使用 iw dev 检索。另请参见 /Wireless#Get the name of the interface

如果您的网络接口未列出,请确保您的设备驱动程序已成功加载。请参见 /Ethernet#Device driver/Wireless#Device driver

启用和禁用网络接口

可以使用 ip link set interface up|down 来启用或禁用网络接口,请参见 ip-link(8)

要检查接口 enp2s0 的状态

$ ip link show dev enp2s0
2: enp2s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master br0 state DOWN mode DEFAULT qlen 1000
...

<BROADCAST,MULTICAST,UP,LOWER_UP> 中的 UP 表明接口已激活,而不是后面的 state DOWN

注意 如果您的默认路由是通过接口 enp2s0,那么禁用它将也会移除路由,启用它不会自动重新建立默认路由。请参见 #路由表 以重新建立它。

更改接口名称

本文章或章节需要扩充。

原因: 建议使用 *备用名称*(altname)或为其分配一个备用名称,作为更改接口名称的替代方案。(在 Talk:Network configuration 中讨论)
注意 更改命名方案时,请勿忘记更新所有与网络相关的配置文件和自定义 systemd 单元文件以反映更改。

您可以通过在 systemd.link(5) 文件中手动定义名称来更改设备名称。该文件必须在词典顺序上排在 99-default.link 之前,例如

/etc/systemd/network/10-net0.link
[Match]
PermanentMACAddress=aa:bb:cc:dd:ee:ff

[Link]
Name=net0

或者,可以使用 udev 规则

/etc/udev/rules.d/10-network.rules
SUBSYSTEM=="net", ACTION=="add", ATTR{address}=="aa:bb:cc:dd:ee:ff", NAME="net0"

这些规则将在启动时自动应用。要立即应用更改,请在 net 子系统上手动触发 udev 规则

# udevadm trigger --verbose --subsystem-match=net --action=add

如果您想对所做的更改进行 测试udevadm --debug test /sys/class/net/* 会很有帮助。

  • Name 的优先级低于 NamePolicy,因此请确保后者未设置/为空,否则名称将不会被更改。
  • 在更改接口名称之前,网络接口必须处于关闭状态。[3]
  • 要获取每个网卡的 MAC 地址,请运行 ip link
  • 请确保在 udev 规则中使用小写十六进制值。它不喜欢大写。

如果网络卡具有动态 MAC 地址,您可以使用 Path(可以通过 networkctl status interface_name 检查)

/etc/systemd/network/10-net1.link
[Match]
Path=pci-0000:01:00.0

[Link]
Name=net1

或者,使用带有 DEVPATH 的 udev 规则

/etc/udev/rules.d/10-network.rules
SUBSYSTEM=="net", DEVPATH=="/devices/pci*/*1c.0/*/net/*", NAME="net1"

要获取所有当前连接设备的 DEVPATH,请查看 /sys/class/net/ 中的符号链接指向何处。例如

$ file /sys/class/net/*
/sys/class/net/enp0s20f0u4u1: symbolic link to ../../devices/pci0000:00/0000:00:14.0/usb2/2-4/2-4.1/2-4.1:1.0/net/enp0s20f0u4u1
/sys/class/net/enp0s31f6:     symbolic link to ../../devices/pci0000:00/0000:00:1f.6/net/enp0s31f6
/sys/class/net/lo:            symbolic link to ../../devices/virtual/net/lo
/sys/class/net/wlp4s0:        symbolic link to ../../devices/pci0000:00/0000:00:1c.6/0000:04:00.0/net/wlp4s0

设备路径应同时匹配新旧设备名称,因为该规则在启动时可能会执行不止一次。例如,在给定的规则中,"/devices/pci*/*1c.0/*/net/en*" 是错误的,因为它一旦名称被更改为 net1 就会停止匹配。只有系统默认规则会在第二次运行时生效,导致名称被改回。

如果您使用的是具有动态 MAC 地址的 USB 网络设备(例如 Android 手机共享网络),并且您希望能够使用不同的 USB 端口,则可以使用一个匹配 vendor 和 model ID 的规则

/etc/systemd/network/20-net2.link
[Match]
Property=ID_VENDOR_ID=12ab ID_MODEL_ID=3cd4

[Link]
Name=net2

或者

/etc/udev/rules.d/10-network.rules
SUBSYSTEM=="net", ACTION=="add", ATTRS{idVendor}=="12ab", ATTRS{idProduct}=="3cd4", NAME="net2"
注意 在选择静态名称时,**应避免使用“ethX”和“wlanX”格式的名称**,因为这可能导致内核和 udev 在启动时发生竞争条件。相反,最好使用内核默认不使用的接口名称,例如:net0net1wifi0wifi1。有关详细信息,请参见 systemd 文档。

恢复为传统接口名称

如果您希望保留传统的接口名称,例如 eth0,可以通过更改 udev 的 net_setup_link 内置的默认 NamePolicy 来禁用 可预测的网络接口名称

/etc/systemd/network/99-default.link.d/traditional-naming.conf
[Link]
NamePolicy=keep kernel

或者,可以通过屏蔽相应的 udev 规则来完全禁用 net_setup_link

# ln -s /dev/null /etc/udev/rules.d/80-net-setup-link.rules

或者将 net.ifnames=0 添加到 内核参数 中。

注意 systemd.link(5) 依赖于 net_setup_link 工作。除非您完全了解您正在做什么,否则建议使用第一种方法。

设置设备 MTU 和队列长度

本文或本章节的准确性存在争议。

原因: 创建一个 30-mtu.link 文件意味着 99-default.link 将不会被应用。(在 Talk:Network configuration 中讨论)

您可以通过在 systemd.link(5) 配置中手动定义来更改设备 MTU 和队列长度。例如

/etc/systemd/network/30-mtu.link
[Match]
Type=wlan

[Link]
MTUBytes=1500
TransmitQueueLength=2000

或者通过 udev 规则

/etc/udev/rules.d/10-network.rules
ACTION=="add", SUBSYSTEM=="net", KERNEL=="wl*", ATTR{mtu}="1500", ATTR{tx_queue_len}="2000"

MTUBytes:使用大于 1500 的值(所谓的 巨型帧)可以显著加快网络传输速度。请注意,所有网络接口,包括本地网络中的交换机,都必须支持相同的 MTU 才能使用巨型帧。对于 PPPoE,MTU 不应大于 1492。您也可以通过 systemd.netdev(5) 设置 MTU。

TransmitQueueLength:对于具有高延迟的较慢设备(如调制解调器连接和 ISDN)使用较小的值。对于通过执行大批量数据传输的高速互联网连接的服务器,建议使用较大的值。

设置主机名

主机名是在网络上用于识别机器的唯一名称,在 /etc/hostname 中配置——有关详细信息,请参见 hostname(5)hostname(7)。该文件可以包含系统的域名(如果存在)。要设置主机名,请 编辑 /etc/hostname,使其包含一行 yourhostname

/etc/hostname
yourhostname
提示 关于选择主机名的建议,请参见 RFC 1178

或者,使用 hostnamectl(1)

# hostnamectl hostname yourhostname

要临时设置主机名(直到重启),请使用 hostname(1)(来自 inetutils

# hostname yourhostname

要设置“美观”的主机名和其他机器元数据,请参见 machine-info(5)

本地网络主机名解析

要使您的机器在局域网中可以通过其主机名访问,您可以

  • 编辑您局域网中每台设备的 /etc/hosts 文件,请参见 hosts(5)
  • 设置一个 DNS 服务器来解析您的主机名,并让局域网设备使用它(例如通过 DHCP
  • 或者简单的方法:使用一个 零配置网络 服务
    • 通过 Microsoft 的 NetBIOS 进行主机名解析。在 Linux 上由 Samba 提供。它只需要 nmb.service。运行 Windows、macOS 或运行 nmb 的 Linux 计算机将能够找到您的机器。
    • 通过 mDNS 进行主机名解析。由 nss_mdnsAvahi(有关设置详情请参见 Avahi#Hostname resolution)或 systemd-resolved 提供。运行 macOS 或运行 Avahi 或 systemd-resolved 的 Linux 计算机将能够找到您的机器。较旧的 Win32 API 不支持 mDNS,这可能会阻止一些旧的 Windows 应用程序访问您的设备。

技巧与提示

绑定或 LAG

请参见 netctlsystemd-networkd,或 Wireless bonding

IP 地址别名

IP 别名是将多个 IP 地址添加到网络接口的过程。通过此过程,网络上的一个节点可以拥有多个网络连接,每个连接用于不同的目的。典型用途是 Web 和 FTP 服务器的虚拟托管,或在不更新任何其他机器的情况下重新组织服务器(这对于名称服务器尤其有用)。

示例

要手动设置一个别名,对于某个 NIC,请使用 iproute2 执行

# ip addr add 192.168.2.101/24 dev enp2s0 label enp2s0:1

要删除给定的别名,请执行

# ip addr del 192.168.2.101/24 dev enp2s0:1

目的地为子网的数据包默认将使用主别名。如果目标 IP 属于某个辅助别名的子网,则源 IP 会相应设置。考虑有多个 NIC 的情况,默认路由可以用 ip route 列出。

混杂模式

切换 混杂模式 会使(无线)NIC 将其接收到的所有流量转发给操作系统进行进一步处理。这与“正常模式”相反,在正常模式下,NIC 会丢弃不打算接收的帧。它最常用于高级网络故障排除和 数据包嗅探

/etc/systemd/system/promiscuous@.service
[Unit]
Description=Set %i interface in promiscuous mode
After=network.target

[Service]
Type=oneshot
ExecStart=/usr/bin/ip link set dev %i promisc on
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target

如果您想在接口 enp2s0 上启用混杂模式,请 启用 promiscuous@enp2s0.service

检查套接字

ss 是一个用于检查网络端口的实用程序,它是 iproute2 包的一部分。它具有与已弃用的 netstat 实用程序类似的功能。

常见用法包括

显示所有具有服务名称的 TCP 套接字

$ ss -at

显示所有具有端口号的 TCP 套接字

$ ss -atn

显示所有 UDP 套接字

$ ss -au

有关更多信息,请参阅 ss(8)

故障排除

TCP 窗口缩放问题

TCP 数据包在其头部包含一个“窗口”值,指示另一台主机可以在多大程度上发送数据作为响应。此值仅用 16 位表示,因此窗口大小最多为 64KiB。TCP 数据包会缓存一段时间(它们必须重新排序),并且由于内存是(或曾经是)有限的,一台主机很容易耗尽内存。

早在 1992 年,随着可用内存的增加,RFC:1323 被撰写以改善这种情况:窗口缩放。在所有数据包中提供的“窗口”值将由一个在连接开始时定义一次的缩放因子修改。这个 8 位缩放因子可以将窗口大小提高到初始 64KiB 的 32 倍。

似乎互联网上一些损坏的路由器和防火墙将缩放因子重写为 0,这会导致主机之间的误解。Linux 内核 2.6.17 引入了一种新的计算方案,可以生成更高的缩放因子,从而使损坏的路由器和防火墙的影响更加明显。

结果连接最多是速度非常慢或完全中断。

如何诊断问题

首先,让我们说清楚:这个问题很奇怪。在某些情况下,您将完全无法使用 TCP 连接(HTTP、FTP 等),而在其他情况下,您将能够与某些主机(非常少)通信。

当您遇到此问题时,dmesg 的输出是正常的,日志是干净的,并且 ip addr 会报告正常状态……实际上一切看起来都很正常。

如果您无法浏览任何网站,但可以 ping 某些随机主机,那么您很可能正经历这个问题:ping 使用 ICMP,不受 TCP 问题的影响。

您可以尝试使用 Wireshark。您可能会看到成功的 UDP 和 ICMP 通信,但 TCP 通信(仅与外部主机)失败。

修复方法

错误的方法

为了以错误的方式修复它,您可以更改 tcp_rmem 值,窗口缩放因子计算基于此。虽然它应该适用于大多数主机,但不能保证,尤其是对于非常遥远的主机。

# sysctl -w net.ipv4.tcp_rmem="4096 87380 174760"
正确的方法

简单地禁用窗口缩放。由于窗口缩放是一项不错的 TCP 功能,禁用它可能会带来不便,特别是如果您无法修复损坏的路由器。有几种方法可以禁用窗口缩放,而且似乎最可靠的方法(适用于大多数内核)是将以下行添加到 /etc/sysctl.d/99-disable_window_scaling.conf(另请参阅 sysctl

net.ipv4.tcp_window_scaling = 0
最佳

这个问题是由损坏的路由器/防火墙引起的,所以让我们来修复它们。一些用户报告说,损坏的路由器是他们自己的 DSL 路由器。

更多关于此

本节基于 LWN 文章 TCP window scaling and broken routers 和一篇已归档的 Kernel Trap 文章:Window Scaling on the Internet

LKML 上也有几条相关的讨论串。

本地主机名通过网络解析

nss-myhostname(8)(由 systemd 提供并默认在 /etc/nsswitch.conf 中启用的 NSS 模块)为 localhost 和本地 主机名 提供到 IP 地址的解析。然而,一些软件可能仍然直接读取 /etc/hosts;请参阅 [4] [5] 了解示例。

为防止此类软件通过网络不安全地解析本地主机名,请将条目添加到 hosts(5) 文件中

/etc/hosts
127.0.0.1        localhost
::1              localhost
127.0.1.1        yourhostname

对于具有永久 IP 地址的系统,请将 127.0.1.1 替换为该永久 IP 地址。对于具有完全限定域名的系统,请在主机名前插入完全限定域名(有关原因,请参阅以下链接)。例如

/etc/hosts
127.0.0.1        localhost
::1              localhost
203.0.113.45     host1.fqdomain.example host1
注意 /etc/hosts 中 IP 地址后面的主机名/别名的顺序很重要。第一个字符串被视为规范主机名,并且可以附加父域,其中域组件用点分隔。同一行中的所有后续字符串都被视为别名。有关更多信息,请参阅 hosts(5)

参见