网络配置

出自 ArchWiki
(重定向自 Configuring network

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

检查连接

本条目或章节需要扩充。

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

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

  1. 您的 网络接口 已列出并已启用。否则,请检查设备驱动程序 – 请参阅 /Ethernet#设备驱动程序/Wireless#设备驱动程序
  2. 您已连接到网络。网线已插入,或者您已连接到无线局域网
  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:风格 以获取参考。

原因: 分为使用 iproute2 的手动配置和使用 DHCP & SLAAC 的自动配置。(在 Talk:Network configuration#网络管理部分中的风格提示 中讨论)

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

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

手动

iproute2

本条目或章节需要语言、wiki 语法或风格改进。请参阅 Help:风格 以获取参考。

原因: 本节不适合 #网络管理 – 它不管理任何东西,它只介绍了 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 以包含一行 您的主机名

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

或者,使用 hostnamectl(1)

# hostnamectl hostname yourhostname

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

# hostname yourhostname

要设置“漂亮”主机名和其他机器元数据,请参阅 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,或 无线绑定

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

似乎 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 文章:Internet 上的窗口缩放

LKML 上也有几个相关的帖子。

localhost 通过网络解析

nss-myhostname(8)NSS 模块,由 systemd 提供,并在 /etc/nsswitch.conf 中默认启用)向 IP 地址提供 localhost 和本地主机名解析。但是,某些软件可能仍然直接读取 /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

另请参阅