网络配置
本文介绍如何在 OSI 第 3 层及以上层配置网络连接。介质特定的内容在 /Ethernet 和 /Wireless 子页面中处理。
检查连接
要排除网络连接故障,请检查以下条件并确保满足这些条件
- 您的网络接口已列出并已启用。否则,请检查设备驱动程序 - 请参阅 /Ethernet#Device driver 或 /Wireless#Device driver。
- 您已连接到网络。网线已插入,或者您已连接到无线局域网。
- 您的网络接口具有 IP 地址。
- 您的路由表已正确设置。
- 您可以 ping 本地 IP 地址(例如您的默认网关)。
- 您可以 ping 公共 IP 地址(例如
9.9.9.9
,这是一个由 Quad9 基金会运营的 DNS 服务器,是一个方便的测试地址)。 - 检查您是否可以解析域名(例如
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 错误指示)或没有回复,这可能与配置不完整有关,但也可能与您的默认网关或您的 Internet 服务提供商 (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 地址
# 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 和 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_supplicant 或 iwd) | 是 | 内部 | 是(运行内置解析器并写入 /etc/resolv.conf ) |
connmanctl(1) | 是 | 是 | |
netctl | 是 | 是(通过 ppp) | 是(通过 ppp) | 是(通过 wpa_supplicant) | 否 | 是 | dhcpcd 或 dhclient | 是(使用 resolvconf) | netctl(1) | wifi-menu(1)4 | 否 |
NetworkManager | 是 | 是(通过 rp-pppoe) | 是(通过 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 客户端。
网络接口
网络接口由 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 文件的问题。
列出网络接口
有线和无线接口名称都可以通过 ls /sys/class/net
或 ip link
找到。请注意,lo
是虚拟环回接口,不用于建立网络连接。
无线设备名称也可以使用 iw dev
检索。另请参阅 /Wireless#获取接口名称。
如果未列出您的网络接口,请确保您的设备驱动程序已成功加载。请参阅 /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) 文件手动定义名称来更改设备名称。例如
/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"
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
以包含单行 您的主机名
/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#主机名解析)或 systemd-resolved 提供。运行 macOS 或运行 Avahi 或 systemd-resolved 的 Linux 的计算机将能够找到您的机器。较旧的 Win32 API 不支持 mDNS,这可能会阻止某些较旧的 Windows 应用程序访问您的设备。
- 通过 Microsoft 的 NetBIOS 进行主机名解析。由 Linux 上的 Samba 提供。它只需要
技巧和窍门
绑定或 LAG
请参阅 netctl 或 systemd-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 window scaling and broken routers 和一篇存档的 Kernel Trap 文章:Window Scaling on the 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
要允许解析本地主机名,请将其也添加到 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