21 - 网络配置详解(iwctl 与替代方案)
网络是现代 Linux 系统的命脉。本章将从 Linux 网络栈基础讲起,深入讲解 iwd/iwctl 无线网络管理,
并全面覆盖 NetworkManager、systemd-networkd、wpa_supplicant 等替代方案,以及有线网络、DNS、
防火墙、VPN 等关键主题。Arch Linux 给予用户最大的网络配置自由——也意味着你需要真正理解它。
21.1 Linux 网络栈基础
网络接口
Linux 将所有网络设备抽象为网络接口。常见接口命名:
| 前缀 | 含义 | 示例 |
|---|---|---|
lo | 回环接口 | lo |
eth | 传统以太网 | eth0 |
en | Predictable 以太网 | enp3s0、eno1 |
wl | 无线接口 | wlan0、wlp2s0 |
ww | WWAN(移动网络) | wwan0 |
查看所有网络接口:
ip link showIP 地址
# 查看所有接口的 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.254DNS
DNS 配置文件为 /etc/resolv.conf:
nameserver 8.8.8.8
nameserver 1.1.1.1
search example.com
在现代 Arch 系统中,
/etc/resolv.conf通常由systemd-resolved或NetworkManager管理,
不建议手动编辑。
21.2 iwd 架构与安装
iwd 是什么
iwd(iNet Wireless Daemon)是 Intel 开发的现代无线网络守护进程,用于替代 wpa_supplicant。
其架构包含:
| 组件 | 功能 |
|---|---|
iwd | 核心守护进程,管理无线连接 |
iwctl | 交互式命令行客户端 |
iwmon | 无线监控工具(调试用) |
libell | iwd 依赖的底层库(Embedded Linux Library) |
安装与启动
# 安装
pacman -S iwd
# 启动并设为开机自启
systemctl enable --now iwd.service验证服务状态:
systemctl status iwd.service21.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=true21.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 | 开放网络 |
.psk | WPA/WPA2 Personal |
.8021x | WPA Enterprise |
PSK 网络配置示例(/var/lib/iwd/MyWiFi.psk):
[Security]
PreSharedKey=abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890
Passphrase=my_password
[Settings]
AutoConnect=true
Hidden=false21.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.821.7 iwd 常见问题排查
查看日志
journalctl -u iwd.service -b使用 iwmon 进行无线诊断
# 启用监控模式
iwmon常见问题
| 问题 | 解决方案 |
|---|---|
| 找不到无线设备 | 检查驱动是否加载:lspci -k、dmesg | grep wifi |
| 扫描无结果 | 确认射频未被禁用:rfkill list、rfkill 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=iwdnmcli 命令行工具
# 查看所有连接
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 本身不管理无线连接,需要配合 iwd 或 wpa_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.121.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.servicewpa_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
> quit21.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_psknetctl(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.servicenetctl 现已不太活跃,新安装推荐使用 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.conf21.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.conf21.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=yesVLAN
# /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 upBonding(链路聚合)
# /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=bond021.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 rulesetiptables(传统)
# 基本规则
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.servicefirewalld
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-all21.17 网络调试工具
| 工具 | 用途 | 安装包 |
|---|---|---|
ip | 接口/路由/地址管理 | iproute2(预装) |
ss | 套接字统计 | iproute2(预装) |
ping | ICMP 连通性测试 | iputils(预装) |
traceroute | 路由追踪 | traceroute |
dig | DNS 查询 | bind-tools |
nslookup | DNS 查询 | bind-tools |
tcpdump | 抓包分析 | tcpdump |
nmap | 端口扫描 | nmap |
mtr | 增强版 traceroute | mtr |
curl | HTTP 请求测试 | 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.1OpenVPN
pacman -S openvpn# 使用配置文件连接
openvpn --config client.ovpn
# 设为服务
cp client.ovpn /etc/openvpn/client/client.conf
systemctl enable --now openvpn-client@client.service21.19 网络方案选型指南
| 使用场景 | 推荐方案 |
|---|---|
| 桌面用户(GNOME/KDE) | NetworkManager |
| 极简安装 / 服务器 | systemd-networkd + iwd |
| 仅需 Wi-Fi(安装时) | iwctl |
| 容器 / 虚拟化宿主 | systemd-networkd + 网桥 |
| 传统服务器 | dhcpcd 或 systemd-networkd |
| 嵌入式 / IoT | ConnMan 或 iwd 独立模式 |
关键原则:同一时间只运行一个网络管理器,避免冲突。
例如不要同时启用 NetworkManager 和 systemd-networkd。