Linux网络管理

关于网卡

目前的主流网卡为使用以太网络协定所开发出来的以太网卡(Ethernet),因此 Linux 就称呼这种网络接口为 ethN(N 为数字)。 举例来说,主机上面有一张以太网卡,那么主机的网络接口命名就是 eth0(从第一张为 0 号开始)。

然而,从 systemd v197 开始,对于网卡的编号有另一套规则(Predictable Network Interface Names,可预测网络接口命名规则),网卡的界面代号与网卡的来源有关,网卡名称是这样分类的:

  • 第一部分-位置:
    • en:表示以太网Ethernet。
    • wl:表示无线局域网WLAN。
    • ww:表示无线广域网WWAN。
  • 第二部分-类型:
    • p:独立网卡,PCI网卡。
    • o:主板板载网卡,集成设备的设备索引号。
    • s:热插拔网卡,USB之类的扩展槽索引号。
    • nnn(数字):MAC地址+主板信息计算得出的唯一序列。

因此:

  • eno1:代表由主板内置的网卡。
  • ens1:代表由主板内置的 PCI-E 接口的网卡。
  • enp2s0:代表 PCI-E 接口的独立网卡,可能有多个插槽,因此会有 s0, s1… 的编号。
  • eth0:如果上述的名称都不适用,就回到原本的默认网卡编号。
  • wlp3s0:PCI无线网卡。
  • wlp0s2f1u4u1:连接在USB Hub上的无线网卡。
  • wwp0s2f7u2i2:4G网络接收器。

命名流程实际上是Udev进行的

  1. 如果从BIOS中能够获取到可用的板载网卡的索引号,则使用这个索引号命名。例如: eno1。然后进行下一步。
  2. 如果从BIOS中能够获取到可以用的,网卡所在的PCI-E热插拔插槽(PCI槽位号)的索引号,则使用这个索引号命名。例如:ens1。然后进行下一步。
  3. 如果能拿到设备所连接的物理位置(PCI总线号+槽位号)信息,则使用这个信息命名。例如:enp2s0。然后进行下一步。
  4. 前面三个都获取不到,回退到传统的Kernel命名方法,例如:eth0
  5. 使用网卡的MAC地址来命名,一般不会这么做。

与以下Udev规则有关:

  1. /lib/udev/rules.d/75-net-description.rules:检查网卡信息,并填写环境变量。
  2. /usr/lib/udev/rules.d/80-net-setup-link.rules:进行网卡重命名。

可见网卡命名受net.ifnames这个内核命令行参数影响。这个参数都可以在GRUB配置中提供,net.ifnames=1是systemd默认值。

修改命名方式

  1. 修改/etc/default/grub,在GRUB_CMDLINE_LINUX=后添加net.ifnames=0[或1]
  2. 执行grub2-mkconfig -o /路径/grub.cfgupdate-grub,两者等效
  • 内核参数组合使用的时候,其结果如下:
  • net.ifnames=1:网卡名enp5s2
  • net.ifnames=0:网卡名eth0(最传统的方式,eth0eth1)。

通用网络配置文件

  • /etc/netconfig:网络配置数据库,定义了系统支持的各种网络类型,格式为类型名 协议类型 -|v IP簇 协议名 - -
  • /etc/networks:域定义文件,格式为域名 IP [别名],IP的末尾必须为0以表示范围。
  • /etc/service:服务定义文件,格式为服务名 端口/协议 [别名]
  • /etc/hosts:静态域名解析文件,格式为IP 权威域名 [别名]
  • /etc/host.conf:域名解析方式配置文件,可选项如下:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    # 主机查询方式,用逗号分隔多个
    order bind|hosts|nis
    # 后面加上.域名,表示截去指定的域名
    trim .local
    # 允许hosts中给同个域名配置多个IP,默认off
    multi on|off
    # 进行两次查询以防止被欺骗,默认off
    nosprof on|off
    # 发现欺骗情况时记录日志,默认off
    spoofalert on|off
    # 对hosts文件条目进行重排,默认off
    reorder on|off
  • /etc/resolv.conf:DNS服务器配置文件,它可能受不同管理工具的控制,见下文。
  • /etc/hosts.deny:tcp_wrapper的阻止IP文件,每行一个IP。
  • /etc/hosts.allow:tcp_wrapper的放行IP文件,每行一个IP,这个文件一般用不到,因为默认就是放行的。

不同网络管理工具的比较

目前的主流网络管理工具有以下几种:

  • Debian系
    • ifupdown(Debian标准镜像预装)
    • systemd-networkd(Cloud镜像预装)
    • ifupdown2(Proxmox等Debian分支发行版预装)
    • ifupdown-ng(ifupdown迭代计划的目标,尚未决定全面替代)
    • NetworkManager(桌面环境依赖
  • SUSE系
    • netconfig(SUSE 12及以前预装)
    • wicked(SUSE 15及以后预装)
    • NetworkManager(桌面环境依赖
  • Fedora/RHEL系
    • network-scripts(旧版本RHEL、Fedora预装)
    • systemd-networkd(仅Fedora提供,需要用户自己配置)
    • NetworkManager(新版本RHEL预装)
  • Ubuntu
    • Netplan(Ubuntu预装,systemd-networkd/NetworkManager的配置生成器)
    • NetworkManager(桌面环境依赖
  • Arch系
    • Netctl(Arch预装)
    • NetworkManager(桌面环境依赖
  • 通用:
    • systemd-networkd(任何一个systemd发行版都有预装,但是大部分默认禁用)
    • ConnMan(轻量级网络管理套件)

ifupdown

安装

1
2
3
# Debian,默认预装
# 需要额外安装至少一个DHCP客户端
apt install dhcpcd-base ifupdown

介绍

ifupdown是由Debian开发的简化网络配置的高级工具,最早可追溯到早期的netscript配置工具,它由ifupifdownifquery命令,/etc/network/interfaces/etc/network/interfaces.d/*)配置文件和network.service(或networking.service)服务,搭配isc-dhcp-clientdhcpcd(在interfaces中配置DHCP时自动调用),bridge-utils(配置网桥时调用),ppp(配置PPPoE时调用),ifenslave(配置网卡聚合时调用)和wpasupplicant/wirless-tools(配置无线网络时自动调用)进行自动化网络配置。

interfaces文件有一套独特但不难理解的语法。这是一种很传统的方法,但是对有线连接和服务器来说很有效。

ifup命令用于启动网络接口,ifdown命令用于关闭网络接口,它们的选项如下:

1
2
3
4
5
6
7
8
9
-a  自动配置启动所有为auto的网络接口
-n 伪执行
-v 详细回显
-i 配置文件路径 指定所用的配置文件
--no-mappings 不执行任何mapping
--no-scripts 不执行任何脚本,只是启动接口
--no-loopback 不执行任何对回环设备的操作
--force 强制启动|关闭
--ignore-errors 无视任何错误

ifquery命令用于查询网络接口状况,它的选项如下:

1
2
3
空  查询是否存在指定的网络接口
--list 列出所有可用的网络接口
--state 查看指定网络接口信息

ifupdown2

安装

1
2
# Debian
apt install dhcpcd-base ifupdown2

介绍

ifupdown2是古老的ifupdown的完全升级,它由Cumulus Networks使用Python语言开发。

ifupdown2仍然由ifupifdownifquery命令,/etc/network/interfaces/etc/network/interfaces.d/*)配置文件和network.service(或networking.service)服务组成,需要搭配独立的DHCP客户端(目前仅支持isc-dhcp-client),无线网络后端等等使用。

ifup命令用于启动网络接口,ifdown命令用于关闭网络接口,它们的选项如下:

1
2
3
4
5
6
7
8
9
-a  自动配置启动所有为auto的网络接口,隐含-w
-n 伪执行
-v 详细回显
-d Debug级回显
-f|--force 强制启动
-w|--with-depends 连同依赖的接口一起启动
-i 配置文件路径 指定所用的配置文件
-X|--exclute 排除在外,不启动指定的网络接口
-u|--use-current-config 不使用自动保存的接口状态,而总是使用配置文件

ifquery命令用于查询网络接口状况,它的选项如下:

1
2
3
4
5
6
7
8
9
-a  显示所有配置内容
--running 显示运行中的接口的情况
--check 检查语法正确性
--syntax-help 显示interfaces配置文件语法帮助
空 查询是否存在指定的网络接口
-l|--list 列出所有可用的网络接口
--state 查看指定网络接口信息
-T|--type 查看接口类型
-p|--print-dependency 列出接口依赖项

附注

ifupdown2默认会触发内核加载bonding模块,bonding模块在被加载时默认会创建一个实例,也就是bond0,要禁用这一行为,创建/etc/modporbe.d/bonding.conf,写入以下内容:

1
options bonding max_bonds=0

ifupdown-ng

安装

1
2
3
4
5
6
7
# Debian
apt install dhcpcd-base ifupdown-ng

# Debian 13+
# https://groups.google.com/g/linux.debian.devel.mentors/c/kaZDCMkMms4
# 该提议使得ifupdown-ng的ifupdown兼容部分被分离出来,成为一个单独的包
apt install dhcpcd-base ifupdown-ng ifupdown-ng-compat

简介

由网络服务协会(Network Service Association)开发的完全兼容ifupdown和ifupdown2的整合版本。

ifupdown-ng仍然由ifupifdownifquery命令,/etc/network/interfaces/etc/network/interfaces.d/*)配置文件和network.service(或networking.service)服务组成,需要搭配独立的DHCP客户端,无线网络后端等等使用。

配置

ifupdown-ng的主配置文件位于/etc/network/ifupdown-ng.conf,内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 启用钩子脚本
allow_addon_scripts = 1
# 启用自动选择模板配置
allow_any_iface_as_template = 1
# 自动选择执行器
auto_executor_selection = 1
# 创建兼容设备
compat_create_inerfaces = 1
# 和ifupdown2的网桥配置兼容
compat_ifupdown2_bridge_ports_inherit_vlans = 1
# 自动转换模板
implicit_template_conversion = 1
# 使用主机名获取DHCP
use_hostname_for_dhcp = 1

服务配置文件位于/etc/default/networking

1
2
3
4
5
# 是否详细输出
VERBOSE="no"

# 在关机时不执行ifdown
SKIP_DOWN_AT_SYSRESET="yes"

ifup命令用于启动网络接口,ifdown命令用于关闭网络接口,它们的选项如下:

1
2
3
4
5
6
-a  自动配置启动所有为auto的网络接口,隐含-w
-n 伪执行
-v 详细回显
-f|--force 强制启动
-i 配置文件路径 指定所用的配置文件
-X|--exclute 排除在外,不启动指定的网络接口

ifquery命令用于查询网络接口状况,它的选项如下:

1
2
3
4
5
-a  显示所有配置内容
-r|--running 显示运行中的接口的情况
空 查询是否存在指定的网络接口
-L|--list 列出所有可用的网络接口
-s|--state 查看指定网络接口信息

Init脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
#!/bin/sh -e
### BEGIN INIT INFO
# Provides: networking ifupdown
# Required-Start: mountkernfs $local_fs urandom
# Required-Stop: $local_fs
# Default-Start: S
# Default-Stop: 0 6
# Short-Description: Raise network interfaces.
# Description: Prepare /run/network directory, ifstate file and raise network interfaces, or take them down.
### END INIT INFO

#
# Wrapper script for networking set up and teardown via unit file
#
# Thu, 01 Oct 2020 22:47:43 +0200
# -- Maximilian Wilhelm <max@sdn.clinic>
#

STATE_DIR="/run/ifsate"

# Make sure the state dir is present
if [ ! -d "${STATE_DIR}" ]; then
mkdir "${STATE_DIR}"
fi

# Check for require binaries
if [ ! -x /sbin/ifup -o ! -x /sbin/ifdown ]; then
echo "ifup and/or ifdown not found!" >&2
exit 1
fi

# Apply defaults if present (verbose mode, kill switch, etc.)
CONFIGURE_INTERFACES=yes

if [ -f /etc/default/networking ]; then
. /etc/default/networking
fi

ARGS=""
if [ "${VERBOSE}" = yes ]; then
ARGS="-v"
fi

# Let's go
case "$1" in
start)
if [ "${CONFIGURE_INTERFACES}" = no ]; then
echo "Not configuring network interfaces, see /etc/default/networking"
exit 0
fi

ifup -a ${ARGS}
;;

stop)
ifdown -a ${ARGS}
;;

restart)
ifdown -a ${ARGS}
ifup -a ${ARGS}
;;

# reload missing here!

*)
echo "Usage: $0 {start|stop|restart}"
exit 1
;;
esac

exit 0

netconfig

安装

1
2
# SUSE
zypper install sysconfig-netconfig

介绍

一个模块化的管理网络配置的工具,它被旧版本的SUSE采用。它由netconfig命令,存储在/etc/sysconfig/network/中的网络脚本,和network.service服务组成。网络接口可以配置的参数都在脚本中有明显显示,只需要按需要修改后重启服务即可完成网络配置。

命令

netconfig命令有以下操作:
netconfig update 更新网络配置
netconfig modify -i 接口 动态修改接口配置
netconfig remove -i 接口 动态删除接口配置

选项如下:

1
2
3
4
5
6
7
8
9
10
11
--bootproto=dhcp|bootp|none    使用的协议
--gateway=STRING 指定网关
--ip=STRING 指定IP地址
--nameserver=STRING 指定DNS服务器
--netmask=STRING 指定网络掩码
--hostname=STRING 指定主机名
--domain=STRING 指定域名
-d, --device=STRING 指定网络设备
--nodns 不做DNS查询
--hwaddr=STRING 指定网卡的物理地址
--description=STRING 描述性文字

配置

网络接口的配置文件位于/etc/sysconfig/network/ifcfg-*,它的一些选项如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
# 整体选项

# 接口启动方式,可选选项有:
# auto|onboot|hotplug:在系统启动时自动启动
# ifplugd:由ifplugd接管
# nfsroot:自动启动,但不自动停止
# off:禁用
# manual:只能手动启动停止
STARTMODE=

# 接口优先级
# 高优先级接口会优先建立连接
IFPLUGD_PRIORITY=

# 使用的协议,可选选项有:
# static:静态IP
# dhcp|dhcp4|dhcp6:使用DHCP
# autoip:自动获取配置一个闲置IP
# dhcp+autoip:优先使用DHCP,否则使用AutoIP
# 6to4:使用6to4隧道
# none:不配置
BOOTPROTO=

# IP配置,仅在static模式下起作用
# 可以使用CIDR格式
IPADDR=

# 掩码,仅在IPADDR未使用CIDR码时可用
# 已过时
NETMASK=

# 前缀长度,仅在IPADDR未使用CIDR码时可用
PREFIXLEN=

# 广播地址
# 已过时
BROADCAST=

# 远程IP,用于点对点配置
REMOTE_IPADDR=

# 设置接口标签
LABEL=

# 设置MTU
MTU=

# 设置MAC
LLADDR=

# 进行Ethtool设置的选项
ETHTOOL_OPTIONS=

# 是否执行点对点连接建立后的Poll作业
RUN_POLL_TCPIP=

# 由用户手动控制
USERCONTROL=

# Yast中的名称
NAME=

# DHCP选项
DHCLIENT_SET_HOSTNAME=
DHCLIENT_HOSTNAME_OPTION=
DHCLIENT_SET_DEFAULT_ROUTE=
DHCLIENT_ROUTE_PRIORITY

DHCLIENT6_MODE=
DHCLIENT6_RAPID_COMMIT=
DHCLIENT6_SET_HOSTNAME=
DHCLIENT6_HOSTNAME_OPTION=

# 桥接选项
# 该接口是一个网桥
BRIDGE=

# 桥接的物理接口,空格分隔
BRIDGE_PORTS=

# 以太网过期时间,0表示永不过期
BRIDGE_AGEINGTIME=

# 转发延迟
BRIDGE_FORWARDDELAY=

# 发送HELLO包的间隔
BRIDGE_HELLOTIME=

# 判断断开的最大时延
BRIDGE_MAXAGE=

# 接口的代价指数,高速的接口的代价指数较小,空格分隔
BRIDGE_PATHCOSTS=

# 接口优先级,空格分隔
BRIDGE_PORTPRIORITIES=

# 网桥优先级
BRIDGE_PRIORITY=

# 是否启用STP
BRIDGE_STP=

# 聚合选项
# 是否为聚合主设备
BOND_MASTER=

# 聚合模块选项
BONDING_MODULE_OPTS="mode=xxx xmit_hash_policy=xxx lacp_rate=xxx miion=xxx"

# 聚合子网卡
BONDING_SLAVE0=
BONDING_SLAVE1=
...

# 无线设置
# 是否为无线设备
WIRELESS=

# 无线模式,可选选项:
# ad-hoc:自组网
# managed:默认模式
# master:接入点
WIRELESS_MODE=

# 连接的无线网络名
WIRELESS_ESSID=

# 认证模式,可选选项有:
# open:开放网络
# sharedkey:WEP认证
# psk:WPA认证
# eap:企业WPA认证
WIRELESS_AUTH_MODE=

# WPA PSK密码,可以是十六进制加密
WIRELESS_WPA_PSK=

# EAP的具体认证方式,可选:
# TLS
# PEAP
# TTLS
WIRELESS_EAP_AUTH=

# 允许的WPA协议,可选:
# WPA
# RSN
WIRELESS_WPA_PROTO=

# WPA EAP的身份
WIRELESS_WPA_IDENTITY=

# WPA EAP的密码
WIRELESS_WPA_PASSWORD=

# WPA EAP的匿名ID
WIRELESS_WPA_ANONID=

## Type: string
## Default: ""

# WPA-EAP的CA证书
WIRELESS_CA_CERT=

# WPA-EAP的客户端证书
WIRELESS_CLIENT_CERT=

# WPA-EAP的客户端密钥
WIRELESS_CLIENT_KEY=

# WPA-EAP的客户端密钥密码
WIRELESS_CLIENT_KEY_PASSWORD=

# 是否扫描隐藏网络,仅可与wpa_supplicant共用
WIRELESS_HIDDEN_SSID=

# 该无线网络的优先级
WIRELESS_PRIORITY=

# 接入点扫描模式,可选项有:
# 1:wpa_supplicant负责扫描
# 0|2:无线接口驱动负责扫描
WIRELESS_AP_SCANMODE=

# 接入点的MAC地址
WIRELESS_AP=

# 主机在无线网络内的名称
WIRELESS_NICK=

# 网络ID/域名
WIRELESS_NWID=

# 无线网络频段
WIRELESS_CHANNEL=

# 灵敏度,低于该灵敏度的网络会被无视
WIRELESS_SENS=

# 无线网络的比特率
WIRELESS_RATE=

# WEP网络的认证方式,最多可以使用四种,格式为:
# WIRELESS_KEY_0|1|2|3='值'
WIRELESS_KEY=

# WEP密码的长度
WIRELESS_KEY_LENGTH=

# 默认使用的WEP密码,从0,1,2,3中选择
WIRELESS_DEFAULT_KEY=

# PEAP版本号,可选值有:
# 0
# 1
WIRELESS_PEAP_VERSION=

wicked

安装

1
2
# SUSE
zypper install wicked wicked-service

介绍

wicked是SUSE开发的全新集中式网络管理工具,它不仅完全兼容netconfig配置,而且还内置DHCP客户端,热插拔守护进程nanny,支持多种插件。它由/etc/wicked/中的服务配置文件,/etc/sysconfig/network中的网络配置文件,wickedd.service服务(也是network.service的别名)和wicked命令组成。

配置

/etc/wicked/common.xml:wicked所有程序的通用配置。用户不应该修改。
/etc/wicked/local.xml:用户自行修改的wicked所有程序的通用配置。
/etc/wicked/server.xml:wickedd守护进程的配置文件。用户不应该修改。
/etc/wicked/server-local.xml:用户自行修改的wickedd守护进程的配置文件。
/etc/wicked/nanny.xml:热插拔守护进程Nanny的配置文件。用户不应该修改。
/etc/wicked/nanny-local.xml:用户自行修改的热插拔守护进程Nanny的配置文件。
/etc/sysconfig/network/config:网络接口的默认配置文件。
/etc/sysconfig/network/dhcp:网络接口的DHCP客户端的配置文件。
/etc/sysconfig/network/wireless:无线网络的配置文件。
/etc/sysconfig/network/ifcfg-*:各个网络接口的配置文件。
/etc/sysconfig/network/routes/etc/sysconfig/network/ifroute-*:静态路由的配置文件。
/var/run/netconfig/resolv.conf:netconfig生成的DNS配置文件,/etc/resolv.conf是指向它的软链接。

命令

/usr/lib/wicked/bin/wickedd-dhcp4 --test 网络接口名 测试DHCP4连通性
/usr/lib/wicked/bin/wickedd-dhcp6 --test 网络接口名 测试DHCP6连通性
wicked ifcheck all|网络接口名 测试接口连通性
wicked ifup|ifdown all|网络接口名 启动|禁用网络接口
wicked ifreload all|网络接口名 重载网络配置
wicked ifstatus|show all|网络接口名 查看接口状态
wicked show-config 显示网络配置
wicked show-xml 以XML格式显示网络配置

network-scripts

安装

1
2
# RHEL 8-
yum install network-scripts network-scripts-team

介绍

network-scripts是一个纯Shell脚本式的一次性网络配置工具,它被旧版本的RHEL和CentOS采用。它由存储在/etc/sysconfig/network/etc/sysconfig/network-scripts/ifcfg-网络接口名中的网络脚本和network.service服务组成。

注意,network-scripts已经过时,在RHEL 8中,RHEL使用NetworkManager的ifcfg-rh插件作为兼容策略让NetworkManager读取这里的配置。在RHEL 9中这些配置被彻底删除,替代品为位于/etc/NetworkManager/system-connections/keyfile插件。

/etc/sysconfig/network内容如下:

1
2
3
4
5
NETWORKING=yes/no    # 网络是否被配置
FORWARD_IPV4=yes/no # 是否开启IP转发功能
HOSTNAME= # 主机名
GATEWAY= # 网关的IP地址
GATEWAYDEV= # 连接网关的网络接口名

/etc/sysconfig/network-scripts/ifcfg-网络接口名内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
# 匹配方式
DEVICE=xxx # 网络接口设备名
# 或者使用
#HWADDR=xx:xx:xx:xx:xx:xx # MAC地址

NAME=xxxx # 名称,和DEVICE一致
UUID=xxxxxxxx # 唯一识别码

# 基础配置项
TYPE=Ethernet|Wireless # 网络类型
NM_CONTROLLED=yes|no # 是否由NetworkManager接管
ONBOOT=yes|no # 可选yes或no,设备是否在开机时自动激活
BOOTPROTO=none|bootp|dhcp|static # 初始化网卡的协议,可选none,bootp,dhcp,static

# IPv4配置
IPADDR=xxx.xxx.xxx.xxx # IP地址
NETMASK=xxx.xxx.xxx.xxx # 网络掩码
GATEWAY=xxx.xxx.xxx.1 # 网关地址
BROADCAST=xxx.xxx.xxx.255 # 广播地址
DNS1=x.x.x.x # DNS服务器地址
DEFROUTE=yes|np # 是否把该设备设置为IPv4默认路由设备
MTU=xxx # 设置MTU的数值
IPV4_FAILURE_FATAL=yes|no # 是否必须要求IPv4

IPV6INIT=yes|no # 是否启用IPv6
IPV6_AUTOCONF=yes|no # 是否启用IPv6 SLAAC
IPV6_DEFROUTE=yes|no # 是否把该设备设置为IPv6默认路由设备
IPV6_FAILURE_FATAL=yes|no # 是否必须要求IPv6
IPV6_ADDR_GEN_MODE=stable-privacy|EUI64 # IPv6生成方式

# Modem配置
MODEMPORT=/dev/modem # Modem端口的设备名称(如/dev/modem)
LINESPEED=115200 # Modem的线速率(例如,115200)
DEFABORT=yes|no # 可选yes或no,是否插入默认的终止字符串

# PPP配置
PPPOPTIONS=yes|np # 设置PPP选项
PAPNAME=xxxx # 设置PPP逻辑设备名
REMIP=xxx.xxx.xxx.xxx # 设置远端的IP地址(通常不指定)
DISCONNECTTIMEOUT=xxx # 连接终止后重新连接的间隔
RETRYTIMEOUT=xxx # 连接失败后重试的间隔

# 桥接设置
SLAVE=yes # 该设备是一个从设备,用于实现网桥、聚合等等功能
MASTER=xxx # 所属的主设备

# 无线设置
# 无线必须使用NM接管
ESSID=网络名称

修改后重启服务即可应用网络配置。

从NetworkManager迁移到network-scripts

如果在RHEL中不想使用NetworkManager,希望只使用network-scripts的话,先安装network-scripts包,然后执行update-alternatives --config ifup,设为network-scripts的ifup,然后启用network.service服务,最后移除NetworkManager即可。

NetworkManager

安装

1
2
3
4
5
# Debian
apt install network-manager

# RHEL
yum install NetworkManager NetworkManager-tui NetworkManager-wifi NetworkManager-bluetooth NetworkManager-adsl NetworkManager-ppp NetworkManager-wwan NetworkManager-team

介绍

Networkmanager由红帽开发,是一个为系统提供检测和配置功能以便自动连接到网络的程序,它对无线和有线网络都很好用,尤其适应高度动态化的网络环境——因此,很多发行版的桌面版会高度依赖它进行网络管理。

Networkmanager提供了NetworkManager.service服务,nmcli管理工具和基于cursesnmtui终端图形化管理工具,服务配置文件在/var/lib/NetworkManager/NetworkManager.state,网络配置文件在/etc/NetworkManger/NetworkManager.conf/etc/NetworkManger/conf.d//usr/lib/NetworkManager/conf.d//var/lib/NetworkManager/NetworkManager-intern.conf,而且还内置了DHCP客户端和resolv.conf管理功能。

NetworkManager守护进程启动后,会自动连接到已配置且可用的“系统连接”和“用户连接”,未配置的连接则需要通过nmcli进行配置才能连接。

NetworkManager支持热插拔,对于新加载的网卡(凡是用户没有手动编写配置的都算),NetworkManager会自动生成一个临时配置使其联网,当然,如果网卡已经存在用户手动编写的配置,那么就不会再生成。

插拔网卡也可以手动重启Networkmanager服务,或者应用网卡配置。

NetworkManager-dispatcher.service是NetworkManager的调度器服务,它会根据网络的状态,在到达指定的状态时执行/etc/NetworkManager/dispatcher.d中的对应网络状态目录中的脚本,一般包括pre-up.dpre-down.d

NetworkManager-wait-online.service是可选服务,表示等待网络配置完成。“完成”意味着至少有一个网络接口具有IP。

NetworkManager还有network-manager-gnomenetwork-manager-kde的GUI前端,以及cockpit-networkmanager的WebUI前端。

在服务配置文件/var/lib/NetworkManager/NetworkManager.state配置文件中有以下内容:

1
2
3
4
5
6
7
[main]
# NetworkManager接管系统网络
NetworkingEnabled=true
# 启用无线网络
WirelessEnabled=true
# 启用移动宽带
WWANEnabled=true

/etc/NetworkManger/NetworkManager.conf配置文件中可用的配置项有:

1
2
3
4
5
6
7
8
9
10
11
[main]
plugins=keyfile,ifupdown,ifcfg-rh,ifcfg-suse...
auth-polkit=true|root-only|false
no-auto-default=设备名|MAC地址|通配符
hostname-mode=default|dhcp|none
dhcp=internal
dns=systemd-resolved|default|none|dnsmasq
rc-manager=auto|symlink|file|resolvconf|netconfig|unmanaged
systemd-resolved=true|false
autoconnect-retries-default=-1
firewall-backend=iptables|nftables|none
  • plugins=:配置NetworkManager的插件,其中:
    • keyfile表示启用/etc/NetworkManager/system-connections中的配置文件和unmanaged-devices支持。
    • ifupdown表示启用从/etc/network/interfaces中读取网络配置的支持。
    • ifcfg-rh表示启用从/etc/sysconfig/network-scripts/ifcfg-网络接口名中读取网络配置的支持。
  • auth-polkit=:设置是否使用Polkit认证,其中:
    • true:非Root用户使用Polkit认证。
    • root-only:仅Root用户允许使用NetworkManager,非Root用户直接阻止。
    • false:非Root用户不使用Polkit认证,可以自由使用NetworkManager。
  • no-auto-default=:不允许NetworkManager自动配置的网络接口。设为*表示所有。
  • hostname-mode=:临时主机名的配置模式,其中:
    • default:通过DHCP服务器获取主机名进行配置。
    • dhcp:跟default差不多,但是不会进行DNS反向查询以确保主机名唯一性。
    • none:NM完全不管理临时主机名。
  • dhcp=:选择NetworkManager使用的DHCP客户端,其中:
    • internal:使用内置的DHCP客户端。
    • dhcpcd:使用dhcpcd
    • dhclient:使用isc-dhcp-client这是RHEL9的默认设置
  • dns=:选择NetworkManager使用的resolv.conf管理方式,其中:
    • 如果/etc/resolv.conf是指向/run/systemd/resolve/stub-resolv.conf,或/run/systemd/resolve/resolv.conf,或/usr/lib/systemd/resolv.conf的软链接,那么该配置项的默认值是systemd-resolved,否则,该配置项的默认值总是default
    • default:直接使用rc-manager中具体定义的方式修改/etc/resolv.conf,将当前接口的DNS配置写入其中。
    • systemd-resolved:把DNS配置请求转发给systemd-resolved。
    • dnsmasq:使用Dnsmasq进行配置。
    • none:从不修改/etc/resolv.conf,这会导致rc-manager被自动设为unmanaged
  • rc-manager=:设置NM写入/etc/resolv.conf的方式,其中:
    • auto:自动判断不修改、直接写入、resolvconfnetconfig的情况。
    • symlink:仅在/etc/resolv.conf是一个文件时才写入,如果是软链接则不修改。
    • file:无论/etc/resolv.conf是什么,都会写入。
    • resolvconf:调用resolvconf修改/etc/resolv.conf
    • netconfig:调用netconfig修改/etc/resolv.conf
    • unmanaged:从不修改/etc/resolv.conf
  • systemd-resolved=:将DNS配置转发给systemd-resolved,默认值为true。当dns=systemd-resolved时,该配置实际上没什么意义。
  • autoconnect-retries-default=:自动连接的重试次数。
  • firewall-backend=:在配置Masquerading时使用的防火墙后端,如果设置为none,则用户必须手动进行配置。

NetworkManager可以配置网络管理工具兼容,方法很多样。默认情况下,可以使用keyfile插件内置的unmanaged-devices配置项配置排除:

1
2
3
4
5
6
7
[keyfile]
# 支持通配符,分号分隔
# * 所有网卡
# interface-name: 网卡名称
# type: 网卡类型
# except: 排除
unmanaged-devices=interface-name:enp?s?;interface-name:wlan*;type:macvlan;mac:xx:xx

请注意,这里的排除是硬性的,也就是说,排除的设备不受nmcli device set 接口名 managed yes|no命令控制。事实上,Ubuntu就使用了这一配置(/lib/NetworkManager/conf.d/10-globally-managed-devices.conf)阻止NetworkManager接管任何网络接口(以推广自己的Netplan)。

如果启用了ifupdown,还可以直接让ifupdown接管网络:

1
2
[ifupdown]
managed=true

如果managed设置为true,NetworkManager将不会配置在interfaces文件中列出的有线/无线网卡,在interfaces文件中列出的网卡配置将会生效;如果managed设置为false,NetworkManager将会接管所有的有线/无线网卡,interfaces文件中的配置无效。

桌面端的Linux发行版基本都使用NetworkManager(也可能是ConnMan),因为它有着对无线网络的良好支持和优秀的图形界面管理工具,不建议更换,否则会导致各种不可预料的问题,轻则有网络但图形界面下始终显示断网,重则损坏图形界面组件,无法进入图形界面。

在和RHEL的network-scripts一起安装时,通过选择NetworkManager和network-scriptsifup程序决定工作的一方;在和Debian的ifupdown一起安装时,通过配置文件中的managed=选项决定工作的一方。

nmcli命令

nmcli是NetworkManager的CLI管理命令。当然,用户也可以使用TUI工具nmtui

服务管理
nmcli network 查看网络接管状态
nmcli network on|off 接管|不接管系统网络,这实际影响/var/lib/NetworkManager/NetworkManager.state
nmcli radio all|wifi|wwan on|off 启用|禁用无线|移动网络,这实际影响/var/lib/NetworkManager/NetworkManager.state

网卡管理
nmcli device status 查看网卡信息,包括:connected已配置,disconnected已接管但是未配置,unmanaged未接管,unavailable不可用(物理或手动关闭)
nmcli device set 接口名 managed yes|no 接管|不接管网卡配置
nmcli device set 接口名 autoconnect yes|no 启用|禁用网卡自动连接
nmcli device connect 接口名 自动启用网卡的一个连接配置,如果没有配置,那么自动生成一个并启用
nmcli device disconnect 接口名 断开网卡的连接配置
nmcli device reapply 配置名 重载连接配置

连接配置管理
nmcli connection show [--active] 查看连接配置列表
nmcli connection show 配置名 查看连接配置详细信息
nmcli connection add con-name 配置名 type 接口类型[ethernet|wifi] ifname 接口名 其他配置项 添加连接配置,常用配置项如下:

1
2
3
4
5
6
7
8
9
10
11
connection.autoconnect yes|no    # 是否自动连接
# NetworkManager使用在用户空间处理RA的机制,因此会将它管理的网络接口的net.ipv6.conf.接口名.accept_ra值设为0
ipv4[6].method auto|manual|disable # IP配置方法
ipv4[6].address IP/CIDR # 配置IP
ipv4[6].gateway IP # 网关
ipv4.dns IP # DNS服务器
ipv4.ignore-auto-dns true|false # 无视DHCP服务器的DNS
ipv4.ignore-auto-routes true|false # 无视DHCP服务器的路由

ssid 名称 # 无线网络的名称
wifi.hidden yes|no # 无线网络是否隐藏

注:Require IPv4 addressing for this connection意味着必须在能够取得IP的情况下才认为连接应用成功。

nmcli connection edit 配置名 交互式修改配置内容,命令如下:

1
2
3
4
5
6
goto 配置项    # 跳转到配置项
change # 修改配置项
save # 保存
activate # 激活配置项
deactivate # 禁用配置项
quit # 退出

nmcli connection modify 配置名 配置内容 修改配置内容
nmcli connection reload 重载配置
nmcli connection delete 配置名 删除连接配置
nmcli connection up 配置名 [password 网络密码] 启用连接配置
nmcli connection down 配置名 关闭连接配置

WIFI网络
nmcli device wifi list 检测可用的WIFI网络
nmcli device wifi connect 网络名称 password 密码 连接到指定的网络

Keyfile

keyfile是对传统的键值对网络配置方式的兼容解决方案。它通过保存在/etc/NetworkManager/system-connections/接口名.nmconnection的INI风格配置文件配置网络。请注意,文件所有者必须是root,权限必须是600

以太网络接口配置文件示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
[connection]
id=连接配置名
# 类型为以太网
type=ethernet
# 自动连接
autoconnect=true|false
# 应用的网卡
interface-name=网卡名

[ipv4]
# 使用DHCP
[method=auto]
# CIDR IP
address1=
[address2=]
# 网关
gateway=
# DNS服务器
dns=
# 手动路由,格式为CIDR,网关
route1=
[route2=]

[ipv6]
# 无状态配置
[method=auto]
# 无视DHCP发送的DNS
[ignore-auto-dns=true]
# CIDR IP
address1=
[address2=]
# 网关
gateway=
# DNS服务器
dns=
# 手动路由,格式为CIDR,网关
route1=
[route2=]

无线网络配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
[connection]
id=连接配置名
# 类型为wifi
type=wifi
# 自动连接
autoconnect=true|false
# 应用的网卡
interface-name=网卡名

[wifi]
mode=infrastructure # 客户模式
ssid=网络名称

[wifi-security]
auth-alg=open
key-mgmt=wpa-psk
psk=明文密码

[ipv4]
# 使用DHCP
[method=auto]
# CIDR IP
address1=
[address2=]
# 网关
gateway=
# DNS服务器
dns=
# 手动路由,格式为CIDR,网关
route1=
[route2=]

[ipv6]
# 无状态配置
[method=auto]
# 无视DHCP发送的DNS
[ignore-auto-dns=true]
# CIDR IP
address1=
[address2=]
# 网关
gateway=
# DNS服务器
dns=
# 手动路由,格式为CIDR,网关
route1=
[route2=]

网桥配置文件示例:

1
2
3
4
5
6
7
8
[connection]
id=连接配置名
# 类型为网桥
type=bridge
# 自动连接
autoconnect=true|false
# 网桥设备名
interface-name=
1
2
3
4
5
6
7
8
9
10
11
12
[connection]
id=连接配置名
# 类型为以太网
type=ethernet
# 自动连接
autoconnect=true|false
# 物理网卡
interface-name=物理网卡
# 网桥设备
master=
# 网桥模式
slave-type=bridge

VLan配置文件示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[connection]
id=连接配置名
# 类型为网桥
type=bridge
# 自动连接
autoconnect=true|false
# VLan设备名
interface-name=

[vlan]
# 物理网卡
parent=
# VLan ID
id=

使用iwd作为无线网络后端

默认情况下,NetworkManager使用wpa_supplicant作为无线网络后端(注:在Fedora等红帽系列发行版上需要NetworkManager-wifi插件才能使用无线网络,Debian打包中内置了该模块)。

如果要切换到iwd后端,首先安装iwd软件包,然后编辑/etc/NetworkManager/NetworkManager.conf,添加以下内容:

1
2
[device]
wifi.backend=iwd

然后重启NetworkManager.service服务,卸载或禁用wpa_supplicant即可。

  • 执行systemctl disable --now wpa_supplicantsystemctl mask wpa_supplicant禁用服务。

创建无线热点

执行以下命令:

1
nmcli dev wifi hotspot ifname wlp?s? ssid "网络名" password "密码"

执行nmcli dev wifi show-password查看热点密码

也可以使用linux-wifi-hotspot进行简化配置。

从ifupdown迁移到NetworkManager

虽然NetworkManager可以和ifupdown兼容并自动配置,但NetworkManager本身的功能就已经足够强大了,没有保留ifupdown的必要。

  1. 安装NetworkManager
    apt install network-manager
    apt install network-manager-gnome GUI管理界面
  2. 卸载ifupdown
    apt purge ifupdown
    建议一并移除其他的DHCP客户端(并非必要)
    apt purge isc-dhcp-client isc-dhcp-common dhcpcd
  3. 删除配置文件
    rm -rf /etc/network
    rm -rf /etc/dhcp
  4. 修改NetworkManager配置
    编辑/etc/NetworkManager/NetworkManager.conf,删除ifupdown相关内容,添加dhcp=internal

Netplan

安装

1
2
3
4
5
# Debian
apt install netplan.io

# RHEL
yum install netplan netplan-default-backend-NetworkManager

介绍

Netplan实际上是一个网络配置生成器,它需要搭配NetworkManagersystemd-networkd工作(在Ubuntu服务器版为systemd-networkd,桌面版则为NetworkManager),通过Netplan可以让一个配置文件适用于多种管理工具,只需要写一个yaml文件,而且语法相对简单。如图所示:

netplan.png

systemd-networkd

安装

1
2
3
4
# Debian内置,不需要安装

# RHEL
yum install systemd-networkd

介绍

systemd-networkd是systemd套件的一部分,一个管理网络的系统守护进程。它会在网络设备出现时自动检测和配置;还可以创建虚拟网络设备。它由networkctl命令,systemd-networkd服务和按优先级从低到高排列的 /usr/lib/systemd/network 目录、 /run/systemd/network 目录、 /etc/systemd/network 目录中的网络配置文件构成。
它的配置文件在/etc/systemd/networkd.conf/etc/systemd/networkd.conf.d/*.conf/usr/lib/systemd/networkd.conf.d/*.conf

这个服务适用于简单的网络配置,对于配置被 systemd-nspawn 管理的容器或者虚拟机的复杂网络尤其有用。它有内置的DHCP客户端支持,而对无线网络的支持则可以通过搭配无线请求者客户端,比如wpa_supplicantiwd,对配置好的无线适配器进行WiFi请求。

注意,systemd-networkd没有对PPPoE的原生支持。

networkd-dispatcher是模仿NetworkManager-dispatcher实现的networkd调度器服务,和NetworkManager-dispatcher一样,它会根据网络的状态,在到达指定的状态时执行/etc/networkd-dispatcher中的对应网络状态目录中的脚本,一般包括configuring.dconfigured.ddegraded.doff.d

它的网络配置文件名一般为*.network,内容格式基本如下:

1
2
3
4
5
6
7
8
9
[Match]
Name=enp?s?[wlp?s?]

[Network]
# DHCP=ipv4 # 开启IPV4的DHCP客户端
Address=192.168.1.x/24 # 或者使用静态IP
Gateway=192.168.1.1
DNS=10.1.10.1
# DNS=8.8.8.8 # 次要DNS

无线连接

对于无线网络,配置wpa_supplicantiwd的过程相当于接入网线的过程,因此需要先修改wpa_supplicant的配置文件wpa_supplicant-wlp?s?.conf添加WiFi网络,然后执行systemctl start wpa_supplicant@wlp?s?.service,配置好后,无线网卡就进入了等待配置网络信息的状态,此时重启systemd-networkd.service即可。

也可以直接启用wpa_supplicant.serviceiwd.service的主服务,在终端上配置SSID接入后,再启动systemd-networkd.service

从NetworkManager(或ifupdown)切换到systemd-networkd

首先请确定系统中有systemd-networkd.service服务,否则请安装systemd-networkd包。

禁用或移除NetworkManager(ifupdown)
  • systemctl disable NetworkManager
  • apt|yum remove|purge NetworkManager
  • apt purge ifupdown

删除配置文件

  • rm -rf /etc/NetworkManager
  • rm -rf /etc/network

如果安装了其他的DHCP客户端(ifupdown情况下常见),也要一并移除,否则会冲突导致无法获取IP,包括:

  • isc-dhcp-client isc-dhcp-common Debian
  • dhcp-client dhcp-common RHEL
  • dhclient dhcpcd Arch
    删除配置文件
    rm -rf /etc/dhcp
使用.network文件配置网络

/etc/systemd/network 目录存放自定义配置文件,如果不存在的话请自行创建。创建/usr/lib/systemd/network/30-dhcp.network并写入以下通用配置内容:

1
2
3
4
5
[Match]
Name=en*[,wl*] # 方括号内为无线网卡

[Network]
DHCP=yes
启用networkd和resolved服务

systemctl enable --now systemd-networkd.service
systemctl enable --now systemd-resolved.service

systemctl enable --now systemd-networkd-wait-online.service

可选服务:等待网络配置完成,类似于ifupdown-wait-online.serviceNetworkManager-wait-online.service

systemctl enable --now systemd-network-generator.service

可选服务:将内核中的网络配置转换为.network文件并存储在/run/systemd/network/

重写resolv.conf,使用systemd-resolved的方案一,这一步并非必要,但强烈推荐这么做

rm /etc/resolv.conf
ln -s /run/systemd/resolve/stub-resolv.conf /etc/resolv.conf
systemctl restart systemd-resolved.service

示例

  1. 配置静态IP
    或许你想给某个接口配置静态IP,以enp3s0为例,在/etc/systemd/network创建10-enp3s0.network文件,输入以下内容

    1
    2
    3
    4
    5
    6
    7
    [Match]
    Name=enp3s0

    [Network]
    Address=192.168.10.50/24 # 注意CIDR格式
    Gateway=192.168.10.1
    DNS=8.8.8.8

    配置完后别忘了重启服务。

  2. 网桥
    如果要创建网桥,那么需要创建相对应的netdev设备并把网络接口接入。
    首先在/etc/systemd/network创建25-br0.netdev,写入以下内容:

    1
    2
    3
    [NetDev]
    Name=br0
    Kind=bridge

    然后将enp3s0的.network文件的[Network]部分修改为以下内容:

    1
    2
    [Network]
    Bridge=br0 # 不需要Address

    接着,创建网桥的网络配置/etc/systemd/network/25-br0.network

    1
    2
    3
    4
    5
    [Match]
    Name=br0

    [Network]
    DHCP=yes

    最后重启服务,可以用brctl工具 来验证是否创建好了网桥 br0。网卡聚合的流程也类似。

  3. 无线网络
    systemd-networkd的无线网络请求需要搭配一个无限请求者实现,在systemd-networkd处配置完无线网卡后,对wpa_supplicantiwd进行配置(启动D-Bus服务或由模板创建的独立服务),systemd-networkd会自动转交给它进行认证连接。

ConnMan

安装

1
2
# Debian
apt install connman

介绍

ConnMan 是一个命令行网络管理器,内置DNS管理,DHCP与 NTP 支持,可以通过wpa_supplicant、bluez与openvpn分别实现Wi-Fi、蓝牙与VPN功能,专门为嵌入式设备和轻量级系统设计。它由connmanctl管理工具,cmstGUI管理工具,connman.service服务构成,/etc/connman/main.conf是它的配置文件,网络接口自动生成的配置文件保存在/var/lib/connman/下的对应子目录中。

ConnMan与其他网络管理工具冲突,启用ConnMan服务前应禁用其他网络管理服务。
对有线连接,ConnMan有内置的DHCP客户端,采取自动处理的方式。

对于无线连接,ConnMan会通过dbus总线与wpa_supplicant通讯,如果没有开启wpa_supplicant.service服务,连接无线网络时会报错Input/Output Error。

  • connmanctl可以直接在后面调用子命令,也可以进入交互模式后使用子命令。
  • connmanctl technologies可以查看设备支持的网络类型。
  • connmanctl enable|disable wifi|ethernet可以启用|禁用相关网络类型。
  • connmanctl scan wifi可以扫描附近的WiFi。
  • connmanctl services可以列出可用网络及其对应的Hash网络名。
  • 然后便可以通过connmanctl connect 网络名连接网络,可能会要求密码。
  • 通过connmanctl config ethernet_xxxxx --ipv4 manual IP 子网掩码 网关IP设置静态IP。

其他子命令一览如下
通用:
help:帮助菜单。
state:系统属性,在线、离线、对话。
technologies:显示系统支持的技术类型及属性。
enable 技术类型:启动特定的技术类型,以太网、Wifi、3G等。
disable 技术类型:关闭特定技术类型。
enable offline:使用脱机模式。
disable offline:禁用脱机模式。
tether technology on|off:启用或禁用无线网络共享、设置SSID和密码。
services:显示所有可用服务的列表。这包括附近的无线网络,有线以太网连接,蓝牙设备等。
services service:显示该服务的所有属性列表。例如services wifi_6834534139723_managed_none
scan [wifi]:开始扫描指定的新服务,比如扫描当前WiFi网络。
connect 服务名:连接到指定的服务,wifi连接需要一个配置文件才可以。
disconnect:断开连接到指定的服务。
config:配置文件选项。
monitor:侦听并显示Connman发送的dbus信号。如果当前监视的属性发生更改,则将显示更改。
vpnconnections:显示所有可用VPN连接的列表。
vpnconnections connect:显示连接的当前属性。

仅在交互模式下有效:
agent on|off:启用或禁用无线代理,用于输入无线网络密码。
vpnagent on|off:启用或禁用用于输入VPN凭据的VPN代理。

配置选项:
autoconnect on|off:设置服务的autoconnect属性。
ipv4 off|dhcp|manual [address] [netmask] [gateway]:配置服务的IPv4设置。参数off表示不使用IPv4,dhcp表示dhcp将用于获取设置,手动表示给定参数将用作IPv4设置。
ipv6 off|auto|manual [address] [netmask] [gateway]:配置服务的IPv6设置。参数off表示不使用IPv6,auto表示将从网络询问设置,manual表示给定参数将用作IPv6设置。
nameservers dns [...]:设置名称服务器列表,以空格分隔。
timeservers server [...]:设置时间服务器列表,以空格分隔。
domains domain [...]:设置搜索域列表,以空格分隔。
proxy direct|auto URL|manual server[...] [--excludes server[...]]:配置服务的代理设置。direct表示不使用代理。如果使用不带参数的auto,将要求网络进行代理设置。否则,请使用URL作为代理自动配置URL。设置为手动时,第一个服务器列表用作代理服务器,第二个服务器列表的流量将从代理中排除。

监控选项:
services [off]:侦听服务更改,例如获取IP地址的服务。
tech [off]:监听技术变更,例如启用技术。
manager [off]:侦听全局属性,可用技术,服务和对等方的更改。
vpnmanager [off]:侦听添加或删除的vpn连接。
vpnconnection [off]:侦听对vpn连接的更改,例如连接到VPN。

/etc/connman/main.conf中有一些配置项:

1
2
3
4
5
6
[General]
AllowHostnameUpdates=false # 允许修改主机名
PreferredTechnologies=ethernet,wifi # 网络接口优先级
SingleConnectedTechnology=true # 同时只允许一个网络连接
NetworkInterfaceBlacklist=vmnet,vboxnet,virbr,ifb,docker,veth,eth,wlan # 禁用网络接口
EnableOnlineCheck=false # 启用联网测试,只有通过联网测试的网卡才被认为是启动的

如果手动创建网络配置文件,应当保存在/var/lib/connman/文件名.config内容如下

1
2
3
4
5
6
7
8
# 使用DHCP的有线网络
[ethernet_xxx]
Type=wired # 有线网络
Name=Wired # 网络名
AutoConnect=true # 自动连接
IPv4.method=dhcp # IPv4配置方法
IPv6.method=auto # IPv4配置方法
IPv6.privacy=disabled
1
2
3
4
5
6
7
8
9
10
# 使用静态IP的无线网络
[wifi_<HASH>_managed_psk]
Type=wifi
Name=<SSID> # 无线网络SSID
Passphrase=<PASS> # 无线网络密码
IPv4.method=manual # IPv4配置方法
IPv4.netmask_prefixlen=24 # CIDR掩码长度
IPv4.local_address=192.168.0.133 # IP
IPv4.gateway=192.168.0.1 # 网关
AutoConnect=true

Netctl

安装

1
2
# Arch
pacman -Sy netctl

介绍

Netctl是由Arch开发组开发的网络管理工具,它使用wpa_supplicant连接WiFi,使用dhcpclientdhcpcd作为DHCP客户端,使用wifu-menu作为前端,使用ppp作为PPPoE拨号客户端,使用resolvconf作为DNS管理工具。它由/etc/netctl/中的配置文件,netctl-*.service服务和netctl管理工具组成。

配置文件
一个最基本的DHCP配置文件/etc/netctl/dhcp

1
2
3
4
Description='描述'
Interface=enp1s0
Connection=ethernet
IP=dhcp

一个静态IP配置文件/etc/netctl/static-ip

1
2
3
4
5
6
7
Description='描述'
Interface=enp1s0
Connection=ethernet
IP=static
Address=('10.1.10.2/24')
Gateway='10.1.10.1'
DNS=('10.1.10.1')

一个无线网络配置文件/etc/netctl/wlan

1
2
3
4
5
6
7
8
9
10
11
Description='描述'
Interface=wlp2s2
Connection=wireless
Security=wpa
IP=dhcp
ESSID=网络SSID
Key=加密密码
WPAConfigSection=(
'ssid="网络SSID"'
'psk="密码"'
)

你也可以使用wpa_supplicant管理WiFi密码。

一个Bond配置文件/etc/netctl/bond

1
2
3
4
5
6
Description='描述'
Interface='bond0'
Connection=bond
BindsToInterfaces=('eth0' 'eth1')
IP=dhcp
IP6=stateless

修改/etc/netctl/hooks/dhcp以修改使用的DHCP客户端:

1
2
#!/bin/sh
DHCPClient='dhclient'

命令
启动netctl-auto.service开始自动配置过程
netctl start 配置文件启用一个配置文件
netctl enable 配置文件开机时自动启用配置文件
netctl disable 配置文件禁用配置文件
netctl reenable 配置文件重载配置文件

其他

ifupdown(networking.service)与NetworkManager是可以共存的,当在/etc/network/interfaces中配置了网络接口时,NetworkManager自动停止管理对应的网络接口,由配置文件interfaces内的参数对其进行管理,并且会自动将managed参数改为true。

当ifupdown与ConnMan并用时,ifupdown的配置优先级在前。

systemd-networkd可以与NetworkManager并存,NetworkManager会自动解析关系。

systemd-networkd和ConnMan并用时,ConnMan会覆盖网络配置。

更早期的网络管理工具还有linuxconf redhat-config-networksystem-config-network-tuisystem-config-network等,在这里不谈。

FreeBSD

和Linux使用套件管理的方式不同,FreeBSD使用一组纯粹的Shell脚本实现网络配置。这些脚本包括:

  • /etc/network.subr:提供网络配置相关的各种函数的辅助脚本。
  • /etc/rc.d/netif:网络接口配置脚本,它实际上会链式执行以下脚本:
    • /etc/rc.d/dhclient:使用DHCP配置网络接口。
    • /etc/rc.d/rtadvd:进行IPv6 RA自动配置。
    • /etc/rc.d/rtsold:接受DHCPv6自动配置。
    • /etc/rc.d/wpa_supplicant:为无线网络提供请求者信息。
    • /etc/rc.d/ppp:配置PPP服务。
    • /etc/rc.d/routing:配置默认网关和静态路由。
    • /etc/rc.d/defaultroute:等待默认网关配置完成。
    • /etc/rc.d/static_arp:配置静态ARP。
    • /etc/rc.d/static_ndp:配置静态NDP。
    • /etc/rc.d/routed:配置Routed服务。
    • /etc/rc.d/route6d:配置Route6d服务。
    • /etc/rc.d/stf:配置6to4隧道接口。
    • /etc/rc.d/hostname:配置主机名。
    • /etc/rc.d/bridge:配置网桥。
    • /etc/rc.d/netoptions:加载额外的网络内核参数。
    • /etc/rc.d/resolv:配置/etc/resolv.conf
  • /etc/rc.d/ipfw:BSD内核防火墙。
  • /etc/rc.d/ipfilteripfilter防火墙。
  • /etc/rc.d/pf:PF防火墙。

配置

所有网络相关的配置都位于/etc/rc.conf,包括:

  • defaultrouter='IP':默认网关。
  • ipv6_defaultrouter='IP':IPv6默认网关。
  • ifconfig_接口名称='配置内容':对网络接口进行配置,可用配置包括:
    • DHCP:通过/etc/rc.d/dhclient脚本,使用DHCP客户端进行配置。
      • background_dhclient='YES':异步启动DHCP客户端,不等待配置完成。
    • WPA:通过/etc/rc.d/wpa_supplicant脚本进行无线网络认证。
    • inet IP netmask 掩码:调用ifconfig进行静态配置。
    • up:仅仅拉起接口,用于虚拟网络设备的从设备。
  • ifconfig_接口名称_ipv6='配置内容':对网络接口进行IPv6配置,可用配置包括:
    • inet6 IP prefixlen 前缀长度:调用ifconfig进行静态配置。
    • inet6 accept_rtadv:调用/etc/rc.d/rtsold进行自动配置,需要rtsold_enable='YES'
  • rtadvd_interfaces='接口名称':为接口进行IPv6 RA自动配置,需要rtadvd_enable='YES'
  • ipv6_ipv4mapping='YES':启用IPv4的IPv6封装。
  • hostname='主机名':调用/etc/rc.d/hostname配置主机名。
  • local_unbound_enable='YES':本地DNS解析缓存服务,用于主机非DNS服务器的情况。
  • static_routes='路由名称':调用/etc/rc.d/routing配置静态路由。
    • route_路由名称='-net CIDR 路由器':静态路由内容。
  • cloned_interfaces='虚拟接口名称':创建虚拟接口。
    • 对于网桥设备,需要附带:addm 物理接口
    • 对于链路聚合设备,需要附带:laggproto failover|loadbalance|lacp|roundrobin|broadcast laggport 物理接口名 laggport 物理接口名 IP/CIDR

总结与技巧

RHEL系配置静态IP直接使用nmtui

Debian系配置静态IP在/etc/network/interfaces中配置相应网络接口

systemd-networkd配置静态IP在/etc/systemd/network中编写自定义.network文件

Netplan配置静态IP
修改/etc/netplan/00-installer-config.yaml,在使用的网卡下添加以下内容

1
2
3
4
5
6
7
network:
renderer: networkd
ethernets:
ens?p?:
addresses:
- 192.168.1.x/24
version: 2

然后执行netplan apply使其生效。

DHCP客户端

DHCP客户端用于在使用DHCP配置IP的情况下发送DHCP请求并获取主机IP。

isc-dhcp-client

安装

1
2
3
4
5
# Debian
apt install isc-dhcp-client

# RHEL
yum install dhcp-client

介绍

有时候包名也会叫做dhclient,是ISC的标准DHCP客户端,它可以搭配脚本型网络管理程序(如ifupdown,netconfig)实现初始化DHCP注册。

dhcpcd

安装

1
2
# Debian
apt install dhcpcd-base(纯二进制文件)|dhcpcd(带服务)

介绍

较新的DHCP客户端实现。它支持更多功能,而且支持使用守护进程的方式自动化进行网络配置。

执行systemctl enable --now dhcpcd启用服务。

配置

dhcpcd不是一个完整的网络管理器,虽然它支持简单的网络配置,但是无法实现复杂的网络配置。

配置文件位于/etc/dhcpcd.conf,内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
backgrounp    # 后台运行
waitip 4|6 # 等待v4|v6IP配置好才进入后台
persistent # 使dhcpcd退出时不释放IP
controlgroup 组名 # 设置运行用户组
allowinterfaces 模式 # 使用DHCP的网卡
denyinterfaces 模式 # 禁用DHCP的网卡
noarp # 不发送ARP请求
hostname # 向DHCP服务器发送主机名
clientid|duid # 使用MAC或DUID
option domain_name_servers, domain_name, domain_search # 获取DNS信息,默认情况下是不会获取的
option classless_static_routes # 获取静态路由信息
option ntp_servers # 获取NTP信息
#options interface_mtu # 获取MTU信息
option host_name # 获取临时主机名
interface 网卡 # 网卡配置段
bootp # 启用BOOTP模式
blacklist IP/CIDR # 无视的主机
whitelist IP/CIDR # 白名单主机,优先级高于黑名单
noipv4 # 不配置IPv4
noipv6 # 不配置IPv6
noipv6rs # 不自动配置IPv6
leasetime 时间 # 指定租期
timeout 时间 # 请求超时时间
nogateway # 不获取路由
anonymous # 启用RFC 7844匿名DHCP
slaac hwaddr|private # 指定SLAAC模式
static ip_address=IP/CIDR # 请求静态IP
static broadcast_address=IP # 请求静态广播地址
static ip6_address=IP/CIDR # 请求静态IPv6
static routers=IP # 请求静态网关
static domain_name_servers=IP # 请求静态DNS服务器
vendorclassid ID # 设置DHCP 60字段

例如,默认DHCP:

1
2
3
4
5
6
7
8
hostname
duid
persistent
option domain_name_servers, domain_name, domain_search
option classless_static_routes
option ntp_servers
option host_name
#options interface_mtu

静态IP:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#background
#controlgroup network
hostname
duid
persistent
option domain_name_servers, domain_name, domain_search
option classless_static_routes
option ntp_servers
option host_name
interface 网卡
noipv6
static ip_address=192.168.1.23/24
static routers=192.168.1.1
static domain_name_servers=192.168.1.1

dhcpcanon

一个注重匿名的DHCP客户端实现。它使用Python编写,也具有守护进程。

执行systemctl enable --now dhcpcanon启用服务。

网络管理工具内置的DHCP客户端

NetworkManager,systemd-networkd,ConnMan等大多数现代网络管理工具都有内置的DHCP客户端,但是如果检测到系统中安装了其它的DHCP客户端(例如以上两种),它们会被自动禁用。

无线网络

RF

RF是Radio Frequency,无线射频的意思,是否启用RF,决定了无线网卡是否能正常接收信号,也就是是否工作。

rfkill

rfkill是Linux的无线网卡RF管理命令,它的语法如下:
rfkill list 列出所有的射频设备
rfkill block|unblock ID 锁定|解锁指定ID的射频设备
rfkill block|unblock wifi 锁定|解锁指定类型设备,此处是Wifi

systemd-rfkill

systemd-rfkill.service是systemd的无线网卡状态保存服务,它会在关机时保存无线网卡的最后状态(开启还是关闭),然后在开机时启动服务执行/usr/lib/systemd/systemd-rfkill,根据内核命令行参数,恢复或不恢复无线网卡状态。

无线网卡状态保存在/var/lib/systemd/rfkill目录下。

systemd.restore_state=内核命令行参数的值决定了systemd-rfkill.service是否恢复无线网卡状态,如果值为1(默认),那么开机时会恢复无线网卡的最后状态;如果值为0,那么开机时会恢复无线网卡的默认状态。

无线网络请求者

大部分网络管理工具要接入无线网络,都需要引入一个无线网络请求者程序,主要有iw,wpa_supplicant和iwd这三种。

它们的功能包括:

  1. 在用户空间初始化无线设备,Udev仅完成硬件注册(如加载驱动,使其在lspci命令的输出中可见),但是并不会自动创建wl*接口,请求者程序会协助执行该操作。
  2. 扫描可用的无线网络。
  3. 配置认证参数。
  4. 发起认证请求并完成认证。
  5. 建立连接(可能还包含DHCP客户端等功能)。

这就相当于以太网中“插入网线”(链路层建立连接)的过程。

iw

安装
1
2
# Debian
apt install iw
介绍

iwconfigwireless-tools)的继位者,可用于Open,WEP两种认证模式的使用。由iw主干命令和其子命令组成。

修改网卡模式

1
iw dev 网卡设备名 set type ibss

一般为ibss,设置前可能需要关闭网卡,使用ip命令设为down即可。

搜索接入点

1
iw dev 网卡设备名 scan

接入接入点

1
iw dev 网卡设备名 connect "网络ID"  # 无认证
1
iw dev 网卡设备名 connect "网络ID" key 0:密码  # WEP认证

iw只支持WEP认证。

wpa_supplicant

安装
1
2
3
4
5
# Debian
apt install wpasupplicant

# RHEL
yum install wpa_supplicant
介绍

wpa_supplicant的功能比iw更为强大,支持的网卡功能更多,支持 WEP、WPA 和 WPA2认证,可以在桌面、笔记本甚至嵌入式系统中使用。由主程序wpa_supplicant,密码工具 wpa_passphrase和文字界面前端 wpa_cli三个命令,/etc/wpa_supplicant/中的脚本和配置文件wpa_supplicant[-wlxxx].confwpa_supplicant.servicesystemd服务和fi.w1.wpa_supplicant1.serviceDBus服务组成。可以进行手动接入和服务化配置。

wpa_supplicant有一个用Qt写的GUI界面,包名为wpagui

配置文件
主配置文件为wpa_supplicant.conf,设备配置文件为wpa_supplicant[-wlxxx].conf,但如果要使用5G频段,还需要创建/etc/default/crda文件并写入REGDOMAIN=CN|US|...地区,因为不同地区的5G频段是不同的。

手动接入
在主配置文件wpa_supplicant.conf中写入:

1
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev

使用wpa_supplicant命令:wpa_supplicant -B -i 网卡名 -c /etc/wpa_supplicant/wpa_supplicant.conf,选项如下:

1
2
3
4
-B  在后台运行
-c filename  配置文件的路径
-i interface  要监听的设备
-D driver (可选)使用的驱动,运行wpa_supplicant -h以查看所支持的驱动列表

然后就可以启动wpa_cli,如果服务启动成功,你会看到网络扫描的命令行:

  • 执行scan进行扫描。
  • 执行scan_results查看扫描结果。
  • 然后根据网络的SSID,执行add_network 编号 ssid "SSID"添加网络。
  • 执行set_network 编号 key_mgmt 验证模式,没有为NONE,不设定为PSK设置网络验证方式。
  • 执行set_network 编号 psk "密码"提供密码。
  • 执行enable_network 编号接入网络。
  • 执行status查看状态。
  • 执行save_config保存配置。

快速生成配置

1
wpa_passphrase 网络名 密码 >> /etc/wpa_supplicant/wpa_supplicant.conf

按设备自动配置
在网络管理工具处配置好无线网卡后,创建/etc/wpa_supplicant/wpa_supplicant-网卡设备名.conf,写入或导入以下内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev    # 控制接口和服务用户组

network={ # 开放网络
ssid="SSID"
scan_ssid=1 # 扫描隐藏的SSID
key_mgmt=NONE
}

network={ # 普通密码网络
ssid="SSID" # 网络ID
key_mgmt=WPA-PSK # 认证方式
psk="PASSWORD" # 认证密码
}

network={ # TLS网络
ssid="SSID" # 网络ID
key_mgmt=WPA-EAP # 认证协议
eap=TLS # EAP方式
identity="USERNAME@xxx.com" # 认证用户名
password="PASSWORD" # 认证密码
ca_cert="/CA证书路径"
client_cert="/证书路径"
private_key="/密钥路径"
private_key_passwd="密钥密码,如果有的话"
}

network={ # TTLS-MD5两阶段网络
ssid="SSID" # 网络ID
key_mgmt=WPA-EAP # 认证协议
eap=TTLS # EAP方式
identity="USERNAME@xxx.com" # 认证用户名
anonymous_identity="ANONYMOUS@xxx.com" # 匿名用户名
password="密码"
ca_cert="/CA证书路径"
# 第二阶段
phase2="auth=MD5"
}
与systemd-networkd一起使用

首先创建systemd-networkd配置文件/etc/systemd/networkd/20-dhcp.network,内容如下:

1
2
3
4
5
[Match]
Name=wl*

[Network]
DHCP=yes

然后创建/etc/wpa_supplicant/wpa_supplicant-网卡设备名.conf,内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1

network={
ssid="SSID0" # 网络ID
key_mgmt=WPA-PSK # 认证协议
psk="PASSWORD" # 认证密码
}

network={
ssid="SSID" # 网络ID
key_mgmt=WPA-EAP # 认证协议
identity="USERNAME" # 认证用户名
password="PASSWORD" # 认证密码
}

然后使用systemd先启动wpa_supplicant@网卡设备名.service,再重启systemd-networkd.service即可。

也可以启动wpa_supplicant.service服务,然后手动连接。

与NetworkManager一起使用

与NetworkManager一起使用时,wpa_supplicant.service不必启用,因为NetworkManager会通过DBus激活启动fi.w1.wpa_supplicant1.service服务,也就是对应的wpa_supplicant.service服务。

另外,wpa_supplicant@.service不能进行任何实例化,如果wpa_supplicant接管了任何接口,那么NetworkManager就不能再管理这个接口了。

BUG

wpa_supplicant 2.10版本存在BUG,不能连接或创建热点,建议切换为iwd,或降级到2.9。

iwd

安装
1
2
# Debian
apt install iwd
介绍

iwd是Intel开发的无线网络守护程序。该项目的核心目标是不依赖任何外部库,而是最大程度地利用Linux内核提供的功能来优化资源利用。

它由/etc/iwd/中的配置文件,/var/lib/iwd中的密码文件,systemd服务单元iwd.service,DBus服务net.connman.iwd.service,管理工具iwctl,监控工具iwmon和GUI管理工具iwgtk组成。可以独立工作,也可以和ConnMan、systemd-networkd和NetworkManager这样更完善的网络管理器结合使用。

启动iwd.service服务,然后就可以使用iwctl工具进行管理,注意,用户必须在netdev组中,或者有管理员权限。

配置文件
配置文件/etc/iwd/main.conf内容如下,有需要时只需要将想要调整的选项写入即可:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
[General]    # 总配置
EnableNetworkConfiguration=true|false # 是否使用iwd进行网络配置,如IP等等,这会启用iwd内置的DHCP客户端,当iwd不是作为其他网络管理工具的后端时启用
# APRanges=CIDR码 # AP模式下的DHCP池
UseDefaultInterface=true|false # 不允许iwd重写无线设备
# AddressRandomization=true|false # 禁用MAC隐藏
# AddressRandomizationRange=MAC地址段 # 随机MAC地址范围
RoamThreshold=-100到1 # 最小信号强度
RoamThreshold5G=-100到1 # 最小5G信号强度
RoamRetryInterval=整数 # 重试连接的间隔
# ManagementFrameProtection=0|1|2 # 配置MFP,0完全禁用,1可用时启用,2总是启用
# ControlPortOverNL80211=true|false # 是否启用EAPoL协议
# DisableANQP=true|false # 是否禁用ANQP
# DisableOCV=true|false # 是否禁用OCV
# SystemdEncrypt=true|false # 将网络文件加密,测试性选项
Country=国家代号 # 设置5G频段国家

[Network] # 网络配置,注意,EnableNetworkConfiguration必须设为true才有效
NameResolvingService=systemd|resolvconf # DNS服务后端,可选systemd-resolved和resolvconf
EnableIPv6=true|false # 是否启用IPv6
RoutePriorityOffset=整数 # 设置路由指标

[Blacklist] # 屏蔽策略,iwd可以自动屏蔽连接不正常的接入点
InitialTimeout=整数 # 初始超时点数,单位为秒
Multiplier=整数 # 每次尝试连接失败增加的点数
MaximumTimeout=整数 # 屏蔽的点数

[Rank] # 自动连接策略
BandModifier5Ghz=浮点数 # 5G接入点的优先级
BandModifier6Ghz=浮点数 # 6G接入点的优先级

[Scan] # 扫描策略
DisablePeriodicScan=true|false # 禁用定期扫描
InitialPeriodicScanInterval=整数 # 初始定期扫描间隔
MaximumPeriodicScanInterval=整数 # 最大定期扫描间隔
DisableRoamingScan=true|false # 漫游状态下,禁用扫描,这会导致无法正常漫游

手动接入

  • iwctl:进入交互式控制台
  • device list:列出无线设备
  • station 设备名 scan:扫描网络
  • station 设备名 get-networks:获取可用网络
  • station 设备名 connect SSID:连接网络,如果要求输入网络密码,将会提示用户输入
  • iwctl --passphrase 密码 station 设备名 connect SSID:连接时给出密码
  • station 设备名 show:查看连接状态
  • wsc list:查看支持WPS/WSC的设备
  • wsc 设备名 push-button:开始进行WSC连接
  • station 设备名 disconnect:断开连接
  • device|station 设备名 show:查看设备信息
  • known-networks list:查看记住的网络
  • known-networks SSID forget:忘记网络

使用密码文件
密码文件保存在/var/lib/iwd中,文件名格式为SSID.加密协议,内容格式如下:

WPA-PSK:/var/lib/iwd/SSID.psk

1
2
3
4
5
6
7
8
9
10
11
12
13
[Security]
Passphrase=密码明文
# PreSharedKey=加密密码 # 加密密码不用手动写入,会自动根据明文创建

[Settings]
AutoConnect=True # 是否自动连接

[IPv4] # IP设置,注意EnableNetworkConfiguration必须设为true才有效
Address=192.168.1.10
Netmask=255.255.255.0
Gateway=192.168.1.1
Broadcast=192.168.1.255
DNS=192.168.1.1

PWD:/var/lib/iwd/SSID.8021x

1
2
3
4
5
6
7
[Security]
EAP-Method=PWD
EAP-Identity=用户名
EAP-Password=密码

[Settings]
AutoConnect=True

TLS:/var/lib/iwd/SSID.8021x

1
2
3
4
5
6
7
8
9
[Security]
EAP-Method=TLS
EAP-TLS-ClientCert=/证书路径
EAP-TLS-ClientKey=/密钥路径
EAP-TLS-CACert=/CA证书路径
EAP-TLS-ServerDomainMask=域名地址

[Settings]
AutoConnect=true

TTLS-PAP两阶段:/var/lib/iwd/SSID.8021x

1
2
3
4
5
6
7
8
9
10
11
12
[Security]
EAP-Method=TTLS
EAP-Identity=用户名
EAP-TTLS-CACert=/CA证书路径
EAP-TTLS-ServerDomainMask=域名地址
# 二阶段PAP验证
EAP-TTLS-Phase2-Method=Tunneled-PAP
EAP-TTLS-Phase2-Identity=用户名
EAP-TTLS-Phase2-Password=密码

[Settings]
AutoConnect=true

PEAP-MSCHAPV2两阶段:/var/lib/iwd/SSID.8021x

1
2
3
4
5
6
7
8
9
10
11
12
[Security]
EAP-Method=PEAP
EAP-Identity=用户名
EAP-PEAP-CACert=/CA证书路径
EAP-PEAP-ServerDomainMask=域名地址
# 二阶段MSCHAP验证
EAP-PEAP-Phase2-Method=MSCHAPV2
EAP-PEAP-Phase2-Identity=用户名
EAP-PEAP-Phase2-Password=密码

[Settings]
AutoConnect=true
与NetworkManager一起使用

与NetworkManager一起使用时,iwd.service不必启用,因为NetworkManager会通过DBus激活启动net.connman.iwd.service服务,也就是对应的iwd.service服务。

另外,/etc/iwd/main.conf中不能设置EnableNetworkConfiguration=true,如果iwd接管了任何接口,那么NetworkManager就不能再管理这个接口了。

与systemd-networkd一起使用

首先创建/etc/iwd/main.conf,写入以下内容:

1
2
3
4
[General]
EnableNetworkConfiguration=false
UseDefaultInterface=true
# 我们不需要iwd再做任何网络配置,只需要做WiFi后端

然后启动iwd.service

(该过程可以使用Impala取代)创建密码文件/var/lib/iwd/网络名.psk,内容如下:

1
2
3
4
5
[Security]
Passphrase=密码明文

[Settings]
AutoConnect=True

如果服务启动正常,执行iwctl station 设备名 connect SSID可以接入无线网络。

创建systemd-networkd配置文件/etc/systemd/networkd/20-dhcp.network,内容如下:

1
2
3
4
5
[Match]
Name=wl*

[Network]
DHCP=yes

然后重启systemd-networkd.service即可。

TUI前端

Impala是Iwd的TUI前端,可以简化无线网络的配置,尤其是在不使用NetworkManager的情况下也可以提供优秀的TUI体验。

DNS

静态resolv.conf

/etc/resolv.conf是Linux系统原生的DNS客户端配置文件,其功能较少,只能进行静态DNS服务器配置,配置项主要有以下两种:

  • search 域名一 域名二 ...:指定搜索域,即按照指定的顺序从域名中解析请求的非FQDN的主机名。它的在过去是domain 域名,不过这种用法已经过时。
  • nameserver 服务器IP:指定DNS服务器的IP,最多只能有三个。

网络管理工具自动生成的resolv.conf

NetworkManager,ConnMan等网络管理工具会自动配置DNS并生成/etc/resolv.conf文件,不需要进行额外的设置。

resolvconf

安装

1
2
# Debian
apt install resolvconf

介绍

resolvconf是一个resolv.conf管理框架,它由resolvconf命令,resolvconf.service服务和一系列脚本组成,可以搭配ifupdown,NetworkManager,dhclient,pppd等网络工具,实现更加自定义的DNS服务器配置。

例如,使用dhclient时,会触发/etc/dhcp/dhclient-enter-hooks.d/resolvconf脚本,自动更新系统的DNS服务器。使用ifupdown时,若设置了dns-nameserverdns-search项,也会自动更新系统的DNS服务器。

resolvconf主要提供了根据接口优先级选择使用的DNS服务器的方法。接口优先级文件位于/etc/resolvconf/interface-order,这个文件的每一行都是一个网络接口名,允许使用通配符与正则表达式。

命令选项如下:

1
2
--enable-updates    # 启用resolvconf的自动更新
--disable-updates # 禁用resolvconf的自动更新,脚本不会再起作用

openresolv

安装

1
2
# Debian
apt install openresolv

介绍

一个resolv.conf管理框架,同时也是resolvconf的完善版本。它由resolvconf命令,/etc/resolvconf.conf配置文件,resolvconf.service服务和一系列脚本组成,可以搭配dhcpcd,iwd,Netctl,NetworkManager,ifupdown等网络工具使用,而且还支持把DNS服务器IP传递给DNS服务端程序如BIND,dnsmasq,pdnsd,Unbound等等。

/etc/resolvconf.conf主要配置项有以下几个:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
resolvconf=YES|NO    # 是否启用resolvconf管理
allow_interfaces="" # 仅配置指定的网卡
deny_interfaces="" # 不配置指定的网卡
search_domains="" # 手动配置动态生成的搜索域
search_domains_append="" # 手动配置动态生成的搜索域,追加到resolv.conf中
domain_blacklist="" # 拒绝解析的域名,可以使用通配符
name_servers="" # 手动配置DNS服务器
name_servers_append="" # 手动配置DNS服务器,追加到resolv.conf中
name_server_blacklist="" # 不接受使用的DNS服务器,就算获取到这里的DNS服务器也不会使用
resolv_conf="/etc/resolv.conf" # resolv.conf文件的路径

dnsmasq_conf="" # 生成的dnsmasq的配置文件的路径
dnsmasq_resolv="" # 生成的dnsmasq的的解析文件的路径
unbound_conf="" # 生成的unbound的配置文件的路径
unbound_insecure=YES|NO # 是否对unbound启用DNSSEC

systemd-resolved

安装

1
2
3
4
5
# Debian 12+
apt install systemd-resolved

# RHEL 9+
yum install systemd-resolved

介绍

systemd-resolved是systemd的DNS自动化管理组件,他的功能比传统DNS管理工具更加强大,尤其适合与systemd-networkd配合使用。它由resolvectlsystemd-resolved.service和多个配置文件组成。

systemd-resolved的灵活性极强,有四种工作模式,取决于/etc/resolv.conf是否为软连接, 以及该软连接指向的目标。一般来说,标准的做法是将/etc/resolv.conf设置为指向/run/systemd/resolve/stub-resolv.conf的软链接,systemd-resolved会实时更新这个文件;而兼容的做法是保持/etc/resolv.conf为静态文件,systemd-resolved会从中读取DNS服务器信息。

systemd-resolved的控制命令为resolvectl,当它作为resolvconf被调用时(创建软链接/usr/bin/resolvconf,指向/usr/bin/resolvectl,Arch Linux的systemd-resolvconf包就是这么做的),将以兼容模式运行,用法与resolvconf类似。注意,即使是兼容模式,它也仍然需要systemd-resolved.service后端

部分命令选项如下:

1
2
3
4
5
query 域名|IP    # 解析域名或IP
status # 显示全局DNS设置,这是默认命令
statistics # 显示统计数据
reset-statistics # 重设统计数据
flush-caches # 清除DNS缓存

蓝牙

安装

1
2
3
4
5
6
7
# Debian
apt install bluetooth
# 这等价于
apt install bluez bluez-cups bluez-obexd bluez-meshd

# RHEL
yum install bluez

介绍

bluez是Linux蓝牙管理套件,由/etc/bluetooth/etc/default/bluetooth配置文件,bluetooth.service服务和bluetoothctl管理命令组成。

如果蓝牙服务状态未激活,则必须先启用它,才能使用蓝牙控制命令。

修改/etc/default/bluetooth,设置BLUETOOTH_ENABLED=1启用蓝牙。

/etc/bluetooth/main.conf为主配置文件,一些内容如下:

1
2
3
4
5
6
7
DiscoverableTimeout = 180    # 可被发现的持续时间,默认为180秒
Alwayspairable = false # 总是可配对状态,默认关
PairableTimeout = 0 # 可被配对的持续时间,默认无限
NameResolving = true # 解析蓝牙设备名,默认开
FastConnectable = false # 开启快速连接技术,耗电量会增加,默认关
Experimental = false # 启用实验性dbus支持,默认关
KernelExperimental = false # 启用实验性内核功能,默认关

启动蓝牙bluetoothctl power on
启用代理(生成配对码)bluetoothctl agent on
检查默认代理bluetooth default-agent
扫描蓝牙设备bluetoothctl scan on
停止扫描bluetoothctl scan off
扫描时会显示类似以下内容的输出信息

1
2
3
4
5
6
7
Discovery started
[CHG] Controller 00:28:F8:34:8B:12 Discovering: yes
[NEW] Device 21:F5:18:8C:69:27 21-F5-18-8C-69-27
[NEW] Device FC:69:47:7C:9D:A3 ruwido BLE
[NEW] Device DC:56:E7:3A:DC:1E DC-56-E7-3A-DC-1E
[NEW] Device 64:1C:AE:77:3B:77 [TV] I.B.E Crib
[CHG] Device 64:1C:AE:77:3B:77 Class: 0x000c043c

所有蓝牙设备都标记为Device,后跟它们各自的MAC地址。
bluetoothctl还会在输出中尝试显示设备的名称,例如ruwido BLE。
配对蓝牙设备bluetoothctl pair FC:69:47:7C:9D:A3
这会与指定MAC地址的设备尝试进行蓝牙配对。
列出已配对设备bluetoothctl paired-devices
列出配对过的所有设备bluetoothctl devices
连接蓝牙设备bluetoothctl connect FC:69:47:7C:9D:A3
对于已经配对过的设备,可以使用connect命令简单地连接到它们
信任|取消信任蓝牙设备bluetoothctl trust|untrust FC:69:47:7C:9D:A3
信任的蓝牙设备在可用时会自动连接
断开蓝牙设备的连接bluetoothctl disconnect FC:69:47:7C:9D:A3
取消蓝牙设备的配对bluetoothctl remove FC:69:47:7C:9D:A3
开启可被发现bluetoothctl discoverable on
开启可被配对bluetoothctl pairable on
阻止蓝牙设备(禁止对方申请配对)bluetoothctl block FC:69:47:7C:9D:A3
进入交互式命令行bluetoothctl
进入后可以省去bluetoothctl父命令直接进行操作
也可以使用 darkhz/bluetuith 进行TUI配置

自动连接

蓝牙设备的自动连接可以通过 jrouleau/bluetooth-autoconnect 实现。
克隆仓库,将bluetooth-autoconnect修改为755权限,所有者为root,然后移动到/usr/local/bin,然后创建服务bluetooth-autoconnect.service,保存在/etc/systemd/system,内容如下:

1
2
3
4
5
6
7
8
9
10
[Unit]
Description=Bluetooth autoconnect service
Before=bluetooth.service

[Service]
Type=simple
ExecStart=/usr/local/bin/bluetooth-autoconnect -d

[Install]
WantedBy=bluetooth.service

之后,执行systemctl enable --now bluetooth-autoconnect.service启动服务。