Linux网络管理

关于网卡

目前的主流网卡为使用以太网络协定所开发出来的以太网卡 (Ethernet),因此 Linux 就称呼这种网络接口为 ethN (N 为数字)。 举例来说,主机上面有一张以太网卡,那么主机的网络接口命名就是 eth0 (从第一张为 0 号开始)。
然而,从 systemd v197 开始,对于网卡的编号有另一套规则 (Predictable Network Interface Names,可预测网络接口命名规则) ,网卡的界面代号与网卡的来源有关,网卡名称是这样分类的:
en:表示以太网Ethernet
wl:表示无线局域网WLAN
ww:表示无线广域网WWAN
o:主板板载网卡,集成设备的设备索引号
p:独立网卡,PCI网卡
s:热插拔网卡,USB之类的扩展槽索引号
nnn(数字):MAC地址+主板信息计算得出的唯一序列
eno1:代表由主板内置的网卡
ens1:代表由主板内置的 PCI-E 接口的网卡
enp2s0:代表 PCI-E 接口的独立网卡,可能有多个插槽,因此会有 s0, s1… 的编号
eth0:如果上述的名称都不适用,就回到原本的默认网卡编号
wlp3s0:PCI无线网卡
wlp0s2f1u4u1:连接在USB上的无线网卡

命名流程

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

systemd的对应行为流程
按照如下顺序执行udev的rule

  1. /usr/lib/udev/rules.d/60-net.rules,使用/lib/udev/rename_device这个程序对网卡进行重命名。
  2. /usr/lib/udev/rules.d/71-biosdevname.rules,如果系统中安装了biosdevname,且内核参数指定biosdevname=1,且上一步没有重命名网卡,则按照biosdevname的命名规范,从BIOS中取相关信息来命名网卡。要求SMBIOS的版本要高于2.6,且系统中要安装biosdevname程序。
  3. /lib/udev/rules.d/75-net-description.rules,检查网卡信息,填写这些udev属性值:ID_NET_NAME_ONBOARD,ID_NET_NAME_SLOT,ID_NET_NAME_PATH,ID_NET_NAME_MAC
  4. /usr/lib/udev/rules.d/80-net-name-slot.rules,如果在60-net.rules ,71-biosdevname.rules这两条规则中没有重命名网卡,且内核指定net.ifnames=1参数,则udev依次尝试使用以下属性值来命名网卡:ID_NET_NAME_ONBOARD,ID_NET_NAME_SLOT,ID_NET_NAME_PATH,如果这些属性值都没有,则放弃网卡重命名。

可见网卡命名受 biosdevname和net.ifnames这两个内核参数影响。这两个参数都可以在grub配置中提供,biosdevname=0是系统默认值(Dell服务器默认是1),net.ifnames=1是系统默认值。

修改命名方式

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

要点

  1. 如系统BIOS符合要求,且系统中安装了biosdevname,且biosdevname=1启用,则biosdevname命名优先。
  2. 如果BIOS不符合biosdevname要求或biosdevname=0,则仍然是ifnames优先。
  3. 如果用户自己定义了udev rule来修改内核设备名字,则用户规则最优先。

不同网络管理工具的比较

目前的主流网络管理工具有以下几种:
ifupdown(Debian预装),netconfig(SUSE和旧版本RHEL预装),NetworkManager(新版本RHEL预装),Netplan(Ubuntu预装),Netctl(Arch预装),systemd-networkd(任何一个systemd发行版都有预装,但是默认不启用),ConnMan(一些轻量级发行版和嵌入式系统使用)

ifupdown

ifupdown是由Debian开发的简化网络配置的高级工具,最早可追溯到早期的netscript配置工具,它由ifupifdownifquery命令,/etc/network/interfaces(/etc/network/interfaces.d/*)配置文件和network.service(或networking.service)服务,搭配resolvconf(自动获取DNS服务器),isc-dhcp-clientdhcpcd5(在interfaces中配置DHCP时自动调用),bridge-utils(配置网桥时调用),ppp(配置PPPoE时调用)和wpasupplicant/wirless-tools(配置无线网络时自动调用)进行自动化网络配置,interfaces文件有一套独特但不难理解的语法。这是一种很传统的方法,对有线网和服务器很有效,但对于无线网则略显麻烦。
ifup命令用于启动网络接口,ifdown命令用于关闭网络接口,它们的选项如下:

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

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

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

ifupdown2

ifupdown2是古老的ifupdown的完全升级,它由Cumulus Networks使用Python语言开发。
ifupdown2仍然由ifupifdownifquery命令,/etc/network/interfaces(/etc/network/interfaces.d/*)配置文件和network.service(或networking.service)服务组成,需要搭配独立的DHCP客户端,无线网络后端等等使用。
ifup命令用于启动网络接口,ifdown命令用于关闭网络接口,它们的选项如下:

1
2
3
4
5
6
7
8
9
-n  伪执行
-v 详细回显
-d Debug级回显
-f|--force 强制启动
-a 自动配置启动所有为auto的网络接口,隐含-w
-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 列出接口依赖项

netconfig

netconfig是一个模块化的管理网络配置的工具,它被旧版本的RHEL和CentOS,以及SUSE采用。它由netconfig命令,存储在/etc/sysconfig/network/config(RHEL中为/etc/sysconfig/network/etc/sysconfig/network-scripts/ifcfg-网络接口名)的网络脚本,和network.service服务组成。网络可以配置的参数都在脚本中有明显显示,只需要按需要修改后重启服务即可完成网络配置。
netconfig命令有以下操作选项:

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内容如下:

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
DEVICE=name    # 网络接口设备名
HWADDR=xx:xx:xx:xx:xx:xx # MAC地址
UUID=xxxxxxxx # 唯一识别码
TYPE=Ethernet # 网络类型
IPADDR=addr # IP地址
DNS1=8.8.8.8 # DNS服务器地址
IPV6INIT=no # 是否启用IPv6
NM_CONTROLLED=yes # 是否由NetworkManager接管
NETMASK=mask # 网络掩码
NETWORK=addr # 网络地址
BROADCAST=addr # 广播地址
GATEWAY=addr # 网关地址
ONBOOT=answer # 可选yes或no,设备是否在开机时激活
USERCTL=answer # 可选yes或no,非root用户是否可控制此设备
BOOTPROTO=proto # 使用的协议,可选none,bootp,dhcp,static

PERSIST=answer # 可选yes或no,设备是否一直保持激活
MODEMPORT=port # modem端口的设备名称(如“/dev/modem”)
LINESPEED=baud # modem的线速率(例如,"115200")
DEFABORT=answer # 可选yes或no,是否插入默认的终止字符串

DEFROUTE=answer # 可选yes或no,是否把该设备设置为默认路由设备
ESCAPECHARS=answer # 可选yes或no,是否使用预定义的asyncmap
HARDFLOWCTL=answer # 可选yes或no,是否使用硬件流控制
PPPOPTIONS=options # 设置PPP选项
PAPNAME=name # 设置PPP逻辑设备名
REMIP=addr # 设置远端的IP地址(通常不指定)
MTU=value # 设置MTU的数值
MRU=value # 设置MRU的值
DISCONNECTTIMEOUT=value # 连接终止后重新连接的间隔
RETRYTIMEOUT=value # 连接失败后重试的间隔

NetworkManager

Networkmanager由红帽开发,是一个为系统提供检测和配置功能以便自动连接到网络的程序,它对无线和有线网络都很好用。Networkmanager提供了NetworkManager.service服务,nmcli管理工具和基于curses的nmtui终端图形化管理工具,配置文件在/etc/NetworkManger/NetworkManager.conf。NetworkManager守护进程启动后,会自动连接到已配置且可用的“系统连接”和“用户连接”,未配置的连接则需要通过nmcli进行配置才能连接。
NetworkManager还有network-manager-gnomenetwork-manager-kde的GUI前端,以及cockpit-networkmanager的WebUI前端。
在配置文件中,plugins=ifupdown,...可以配置NetworkManager的插件。
dns=可以选择NetworkManager使用的DNS客户端(一般为dnsmasq,设置为none可以禁用)。
dhcp=可以选择NetworkManager使用的DHCP客户端(dhclient、dhcpcd、internal),默认为internal,即NetworkManager内置的DHCP客户端。
managed=可以配置网络管理工具兼容,如果managed设置为true,NetworkManager将不会配置在interfaces文件中列出的有线/无线网卡,在interfaces中列出有线/无线网卡的配置将会生效;如果managed设置为false,NetworkManager将会管理配置所有的有线/无线网卡,interfaces中的配置无效。
如果dbus中存在wpa_supplicant.service服务,那么NetworkManager会自动使用wpa_supplicant作为无线网络后端,而不是内置的无线网络后端。
桌面端的Linux发行版基本都使用NetworkManager(也可能是ConnMan),因为它有对无线网络的良好支持和优秀的图形界面管理工具,不建议更换,否则会导致各种不可预料的问题,轻则有网络但图形界面下始终显示断网,重则损坏图形界面组件,无法进入图形界面。

从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 dhcpcd5
  3. 删除配置文件
    rm -rf /etc/network
    rm -rf /etc/dhcp
    rm -f /etc/NetworkManager/01-ifupdown
  4. 修改NetworkManager配置
    编辑/etc/NetworkManager/NetworkManager.conf,删除ifupdown相关内容,添加dhcp=internal

Netplan

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

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_supplicant 或 iwd,对配置好的无线适配器进行WiFi请求。
注意,systemd-networkd没有原生支持PPPoE。
它的网络配置文件名一般为*.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
Gateway=192.168.1.1
DNS=10.1.10.1
# DNS=8.8.8.8 # 次要DNS

对于无线网络,在此处配置好后,无线网卡就进入了等待发送请求的状态,之后可以通过修改wpa_supplicant的配置文件wpa_supplicant-wlp?s?.conf添加WiFi网络,然后systemctl start wpa_supplicant@wlp?s?.service进行无线网络请求连接了。也可以直接启用wpa_supplicant.service的主服务,让systemd-networkd通过dbus与wpa_supplicant交互。

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

首先请确定systemd版本中有networkd功能,否则请安装systemd-networkd

  1. 禁用或移除NetworkManager(ifupdown)
    systemctl disable NetworkManager
    apt|yum remove NetworkManager
    apt remove ifupdown
    删除配置文件
    rm -rf /etc/NetworkManager
    rm -rf /etc/network
    如果安装了其他的DHCP客户端(ifupdown情况下常见),也要一并移除,否则会冲突导致无法获取IP,包括:
    isc-dhcp-client isc-dhcp-common dhcpcd5 Debian
    dhcp-client dhcp-common RHEL
    dhclient dhcpcd Arch
    删除配置文件
    rm -rf /etc/dhcp

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

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

    [Network]
    DHCP=yes
  3. 启用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.service。”完成“意味着systemd-networkd配置的网络接口至少有一个进入”degraded(failed)”或以上状态
    systemctl enable --now systemd-network-generator.service 可选:将内核中的网络配置转换为.network文件并存储在/run/systemd/network/

  4. 重写resolv.conf,使用systemd-resolved的方案一,这一步并非必要,但强烈推荐这么做
    rm /etc/resolv.conf
    ln -s /run/systemd/resolve/resolv.conf /etc/resolv.conf
    systemctl restart systemd-resolved.service

  5. 配置静态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

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

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

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

    然后在enp3s0的网络设置下加入以下内容

    1
    2
    [Network]
    Bridge=br0

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

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

    [Network]
    Address=192.168.10.100/24
    Gateway=192.168.10.1
    DNS=8.8.8.8

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

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

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 name连接网络,可能会要求密码。
通过connmanctl config ethernet_xxxxx --ipv4 manual IP 子网掩码 网关IP设置静态IP
其他子命令一览如下:

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
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网络。
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 prefixlength 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。

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
IPv6.method=auto
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.netmask_prefixlen=24
IPv4.local_address=192.168.0.133
IPv4.gateway=192.168.0.1
AutoConnect=true

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-network、 system-config-network-tui、system-config-network等,在这里不谈。

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

Debian系配置静态IP
在/etc/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

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

dhcpcd

较新的DHCP客户端实现。它使用守护进程的方式,会在后台监测DHCP情况,在租用时间到期后自动进行重新请求。

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

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

无线网络后端

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

iw

是iwconfig的继位者,可用于open,WEP两种认证模式的使用。由iw主干命令和其子命令组成。
修改网卡模式
iw dev 网卡设备名 set type ibss
一般为ibss,设置前可能需要关闭网卡,使用ip命令设为down即可。
搜索接入点
iw dev 网卡设备名 scan
接入接入点
iw dev 网卡设备名 connect "网络ID" 无认证
iw dev 网卡设备名 connect "网络ID" key 0:密码 WEP认证
iw只支持到WEP认证。

wpa_supplicant

功能比iw更为强大,支持的网卡功能更多,支持 WEP、WPA 和 WPA2认证,可以在桌面、笔记本甚至嵌入式系统中使用。由主程序wpa_supplicant,密码工具 wpa_passphrase和文字界面前端 wpa_cli三个命令,/etc/wpa_supplicant/中的脚本和配置文件wpa_supplicant[-wlxxx].confwpa_supplicant.service服务组成。可以进行手动接入和服务化配置。
配置文件
主配置文件为wpa_supplicant.conf,设备配置文件为wpa_supplicant[-wlxxx].conf,但如果要使用5G频段,还需要创建/etc/default/crda文件并写入REGDOMAIN=CN|US|...地区,因为不同地区的5G频段是不同的。
手动接入
在主配置文件wpa_supplicant.conf中写入

1
2
ctrl_interface=/run/wpa_supplicant
update_config=1

使用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 编号set_network 编号 ssid "SSID"set_network 编号 key_mgmt 识别模式,没有为NONE,不设定为PSKset_network 编号 psk "密码"enable_network 编号,即可连接。若要更新设置并保存,输入save_config
快速生成配置
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
ctrl_interface=/run/wpa_supplicant
[ctrl_interface_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" # 认证密码
}

network={
ssid="SSID"
key_mgmt=NONE
}

与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即可。
也可以启动wpa_supplicant.service服务,然后手动连接。

iwd

iwd是Intel开发的无线网络守护程序。该项目的核心目标是不依赖任何外部库,而是最大程度地利用Linux内核提供的功能来优化资源利用。
它由/etc/iwd/中的配置文件,/var/lib/iwd中的密码文件,守护进程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客户端
# 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连接时给出密码
wsc list查看支持WPS/WSC的设备
wsc 设备名 push-button开始进行WSC连接
station 设备名 disconnect断开WiFi
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

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

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

[Settings]
AutoConnect=True

EAP-PEAP:/var/lib/iwd/SSID.8021x

1
2
3
4
5
6
7
8
9
10
11
[Security]
EAP-Method=PEAP
EAP-Identity=用户名
EAP-PEAP-CACert=/证书路径
EAP-PEAP-ServerDomainMask=服务器地址
EAP-PEAP-Phase2-Method=MSCHAPV2
EAP-PEAP-Phase2-Identity=用户名
EAP-PEAP-Phase2-Password=密码

[Settings]
AutoConnect=true

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

1
2
3
4
5
6
7
8
9
10
11
[Security]
EAP-Method=TTLS
EAP-Identity=用户名
EAP-TTLS-CACert=/证书路径
EAP-TTLS-ServerDomainMask=服务器地址
EAP-TTLS-Phase2-Method=Tunneled-PAP
EAP-TTLS-Phase2-Identity=用户名
EAP-TTLS-Phase2-Password=密码

[Settings]
AutoConnect=true

与systemd-networkd一起使用

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

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

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

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

[Network]
DHCP=yes

创建密码文件/var/lib/iwd/SSID.psk,内容如下:

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

[Settings]
AutoConnect=True

然后重启systemd-networkd.serviceiwd.service即可。
也可以通过iwctl进行手动连接。

蓝牙

bluez(bluetooth包)是Linux蓝牙管理套件,由/etc/bluetooth/etc/default/bluetooth配置文件,bluetooth.service服务和bluetoothctl管理命令组成。
如果蓝牙服务状态未激活,则必须先启用它,才能使用蓝牙控制命令。
修改/etc/default/bluetooth,设置BLUETOOTH_ENABLED=1
启动蓝牙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父命令直接进行操作