目录

Linux Network 如何配置及工作原理

文章简介:Linux Network 是如何使用及工作的

Linux Network 非常复杂,其本身的机制非常复杂,每一种 Linux 发行版的网络也有差别,管理工具也纷繁复杂。这里先简单的描述在 Centos7 和 Ubuntu20.04 下如何配置网络,后简单的描述一下 network 是怎样工作的.

  • Centos6 使用 network.service
  • Centos7 network.service 和 NetworkManager.service 并存
  • Centos8 之后只使用 NetworkManager.service
  • Ubuntu 使用 netplan 前端,NetworkManager/networkd 后端

Linux 网络设备

TODO: 网络设备架构

TODO: 网络接口命名

network.service 使用方法

修改 /etc/sysconfig/network-scripts 下的 ifcfg-*文件,之后执行 service network restart,配置即可生效。

注意: 网络配置修改可能会停掉当前的 ssh 连接

原理: network.service 会执行 /etc/rc.d/init.d/network start 启动网络服务,启动的过程中,使用 ip 命令启动各 device,使用 route 配置系统路由,使用 sysctl 配置等。

NetworkNanager 使用方法

Managing IP Networking 包含优点及如何使用

D-Bus 的 unix socket: /var/run/dbus/system_bus_socket

udev 配置: /etc/udev/udev.conf

配置文件目录

  • /etc/NetworkManager
  • /etc/sysconfig/network-scripts

命令

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
systemctl restart NetworkManager.service # 重启服务
journalctl -u NetworkManager.service -f -n 100 # 查看日志

# 查询连接信息
nmcli conn

# 添加连接
nmcli conn add type ethernet con-name eth0-static ifname eth0 ipv4.method manual ipv4.addresses "10.0.2.16/24" ipv4.gateway 10.0.2.2 ipv4.dns 114.114.114.114 ipv6.method auto

# 修改连接
nmcli conn modify eth0-static ipv4.method manual ipv4.addresses 10.0.2.254/24 ipv4.gateway 10.0.2.2

# interactive edit connection
nmcli conn edit <conn-name>

# 系统 link(设备)
nmcli dev

# 重新应用配置
nmcli dev reapply eth0
1
2
# TUI
nmtui

我们可以使用 nmcli 配置网络,当出现错误的时候,通过 journalctl 查看日志,分析配置错误原因,继续使用 nmcli 配置网络,直到网络服务配置好.

NetworkNanager 工作原理

NetworkNanager 有两个组件:

  1. NetworkManager daemon, 管理连接和监听并报告网络变化
  2. 一些管理前端(front-ends), 比如 nmcli,一些 GUI 程序等

NetworkManager daemon 依赖于 D-Bus, 实现了管理连接的接口,底层使用 netlink 跟 linux 内核交互,获得设备信息,配置连接(比如修改 ipv4 的地址等)。nmcli 跟 D-Bus 交互连接 NetworkManager daemon,获得信息以及配置网络

1
2
3
4
5
6
7
8
9
# ip 命令也是使用 netlink 跟 kernel 交互的
strace -fff ip a

socket(AF_NETLINK, SOCK_RAW|SOCK_CLOEXEC, NETLINK_ROUTE) = 3
sendto(3, {{len=40, type=RTM_GETLINK, flags=NLM_F_REQUEST|NLM_F_DUMP, seq=1641054708, pid=0}, {ifi_family=AF_UNSPEC, ifi_type=ARPHRD_NETROM, ifi_index=0, ifi_flags=0, ifi_change=0}, {{nla_len=8, nla_type=IFLA_EXT_MASK}, 1}}, 40, 0, NULL, 0) = 40
recvmsg(3, {msg_name={sa_family=AF_NETLINK, nl_pid=0, nl_groups=00000000}, msg_namelen=12, msg_iov=[{iov_base=NULL, iov_len=0}], msg_iovlen=1, msg_controllen=0, msg_flags=MSG_TRUNC}, MSG_PEEK|MSG_TRUNC)
recvmsg(3, {msg_name={sa_family=AF_NETLINK, nl_pid=0, nl_groups=00000000}
sendto(3, {{len=40, type=RTM_GETADDR, flags=NLM_F_REQUEST|NLM_F_DUMP, seq=1641054709, pid=0}, {ifa_family=AF_UNSPEC, ifa_prefixlen=0, ifa_flags=0, ifa_scope=RT_SCOPE_UNIVERSE, ifa_index=0}, {nla_len=0, nla_type=IFA_UNSPEC}}, 40, 0, NULL, 0) = 40
recvmsg(3, {msg_name={sa_family=AF_NETLINK, nl_pid=0, nl_groups=00000000}, msg_namelen=12, msg_iov=[{iov_base=NULL, iov_len=0}], msg_iovlen=1, msg_controllen=0, msg_flags=MSG_TRUNC}, MSG_PEEK|MSG_TRUNC)

TODO: 简单的 demo 使用 netlink 获得 ip 地址和配置 ip 地址 netlink-demo

NetworkNanager 和 network.service 如何并存

TODO:

netplan

The network configuration abstraction renderer

netplan 是一个方便在 linux 系统下配置网络的工具。我们通过 yaml 文件描述网络配置,netplan 会为我们生成我们选择的网络后端所需要的配置。当前支持后端 Systemd-networkd(default) 和 NetworkManager. Ubuntu 20.04 使用 netplan 作为网络配置工具.

配置文件在 ls /{lib,etc,run}/netplan/*.yaml.

ls /etc/netplan

netplan design

netplan reference

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
ls /{lib,etc,run}/netplan/*.yaml # 配置文件位置

netplan generate # 生成配置
ls /run/systemd/network/

ip a # 各接口信息
lshw -class network # 硬件更详细的信息
ethtool enp0s3

# 修改配置 /etc/netplan/*.yaml
netplan try # 测试是否生效
netplan apply # 应用配置

resolvectl status # resolve name

netplan 一些通用的配置模版

netplan 配置 dhcp 自动获取 ip

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
cat /etc/netplan/50-cloud-init.yaml
# This file is generated from information provided by the datasource.  Changes
# to it will not persist across an instance reboot.  To disable cloud-init's
# network configuration capabilities, write a file
# /etc/cloud/cloud.cfg.d/99-disable-network-config.cfg with the following:
# network: {config: disabled}
network:
  ethernets:
    enp0s3:
      dhcp4: true
      match:
        macaddress: 02:f6:7f:02:5c:72
      set-name: enp0s3
  version: 2

netplan 配置 static ip:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
network:
  version: 2
  ethernets:
    enp0s3:
      match:
        macaddress: 02:f6:7f:02:5c:72
      addresses:
        - 10.10.10.2/24
	  gateway4: 10.10.10.1
      set-name: enp0s3
      nameservers:
        search: [mydomain, otherdomain]
        addresses: [10.10.10.1, 1.1.1.1]
      routes:
        - to: default
          via: 10.10.10.1
# netplan generate --root-dir /vagrant

Name resolve

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# /run/systemd/resolve/stub-resolv.conf
man 8 systemd-resolved

systemd-resolve --statistics # resolve 服务
systemd-resolve --reset-statistics # 重置统计信息
systemctl restart systemd-resolved # 重启 ubuntu resolved 服务

resolvectl flush-caches # flush dns cache (old: systemd-resolve --flush-caches)
# flush dns cache
# https://www.linuxuprising.com/2019/07/how-to-flush-dns-cache-on-linux-for.html

总结

网络配置最终都是跟内核用 netlink 沟通,告诉 linux 内核网络配置,由 kernel 生效并工作。用户态管理程序典型代表: NetworkManager 和 systemd-networkd。熟悉了这些,便有了手段指挥 linux kernel 网络如何工作。剩下的就需要我们慢慢了解和学习 linux 网络提供了哪些功能。

ref