网络配置

来自 ArchWiki
(重定向自 Network

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

检查连接

此文章或章节需要扩充。

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

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

  1. 您的 网络接口 已列出并已启用。否则,请检查设备驱动程序 – 参见 /Ethernet#Device driver/Wireless#Device driver
  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#Style_notice_in_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 地址

可以使用大多数标准网络管理器以及 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 服务器比较表,请参阅路由器#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-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 客户端

网络接口

网络接口由 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 或运行 nmb 的 Linux 的计算机将能够找到您的机器。
    • 通过 mDNS 进行主机名解析。由 nss_mdnsAvahi(有关设置详细信息,请参阅 Avahi#主机名解析)或 systemd-resolved 提供。运行 macOS 或运行 Avahi 或 systemd-resolved 的 Linux 的计算机将能够找到您的机器。较旧的 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 将其接收的所有流量转发到 OS 以进行进一步处理。这与“正常模式”相反,在“正常模式”下,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 被编写出来以改善这种情况:窗口缩放(Window Scaling)。在所有数据包中提供的“窗口”值将通过一个在连接开始时定义一次的比例因子(Scale Factor)进行修改。这个 8 位的比例因子允许窗口最大可比初始的 64KiB 高 32 倍。

似乎互联网上的一些损坏的路由器和防火墙正在将比例因子重写为 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

另请参阅