网络配置

出自 ArchWiki
(重定向自 网络接口

本文介绍如何在 OSI layer 3 及以上层配置网络连接。介质相关的具体信息在 /Ethernet/Wireless 子页面中处理。

检查连接

此文章或章节需要扩充。

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

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

  1. 您的网络接口已列出并已启用。 否则,请检查设备驱动程序 - 请参阅 /Ethernet#设备驱动程序/Wireless#设备驱动程序
  2. 您已连接到网络。 电缆已插入或您已连接到无线 LAN
  3. 您的网络接口具有IP 地址
  4. 您的路由表已正确设置。
  5. 您可以ping 本地 IP 地址(例如,您的默认网关)。
  6. 您可以ping 公共 IP 地址(例如,9.9.9.9,这是 Quad9 基金会运营的 DNS 服务器,是一个方便测试的地址)。
  7. 检查您是否可以解析域名(例如,archlinux.org)。

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#Network_Management_section 中的样式通知 中讨论)

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

  1. 确保您的网络接口已列出并已启用。
  2. 连接到网络。 插入以太网电缆或连接到无线 LAN
  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 地址

静态 IP 地址可以使用大多数标准网络管理器以及 dhcpcd 进行配置。

要手动配置静态 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 地址

# 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 和 DHCP

网络管理器

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

提示: 您可以使用 dhcping 检查 DHCPv4 服务器是否正在运行。
注意: 每个网络接口应仅由一个 DHCP 客户端或网络管理器管理,因此建议系统上只运行一个 DHCP 客户端或网络管理器。
软件 连接类型 无线身份验证 IP 地址、路由和 DNS 管理 界面
以太网 PPPoE 移动宽带 WPA/WPA2 WPA3 静态 IP DHCP 客户端 域名解析 CLI TUI GUI
dhclient1 2 内部 是(写入 /etc/resolv.conf
dhcpcd 启动 wpa_supplicant3 内部 (使用 resolvconf 或写入 /etc/resolv.conf dhcpcd-uiAUR
ConnMan [死链接 2023-10-29 ⓘ] 否 是(通过 ofonoAUR 是(通过 wpa_supplicantiwd 内部 (运行内置解析器并写入 /etc/resolv.conf connmanctl(1)
netctl (通过 ppp 是(通过 ppp 是(通过 wpa_supplicant dhcpcddhclient (使用 resolvconf netctl(1) wifi-menu(1)4
NetworkManager (通过 rp-pppoe (通过 modemmanager 是(通过 wpa_supplicantiwd 内部, dhclientdhcpcd5 (使用 systemd-resolved, resolvconf 或写入 /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 客户端

网络接口

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

提示
  • 系统 /usr/lib/systemd/network/99-default.link 通常足以满足大多数情况。
  • 要更改接口名称,请参阅#更改接口名称#恢复到传统接口名称
  • 您可以以 root 用户身份运行 udevadm test-builtin net_setup_link /sys/path/to/network/device 来诊断 .link 文件的问题。
注意: 如果系统固件决定重新编号设备,则在添加或删除 PCIe 设备后,可预测的网络接口名称可能会更改。 请参阅 systemd issue 33347

列出网络接口

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

无线设备名称也可以使用 iw dev 检索。 另请参阅 /Wireless#获取接口名称

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

启用和禁用网络接口

可以使用 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,则将其关闭也会删除路由,而将其重新启动不会自动重新建立默认路由。 有关重新建立它的信息,请参阅#路由表

更改接口名称

注意: 更改命名方案时,请不要忘记更新所有与网络相关的配置文件和自定义 systemd 单元文件,以反映更改。

您可以通过使用 systemd.link(5) 文件手动定义名称来更改设备名称。 例如

/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,因此请确保后者未设置/为空,否则名称将不会更改。 99-default.link 设置 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 端口,则可以使用根据供应商和型号 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 和队列长度

您可以通过使用 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

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

本地网络主机名解析

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

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

技巧和窍门

链路聚合或 LAG

参见netctlsystemd-networkd,或无线 bonding

IP 地址别名

IP 别名是指向一个网络接口添加多个 IP 地址的过程。通过这种方式,网络上的一个节点可以与网络建立多个连接,每个连接服务于不同的目的。典型的用途包括 Web 和 FTP 服务器的虚拟主机,或在无需更新任何其他机器的情况下重组服务器(这对于域名服务器尤其有用)。

示例

要手动为某个网卡设置别名,请使用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 将被相应设置。考虑存在多个网卡的情况,可以使用 ip route 列出默认路由。

混杂模式

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

/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 倍。

似乎 Internet 上的一些损坏的路由器和防火墙正在将比例因子重写为 0,这导致主机之间产生误解。 Linux 内核 2.6.17 引入了一种新的计算方案,生成更高的比例因子,实际上使损坏的路由器和防火墙的后果更加明显。

最终的连接充其量是非常慢或已断开。

如何诊断问题

首先,让我们明确一点:这个问题很奇怪。在某些情况下,您将根本无法使用 TCP 连接(HTTP、FTP 等),而在另一些情况下,您将能够与某些主机(非常少)通信。

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

如果您无法浏览任何网站,但可以 ping 一些随机主机,则很可能您遇到了这个问题:ping 使用 ICMP,不受 TCP 问题的影响。

您可以尝试使用 Wireshark。您可能会看到成功的 UDP 和 ICMP 通信,但 TCP 通信不成功(仅限于外国主机)。

修复方法

坏方法

要以坏方法修复它,您可以更改 tcp_rmem 值,比例因子计算基于该值。尽管它应该适用于大多数主机,但不能保证,特别是对于非常远的主机。

# echo "4096 87380 174760" > /proc/sys/net/ipv4/tcp_rmem
好方法

只需禁用窗口缩放即可。由于窗口缩放是一项不错的 TCP 功能,因此禁用它可能会让人感到不舒服,尤其是在您无法修复损坏的路由器的情况下。有几种禁用窗口缩放的方法,似乎最可靠的方法(适用于大多数内核)是将以下行添加到 /etc/sysctl.d/99-disable_window_scaling.conf(另请参见 sysctl

net.ipv4.tcp_window_scaling = 0
最佳方法

此问题是由损坏的路由器/防火墙引起的,因此让我们更换它们。一些用户报告说,损坏的路由器是他们自己的 DSL 路由器。

更多信息

本节基于 LWN 文章 TCP 窗口缩放和损坏的路由器 和一篇存档的 Kernel Trap 文章:互联网上的窗口缩放

LKML 上也有一些相关的帖子。

localhost 通过网络解析

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

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

/etc/hosts
127.0.0.1        localhost
::1              localhost
注意:FS#56684 中报告任何受此问题影响的软件。这可能有助于将 localhost 条目添加到默认的 /etc/hosts 中。

要允许解析本地主机名,还需要将其添加到 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)

结果,系统解析为以下两个条目

$ getent hosts
127.0.0.1       localhost
127.0.0.1       localhost
127.0.1.1       yourhostname

另请参见