21 - 网络配置详解(iwctl 与替代方案)

网络是现代 Linux 系统的命脉。本章将从 Linux 网络栈基础讲起,深入讲解 iwd/iwctl 无线网络管理,
并全面覆盖 NetworkManager、systemd-networkd、wpa_supplicant 等替代方案,以及有线网络、DNS、
防火墙、VPN 等关键主题。Arch Linux 给予用户最大的网络配置自由——也意味着你需要真正理解它。


21.1 Linux 网络栈基础

网络接口

Linux 将所有网络设备抽象为网络接口。常见接口命名:

前缀含义示例
lo回环接口lo
eth传统以太网eth0
enPredictable 以太网enp3s0eno1
wl无线接口wlan0wlp2s0
wwWWAN(移动网络)wwan0

查看所有网络接口:

ip link show

IP 地址

# 查看所有接口的 IP 地址
ip addr show
 
# 临时添加 IP
ip addr add 192.168.1.100/24 dev enp3s0
 
# 删除 IP
ip addr del 192.168.1.100/24 dev enp3s0

路由

# 查看路由表
ip route show
 
# 添加默认网关
ip route add default via 192.168.1.1 dev enp3s0
 
# 添加静态路由
ip route add 10.0.0.0/8 via 192.168.1.254

DNS

DNS 配置文件为 /etc/resolv.conf

nameserver 8.8.8.8
nameserver 1.1.1.1
search example.com

在现代 Arch 系统中,/etc/resolv.conf 通常由 systemd-resolvedNetworkManager 管理,
不建议手动编辑。


21.2 iwd 架构与安装

iwd 是什么

iwd(iNet Wireless Daemon)是 Intel 开发的现代无线网络守护进程,用于替代 wpa_supplicant
其架构包含:

组件功能
iwd核心守护进程,管理无线连接
iwctl交互式命令行客户端
iwmon无线监控工具(调试用)
libelliwd 依赖的底层库(Embedded Linux Library)

安装与启动

# 安装
pacman -S iwd
 
# 启动并设为开机自启
systemctl enable --now iwd.service

验证服务状态:

systemctl status iwd.service

21.3 iwctl 交互式命令详解

进入 iwctl 交互模式:

iwctl

基本操作流程

# 列出所有无线设备
[iwd]# device list

# 扫描可用网络(以 wlan0 为例)
[iwd]# station wlan0 scan

# 显示扫描结果
[iwd]# station wlan0 get-networks

# 连接到网络(会提示输入密码)
[iwd]# station wlan0 connect "MyWiFi"

# 查看连接状态
[iwd]# station wlan0 show

# 断开连接
[iwd]# station wlan0 disconnect

非交互式用法

# 直接在命令行完成操作
iwctl station wlan0 scan
iwctl station wlan0 get-networks
iwctl --passphrase "my_password" station wlan0 connect "MyWiFi"

管理已知网络

[iwd]# known-networks list
[iwd]# known-networks "MyWiFi" forget
[iwd]# known-networks "MyWiFi" show

适配器管理

[iwd]# adapter list
[iwd]# adapter phy0 show
[iwd]# adapter phy0 set-property Powered on

WPS 连接

[iwd]# wsc list
[iwd]# wsc wlan0 push-button
[iwd]# wsc wlan0 start-pin 12345678

21.4 WPA2/WPA3 Enterprise 连接

企业级 Wi-Fi(如 eduroam)需要手动创建配置文件。

/var/lib/iwd/ 下创建 eduroam.8021x 文件:

[Security]
EAP-Method=PEAP
EAP-Identity=anonymous@example.edu
EAP-PEAP-CACert=/etc/ssl/certs/ca-certificates.crt
EAP-PEAP-ServerDomainMask=*.example.edu
EAP-PEAP-Phase2-Method=MSCHAPV2
EAP-PEAP-Phase2-Identity=user@example.edu
EAP-PEAP-Phase2-Password=your_password
 
[Settings]
AutoConnect=true

支持的 EAP 方法:

方法说明
PEAP最常见的企业认证
TTLS隧道 TLS
TLS证书认证
PWD密码认证

EAP-TLS 示例(证书认证):

[Security]
EAP-Method=TLS
EAP-Identity=user@example.com
EAP-TLS-CACert=/etc/ssl/certs/ca.pem
EAP-TLS-ClientCert=/etc/ssl/certs/client.pem
EAP-TLS-ClientKey=/etc/ssl/private/client.key
 
[Settings]
AutoConnect=true

21.5 iwd 配置文件详解

全局配置

主配置文件位于 /etc/iwd/main.conf

[General]
EnableNetworkConfiguration=true
AddressRandomization=once
AddressRandomizationRange=full
 
[Network]
EnableIPv6=true
NameResolvingService=systemd
RoutePriorityOffset=300
 
[Scan]
DisablePeriodicScan=false
InitialPeriodicScanInterval=1
MaximumPeriodicScanInterval=300
 
[Blacklist]
InitialTimeout=60
Multiplier=30
MaximumTimeout=86400

网络配置文件

已连接网络的凭据保存在 /var/lib/iwd/ 目录:

文件扩展名网络类型
.open开放网络
.pskWPA/WPA2 Personal
.8021xWPA Enterprise

PSK 网络配置示例(/var/lib/iwd/MyWiFi.psk):

[Security]
PreSharedKey=abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890
Passphrase=my_password
 
[Settings]
AutoConnect=true
Hidden=false

21.6 iwd 作为独立网络管理器

iwd 可以独立运行,无需 NetworkManager 或 dhcpcd。

/etc/iwd/main.conf 中启用内置 DHCP 和 DNS:

[General]
EnableNetworkConfiguration=true
 
[Network]
NameResolvingService=systemd

配合 systemd-resolved 处理 DNS:

systemctl enable --now systemd-resolved.service
ln -sf /run/systemd/resolve/stub-resolv.conf /etc/resolv.conf

如果不想使用 systemd-resolved,可改用 resolvconf

[Network]
NameResolvingService=resolvconf

静态 IP 配置

在网络配置文件中添加 [IPv4] 段:

[IPv4]
Address=192.168.1.100
Netmask=255.255.255.0
Gateway=192.168.1.1
Broadcast=192.168.1.255
DNS=8.8.8.8

21.7 iwd 常见问题排查

查看日志

journalctl -u iwd.service -b

使用 iwmon 进行无线诊断

# 启用监控模式
iwmon

常见问题

问题解决方案
找不到无线设备检查驱动是否加载:lspci -kdmesg | grep wifi
扫描无结果确认射频未被禁用:rfkill listrfkill unblock wifi
连接后无 IP启用 EnableNetworkConfiguration=true 或安装 dhcpcd
DNS 无法解析检查 /etc/resolv.conf 是否正确配置
WPA3 连接失败确认内核和驱动支持 SAE
频繁断连检查电源管理:iw dev wlan0 set power_save off

21.8 替代方案:NetworkManager

NetworkManager 是最流行的全功能网络管理器,适合桌面用户。

安装

pacman -S networkmanager
systemctl enable --now NetworkManager.service

注意:NetworkManager 与 iwd 不能同时管理同一接口。如果要让 NetworkManager 使用 iwd 作为后端:

# /etc/NetworkManager/conf.d/wifi_backend.conf
[device]
wifi.backend=iwd

nmcli 命令行工具

# 查看所有连接
nmcli connection show
 
# 查看设备状态
nmcli device status
 
# 扫描并连接 Wi-Fi
nmcli device wifi list
nmcli device wifi connect "MyWiFi" password "my_password"
 
# 创建静态 IP 连接
nmcli connection add type ethernet con-name "static-eth" ifname enp3s0 \
 ipv4.method manual ipv4.addresses 192.168.1.100/24 \
 ipv4.gateway 192.168.1.1 ipv4.dns "8.8.8.8 1.1.1.1"
 
# 启用/禁用连接
nmcli connection up "static-eth"
nmcli connection down "static-eth"
 
# 修改已有连接
nmcli connection modify "MyWiFi" ipv4.dns "8.8.8.8"
 
# 删除连接
nmcli connection delete "MyWiFi"

nmtui 文本界面

nmtui

提供直观的 TUI 界面,适合不熟悉 nmcli 的用户。


21.9 替代方案:systemd-networkd + systemd-resolved

纯 systemd 方案,轻量且无额外依赖。

启用服务

systemctl enable --now systemd-networkd.service
systemctl enable --now systemd-resolved.service
ln -sf /run/systemd/resolve/stub-resolv.conf /etc/resolv.conf

有线 DHCP 配置

创建 /etc/systemd/network/20-wired.network

[Match]
Name=enp3s0
 
[Network]
DHCP=yes
DNS=8.8.8.8
DNS=1.1.1.1
 
[DHCPv4]
RouteMetric=100

无线网络

systemd-networkd 本身不管理无线连接,需要配合 iwdwpa_supplicant

配合 iwd 的 networkd 配置示例(/etc/systemd/network/25-wireless.network):

[Match]
Name=wlan0
 
[Network]
DHCP=yes
 
[DHCPv4]
RouteMetric=600

静态 IP 配置

[Match]
Name=enp3s0
 
[Network]
Address=192.168.1.100/24
Gateway=192.168.1.1
DNS=8.8.8.8
DNS=1.1.1.1

21.10 替代方案:wpa_supplicant + dhcpcd

传统方案,最灵活但配置最繁琐。

安装

pacman -S wpa_supplicant dhcpcd

配置 wpa_supplicant

# 生成配置文件
wpa_passphrase "MyWiFi" "my_password" > /etc/wpa_supplicant/wpa_supplicant-wlan0.conf

配置文件内容:

ctrl_interface=/run/wpa_supplicant
update_config=1
country=CN

network={
 ssid="MyWiFi"
 psk=abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890
 key_mgmt=WPA-PSK
 priority=1
}

启动

systemctl enable --now wpa_supplicant@wlan0.service
systemctl enable --now dhcpcd@wlan0.service

wpa_cli 交互式操作

wpa_cli -i wlan0
> scan
> scan_results
> add_network
> set_network 0 ssid "MyWiFi"
> set_network 0 psk "my_password"
> enable_network 0
> save_config
> quit

21.11 替代方案:ConnMan 与 netctl

ConnMan

Intel 开发的轻量网络管理器:

pacman -S connman
systemctl enable --now connman.service
 
# 使用 connmanctl
connmanctl technologies
connmanctl enable wifi
connmanctl scan wifi
connmanctl services
connmanctl connect wifi_xxxx_managed_psk

netctl(Arch 传统方案)

pacman -S netctl
 
# 复制模板
cp /etc/netctl/examples/ethernet-dhcp /etc/netctl/my-ethernet
cp /etc/netctl/examples/wireless-wpa /etc/netctl/my-wifi

编辑 /etc/netctl/my-wifi

Description='My WiFi'
Interface=wlan0
Connection=wireless
Security=wpa
ESSID='MyWiFi'
Key='my_password'
IP=dhcp
# 启动
netctl start my-wifi
 
# 设为开机自启
netctl enable my-wifi
 
# 自动切换(需要 wpa_actiond)
systemctl enable netctl-auto@wlan0.service

netctl 现已不太活跃,新安装推荐使用 iwd 或 NetworkManager。


21.12 有线网络配置

使用 systemd-networkd

# /etc/systemd/network/20-wired.network
[Match]
Name=enp3s0
 
[Network]
DHCP=yes

使用 dhcpcd

pacman -S dhcpcd
systemctl enable --now dhcpcd@enp3s0.service

手动配置(临时)

ip link set enp3s0 up
ip addr add 192.168.1.100/24 dev enp3s0
ip route add default via 192.168.1.1
echo "nameserver 8.8.8.8" > /etc/resolv.conf

21.13 静态 IP vs DHCP

特性DHCP静态 IP
配置难度自动获取需手动指定
适用场景普通客户端服务器、固定设备
IP 冲突DHCP 服务器管理需自行避免
灵活性IP 可能变化固定不变

dhcpcd 静态 IP

编辑 /etc/dhcpcd.conf

interface enp3s0
static ip_address=192.168.1.100/24
static routers=192.168.1.1
static domain_name_servers=8.8.8.8 1.1.1.1

21.14 DNS 配置

systemd-resolved

systemctl enable --now systemd-resolved.service
ln -sf /run/systemd/resolve/stub-resolv.conf /etc/resolv.conf

配置 /etc/systemd/resolved.conf

[Resolve]
DNS=8.8.8.8#dns.google 1.1.1.1#cloudflare-dns.com
FallbackDNS=9.9.9.9 149.112.112.112
DNSSEC=allow-downgrade
DNSOverTLS=opportunistic
Domains=~.
Cache=yes

查看状态:

resolvectl status
resolvectl query archlinux.org

手动管理 /etc/resolv.conf

如果不使用任何 DNS 管理器:

# 防止被覆盖
chattr +i /etc/resolv.conf

21.15 网桥、VLAN 与 Bonding

网桥(Bridge)

使用 systemd-networkd 创建网桥:

# /etc/systemd/network/10-bridge.netdev
[NetDev]
Name=br0
Kind=bridge
# /etc/systemd/network/11-bind-to-bridge.network
[Match]
Name=enp3s0
 
[Network]
Bridge=br0
# /etc/systemd/network/12-bridge-dhcp.network
[Match]
Name=br0
 
[Network]
DHCP=yes

VLAN

# /etc/systemd/network/10-vlan100.netdev
[NetDev]
Name=vlan100
Kind=vlan
 
[VLAN]
Id=100
# /etc/systemd/network/11-enp3s0.network
[Match]
Name=enp3s0
 
[Network]
VLAN=vlan100

使用 ip 命令临时创建:

ip link add link enp3s0 name vlan100 type vlan id 100
ip addr add 10.0.100.1/24 dev vlan100
ip link set vlan100 up

Bonding(链路聚合)

# /etc/systemd/network/10-bond0.netdev
[NetDev]
Name=bond0
Kind=bond
 
[Bond]
Mode=802.3ad
TransmitHashPolicy=layer3+4
MIIMonitorSec=1s
LACPTransmitRate=fast
# /etc/systemd/network/11-bond0-slave.network
[Match]
Name=enp3s0 enp4s0
 
[Network]
Bond=bond0

21.16 防火墙

nftables(推荐)

pacman -S nftables
systemctl enable --now nftables.service

基本规则文件 /etc/nftables.conf

#!/usr/sbin/nft -f
 
flush ruleset
 
table inet filter {
 chain input {
 type filter hook input priority filter; policy drop;
 ct state established,related accept
 iif "lo" accept
 ct state invalid drop
 icmp type echo-request accept
 tcp dport 22 accept
 tcp dport { 80, 443 } accept
 }
 
 chain forward {
 type filter hook forward priority filter; policy drop;
 }
 
 chain output {
 type filter hook output priority filter; policy accept;
 }
}
# 重新加载规则
nft -f /etc/nftables.conf
 
# 查看当前规则
nft list ruleset

iptables(传统)

# 基本规则
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -j DROP
 
# 保存规则
iptables-save > /etc/iptables/iptables.rules
systemctl enable --now iptables.service

firewalld

pacman -S firewalld
systemctl enable --now firewalld.service
 
firewall-cmd --zone=public --add-service=ssh --permanent
firewall-cmd --zone=public --add-port=8080/tcp --permanent
firewall-cmd --reload
firewall-cmd --list-all

21.17 网络调试工具

工具用途安装包
ip接口/路由/地址管理iproute2(预装)
ss套接字统计iproute2(预装)
pingICMP 连通性测试iputils(预装)
traceroute路由追踪traceroute
digDNS 查询bind-tools
nslookupDNS 查询bind-tools
tcpdump抓包分析tcpdump
nmap端口扫描nmap
mtr增强版 traceroutemtr
curlHTTP 请求测试curl(预装)
ethtool网卡参数查看ethtool

常用命令示例

# 查看监听端口
ss -tlnp
 
# 查看所有连接
ss -tunap
 
# DNS 查询
dig archlinux.org
dig @8.8.8.8 archlinux.org +short
 
# 追踪路由
traceroute -n archlinux.org
mtr archlinux.org
 
# 抓包
tcpdump -i enp3s0 -n port 80
tcpdump -i any -w capture.pcap
 
# 测试带宽
pacman -S iperf3
iperf3 -s # 服务端
iperf3 -c 1.2.3.4 # 客户端

21.18 VPN 配置

WireGuard

pacman -S wireguard-tools

生成密钥对:

wg genkey | tee privatekey | wg pubkey > publickey

客户端配置 /etc/wireguard/wg0.conf

[Interface]
PrivateKey = <客户端私钥>
Address = 10.0.0.2/24
DNS = 1.1.1.1
 
[Peer]
PublicKey = <服务端公钥>
Endpoint = vpn.example.com:51820
AllowedIPs = 0.0.0.0/0, ::/0
PersistentKeepalive = 25
# 启动
wg-quick up wg0
 
# 设为开机自启
systemctl enable --now wg-quick@wg0.service
 
# 查看状态
wg show

使用 systemd-networkd 管理 WireGuard:

# /etc/systemd/network/50-wg0.netdev
[NetDev]
Name=wg0
Kind=wireguard
 
[WireGuard]
PrivateKey=<客户端私钥>
ListenPort=51820
 
[WireGuardPeer]
PublicKey=<服务端公钥>
Endpoint=vpn.example.com:51820
AllowedIPs=0.0.0.0/0
PersistentKeepalive=25
# /etc/systemd/network/51-wg0.network
[Match]
Name=wg0
 
[Network]
Address=10.0.0.2/24
DNS=1.1.1.1

OpenVPN

pacman -S openvpn
# 使用配置文件连接
openvpn --config client.ovpn
 
# 设为服务
cp client.ovpn /etc/openvpn/client/client.conf
systemctl enable --now openvpn-client@client.service

21.19 网络方案选型指南

使用场景推荐方案
桌面用户(GNOME/KDE)NetworkManager
极简安装 / 服务器systemd-networkd + iwd
仅需 Wi-Fi(安装时)iwctl
容器 / 虚拟化宿主systemd-networkd + 网桥
传统服务器dhcpcd 或 systemd-networkd
嵌入式 / IoTConnMan 或 iwd 独立模式

关键原则:同一时间只运行一个网络管理器,避免冲突。
例如不要同时启用 NetworkManager 和 systemd-networkd。