网络配置

来自 ArchWiki
(重定向自 Netstat)

本文介绍如何在 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. 配置您的网络连接
    • 大多数网络使用动态主机配置协议进行网络配置。客户端可以通过独立的 DHCP 客户端或使用网络管理器从 DHCP 服务器自动获取动态或静态 IP 地址。
    • 如果网络没有 DHCP 服务器,您可以为每个客户端手动配置静态 IP 地址、路由表和 DNS 服务器。有关详细信息,请参阅 #静态 IP 地址
注意:安装映像使用

手动

iproute2

此文章或章节需要语言、wiki 语法或风格改进。请参阅 Help:Style 以供参考。

原因:此章节不适合放在 #网络管理 中 – 它不管理任何东西,它只是介绍了 iproute2 软件包。(在 Talk:Network configuration 中讨论)

iproute2base 元软件包的依赖项,并提供 ip(8) 命令行界面,用于管理网络接口IP 地址路由表。请注意,使用 ip 进行的配置在重启后会丢失。对于持久配置,您可以使用脚本和 systemd 单元自动化 ip 命令。另请注意,ip 命令通常可以缩写,但为了清晰起见,本文中将它们拼写出来。

注意:Arch Linux 已弃用 net-tools,转而使用 iproute2[2] 另请参阅 Deprecated Linux networking commands and their replacements

静态 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 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 名称服务器。

参见Router#DNS 和 DHCP 以获取 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 aliasing)是将多个 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 将相应设置。考虑存在多个网卡的情况,可以使用 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 以改善这种情况:窗口缩放(Window Scaling)。在所有数据包中提供的“窗口”值将通过在连接开始时定义一次的比例因子(Scale Factor)进行修改。该 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 window scaling and broken routers 和一篇存档的 Kernel Trap 文章:Window Scaling on the Internet

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

另请参阅