【Ubuntu】Ubuntu网络管理
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: networkdethernets:enp3s0:dhcp4: yesaddresses: []dhcp-identifier: macoptional: yes