Ubuntu 网络管理
ubuntu/debian 中的网络管理
- NetworkManager,使用nmcli查询与操作网络配置
/run/NetworkManager/no-stub-resolv.conf
对应命令行例子:nmcli device show
- systemd-networkd,使用netplan的yaml文件来配置网络
/usr/lib/systemd/systemd-networkd
- systemd-resolved,dns的配置文件
16.04|20.04 /lib/systemd/systemd-resolved
24.04 /usr/lib/systemd/systemd-resolved
/run/systemd/resolve/resolv.conf
一般使用命令行systemd-resolve --status
低版本中没有(16.04)
NetworkManager
提供libnm库读取与操作网络配置,对应命令是nmcli
使用c的例子来展示网络信息, 能获取到每个网口DHCP得到的DNS.
#include <NetworkManager.h>
#include <glib.h>
#include <stdio.h>
static char *
ip4_address_as_string (guint32 ip)
{
char *ip_string;
struct in_addr tmp_addr;
tmp_addr.s_addr = ip;
ip_string = g_malloc0 (INET_ADDRSTRLEN + 1);
if (!inet_ntop (AF_INET, &tmp_addr, ip_string, INET_ADDRSTRLEN))
strcpy (ip_string, "(none)");
return ip_string;
}
int main() {
GError *error = NULL;
NMClient *client = nm_client_new(NULL, &error);
if (error) {
g_print("Failed to create NetworkManager client: %s\n", error->message);
g_error_free(error);
return -1;
}
// 获取所有活跃的连接
GPtrArray *active_connections = nm_client_get_active_connections(client);
if (active_connections) {
for (guint i = 0; i < active_connections->len; i++) {
NMActiveConnection *active_connection = g_ptr_array_index(
active_connections, i);
NMConnection *connection = nm_active_connection_get_connection(
active_connection);
if (connection) {
const char *connection_id = nm_connection_get_id(connection);
g_print("Active Connection ID: %s\n", connection_id);
}
// 获取与该活跃连接相关的设备
GPtrArray *devices = nm_active_connection_get_devices(
active_connection);
if (devices) {
for (guint j = 0; j < devices->len; j++) {
NMDevice *device = g_ptr_array_index(devices, j);
const char *device_name = nm_device_get_iface(device);
g_print("Device: %s\n", device_name);
// 获取设备的 IPv4 配置
NMIPConfig *ip4_config = nm_device_get_ip4_config(device);
if (ip4_config) {
if (ip4_config) {
GPtrArray *addresses = nm_ip_config_get_addresses(
ip4_config);
for (guint i = 0; i < addresses->len; i++) {
NMIPAddress *addr =
(NMIPAddress*) g_ptr_array_index(
addresses, i);
const char *str = nm_ip_address_get_address(addr);
g_print(" IPv4 Address: %s\n", str);
guint32 hostmask, network, bcast, netmask;
guint32 addr_bin;
nm_ip_address_get_address_binary (addr, &addr_bin);
netmask = nm_utils_ip4_prefix_to_netmask (nm_ip_address_get_prefix (addr));
network = addr_bin & netmask;
hostmask = ~netmask;
bcast = network | hostmask;
str = ip4_address_as_string (bcast);
g_print("Broadcast Address:%s\n", str);
g_free (str);
str = ip4_address_as_string (netmask);
g_print("Subnet Mask:%s\n", str);
g_free (str);
}
const char *gateway = nm_ip_config_get_gateway(ip4_config);
g_print("Gateway:%s\n", gateway);
const char * const *dns = nm_ip_config_get_nameservers (ip4_config);
for (i = 0; dns && dns[i] && i < 3; i++) {
g_print("DNS[%d]:%s\n", i, dns[i]);
}
}
}
}
}
}
} else {
g_print("No active connections found.\n");
}
g_object_unref(client);
return 0;
}
netplan
使用systemd-networkd做服务,配置文件在/etc/netplan中
network:
version: 2
# 如果renderer是NetworkManager则netplan不会使用systemd-networkd服务也不会启动.
renderer: networkd
ethernets:
enp3s0:
dhcp4: yes
addresses: []
dhcp-identifier: mac
optional: yes