网络配置
本文描述了如何在 OSI Layer 3 及以上配置网络连接。介质相关的具体配置在 /Ethernet 和 /Wireless 子页面处理。
检查连接
要排除网络连接故障,请按以下条件检查并确保您满足它们
- 您的 网络接口 已列出并启用。否则,请检查设备驱动程序——请参见 /Ethernet#Device driver 或 /Wireless#Device driver。
- 您已连接到网络。网线已插入或您已 连接到无线局域网。
- 您的网络接口具有 IP 地址。
- 您的 路由表 设置正确。
- 您可以 ping 一个本地 IP 地址(例如您的默认网关)。
- 您可以 ping 一个公共 IP 地址(例如
9.9.9.9,这是由 Quad9 Foundation 运营的一个 DNS 服务器,是一个方便测试的地址)。 - 检查您是否可以解析域名(例如
archlinux.org)。
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 来进一步诊断到主机的路由。
网络管理
要设置网络连接,请按以下步骤进行
- 确保您的 网络接口 已列出并启用。
- 连接到网络。插入网线或 连接到无线局域网。
- 配置您的网络连接:
- 大多数网络使用 动态主机配置协议 进行网络配置。客户端可以通过 独立的 DHCP 客户端或使用网络管理器 从 DHCP 服务器自动获取动态或静态 IP 地址。
- 如果网络没有 DHCP 服务器,您可以为每个客户端手动配置静态 IP 地址、路由表和 DNS 服务器。有关详细信息,请参见 #静态 IP 地址。
- systemd-networkd,它被配置为 以太网、WLAN 和 WWAN 网络接口的 DHCP 客户端,以及
- systemd-resolved 配置为系统范围的 DNS,请参见 systemd-resolved#DNS。
手动
iproute2
iproute2 是 base 元软件包 的依赖项,并提供 ip(8) 命令行接口,用于管理 网络接口、IP 地址 和 路由表。请注意,使用 ip 所做的配置在重启后将会丢失。要实现持久化配置,可以使用脚本和 systemd 单元 来自动化 ip 命令。另请注意,ip 命令通常可以缩写,但在本文中为了清晰起见,会写出完整的命令。
静态 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
路由表
路由表用于确定您是否可以直接到达一个 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
自动配置
自动网络配置是通过 动态主机配置协议 (DHCP) 实现的。网络上的 DHCP 服务器在收到 DHCP 客户端的请求后,提供 IP 地址、默认网关 IP 地址,并可选择性地提供 DNS 名称服务器。
有关 DHCP 服务器的比较表,请参见 Router#DNS and 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_supplicant 或 iwd) | 是 | 内置 | 是(运行内置解析器并写入 /etc/resolv.conf) |
connmanctl(1) | 是 | 是 |
| netctl | 是 | 是(通过 ppp) | 是(通过 ppp) | 是(通过 wpa_supplicant) | 是 | dhcpcd 或 dhclient | 是(使用 resolvconf) | netctl(1) | wifi-menu(1)4 | 否 |
| NetworkManager | 是 | 是(通过 ppp) | 是(通过 modemmanager) | 是(通过 wpa_supplicant 或 iwd) | 是 | 内置,dhclient 或 dhcpcd5 | 是(使用 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-resolved 或 resolvconf) | iwctl(1) | impala | iwgtkAUR |
- 自 2022 年初起不再维护。ISC 建议不再用于生产环境。
- 无线身份验证可以单独使用 wpa_supplicant 或 iwd 进行配置。
- 无线身份验证必须单独使用 wpa_supplicant 进行配置。
- 只能管理 Wi-Fi 连接。
- NetworkManager 不使用 dhcpcd 进行 DHCPv6,请参见 NetworkManager#DHCP client。
网络接口
网络接口由 udev 管理,并通过 systemd.link(5) 文件进行配置。默认配置使用 可预测的网络接口名称 为您的 网络接口控制器 分配名称,这些名称的前缀为 en(有线/以太网)、wl(无线/无线局域网)或 ww(移动宽带/无线广域网)。请参阅 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/net 或 ip 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,那么禁用它将也会移除路由,启用它不会自动重新建立默认路由。请参见 #路由表 以重新建立它。更改接口名称
您可以通过在 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"
net0、net1、wifi0、wifi1。有关详细信息,请参见 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 添加到 内核参数 中。
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
或者,使用 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_mdns和 Avahi(有关设置详情请参见 Avahi#Hostname resolution)或 systemd-resolved 提供。运行 macOS 或运行 Avahi 或 systemd-resolved 的 Linux 计算机将能够找到您的机器。较旧的 Win32 API 不支持 mDNS,这可能会阻止一些旧的 Windows 应用程序访问您的设备。
- 通过 Microsoft 的 NetBIOS 进行主机名解析。在 Linux 上由 Samba 提供。它只需要
技巧与提示
绑定或 LAG
请参见 netctl 或 systemd-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)。