网络配置

出自 ArchWiki
(重定向自 Ip

本文介绍如何在 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#网络管理部分中的风格提示 中讨论)

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

  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 服务器比较表,请参阅 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 共享网络),并且希望能够使用不同的 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

要设置“漂亮”主机名和其他计算机元数据,请参阅 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 将其接收的所有流量转发到操作系统以进行进一步处理。这与“正常模式”相反,在“正常模式”下,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 值,缩放因子计算基于此值。虽然它应该适用于大多数主机,但不能保证,特别是对于非常遥远的主机。

# 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

另请参阅