netlink进行网卡重命名
创始人
2024-05-31 14:42:50
0

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include #define MAX_PAYLOAD 1024  // 最大负载长度
#define NLMSG_ERROR 0x2    // 消息类型
  1. 初始化Netlink Socket

      初始化Netlink Socket,创建一个netlink_init函数,用于创建Netlink Socket并绑定到NETLINK_ROUTE

int netlink_init(struct sockaddr_nl *nladdr) {int sockfd;sockfd = socket(AF_NETLINK, SOCK_RAW, NETLINK_ROUTE);if (sockfd < 0) {perror("socket");return -1;}memset(nladdr, 0, sizeof(struct sockaddr_nl));nladdr->nl_family = AF_NETLINK;nladdr->nl_groups = RTMGRP_LINK;  // 绑定到link组if (bind(sockfd, (struct sockaddr *)nladdr, sizeof(struct sockaddr_nl)) < 0) {perror("bind");close(sockfd);return -1;}return sockfd;
}

  1. 创建Netlink消息

接下来创建Netlink消息,包括Netlink消息头和Netlink消息负载

void build_nlmsg(struct nlmsghdr *nlh, int ifindex, int flags) {memset(nlh, 0, NLMSG_LENGTH(sizeof(struct ifinfomsg)));nlh->nlmsg_len = NLMSG_LENGTH(sizeof(struct ifinfomsg));nlh->nlmsg_type = RTM_NEWLINK;nlh->nlmsg_flags = NLM_F_REQUEST | NLM_F_ACK;nlh->nlmsg_seq = 1;nlh->nlmsg_pid = getpid();struct ifinfomsg *ifm = (struct ifinfomsg *)NLMSG_DATA(nlh);ifm->ifi_family = AF_UNSPEC;ifm->ifi_type = 0;ifm->ifi_index = ifindex;ifm->ifi_flags = flags;ifm->ifi_change = 0xffffffff;
}

int send_nlmsg(int sockfd, struct nlmsghdr *nlh, struct sockaddr_nl *nladdr) {int ret;struct iovec iov = { nlh, nlh->nlmsg_len };struct msghdr msg = { nladdr, sizeof(struct sockaddr_nl), &iov, 1, NULL, 0, 0 };ret = sendmsg(sockfd, &msg, 0);if (ret < 0) {perror("sendmsg");return -1;}memset(nlh, 0, NLMSG_LENGTH(sizeof(struct ifinfomsg

struct ifinfomsg是Linux内核中用于表示网络接口信息的结构体,其定义如下

struct ifinfomsg {unsigned char ifi_family;   // 接口地址族,通常为AF_UNSPEC或AF_INET6unsigned short ifi_type;    // 接口类型int ifi_index;              // 接口索引unsigned int ifi_flags;     // 接口标志,如IFF_UP等unsigned int ifi_change;    // 接口状态改变标志
};

在使用Netlink更改网络接口的过程中,可以使用struct ifinfomsg结构体来表示要修改的网络接口的相关信息,包括接口类型、接口索引、接口标志等。在Netlink消息负载中,使用NLMSG_DATA宏来获取struct ifinfomsg结构体的地址,然后填充相关字段即可。

使用struct ifinfomsg结构体的场景包括但不限于:

  1. 在Netlink Socket中使用RTM_NEWLINK消息来创建一个新的网络接口。
  2. 在Netlink Socket中使用RTM_DELLINK消息来删除一个网络接口。
  3. 在Netlink Socket中使用RTM_SETLINK消息来修改一个网络接口的属性,比如接口标志等。

在Netlink Socket中使用RTM_NEWLINK消息来创建一个新的网络接口时,如果填充的接口名称为eth%d,内核会根据当前系统中已经存在的网络接口的数量来确定新接口的名称。

具体来说,内核会在已有的网络接口名称中查找最小的未使用的名称,并将其分配给新的网络接口。对于以eth%d为模板的接口名称,内核会从eth0开始往后逐个尝试,直到找到一个未被占用的名称为止。

因此,在使用Netlink Socket来创建一个新的网络接口时,如果填充的接口名称为eth%d,而系统中已经存在了一些网络接口,那么最终分配给新接口的名称可能会不是eth%d,而是根据内核的算法计算出的一个实际名称。

修改网卡mtu值

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include #define BUFSIZE 8192int main(int argc, char **argv) {struct nlmsghdr *nh;struct ifinfomsg *ifinfo;struct rtattr *attr;char buffer[BUFSIZE];int sockfd, len;// 创建netlink socketif ((sockfd = socket(AF_NETLINK, SOCK_RAW, NETLINK_ROUTE)) < 0) {perror("socket");return -1;}// 准备请求消息memset(buffer, 0, sizeof(buffer));nh = (struct nlmsghdr *)buffer;ifinfo = (struct ifinfomsg *)NLMSG_DATA(nh);attr = (struct rtattr *)(((char *)ifinfo) + NLMSG_ALIGN(sizeof(struct ifinfomsg)));nh->nlmsg_len = NLMSG_LENGTH(sizeof(struct ifinfomsg));nh->nlmsg_flags = NLM_F_REQUEST | NLM_F_ACK;nh->nlmsg_type = RTM_NEWLINK;ifinfo->ifi_family = AF_UNSPEC;ifinfo->ifi_type = ARPHRD_ETHER;ifinfo->ifi_index = if_nametoindex("eth0");ifinfo->ifi_flags = IFF_UP;ifinfo->ifi_change = 0xFFFFFFFF;// 添加MTU属性attr->rta_type = IFLA_MTU;attr->rta_len = RTA_LENGTH(sizeof(unsigned int));*(unsigned int *)RTA_DATA(attr) = 1500;nh->nlmsg_len += RTA_ALIGN(attr->rta_len);nh->nlmsg_flags |= NLM_F_REQUEST | NLM_F_ACK;// 发送netlink消息len = send(sockfd, nh, nh->nlmsg_len, 0);if (len == -1) {perror("send");close(sockfd);return -1;}// 接收netlink回复len = recv(sockfd, buffer, BUFSIZE, 0);if (len == -1) {perror("recv");close(sockfd);return -1;}// 处理netlink回复for (nh = (struct nlmsghdr *)buffer; NLMSG_OK(nh, len); nh = NLMSG_NEXT(nh, len)) {if (nh->nlmsg_type == NLMSG_ERROR) {perror("NLMSG_ERROR");close(sockfd);return -1;}}printf("MTU has been set to 1500.\n");close(sockfd);return 0;
}

 

实现将网卡eth0改名称为eth1

#include 
#include 
#include 
#include 
#include 
#include 
#include #define BUFSIZE 8192int main(int argc, char **argv) {struct nlmsghdr *nh;struct ifinfomsg *ifinfo;struct rtattr *attr;char buffer[BUFSIZE];int sockfd, len;// 创建netlink socketif ((sockfd = socket(AF_NETLINK, SOCK_RAW, NETLINK_ROUTE)) < 0) {perror("socket");return -1;}// 准备请求消息memset(buffer, 0, sizeof(buffer));nh = (struct nlmsghdr *)buffer;ifinfo = (struct ifinfomsg *)NLMSG_DATA(nh);attr = (struct rtattr *)(((char *)ifinfo) + NLMSG_ALIGN(sizeof(struct ifinfomsg)));nh->nlmsg_len = NLMSG_LENGTH(sizeof(struct ifinfomsg));nh->nlmsg_flags = NLM_F_REQUEST | NLM_F_ACK;nh->nlmsg_type = RTM_NEWLINK;ifinfo->ifi_family = AF_UNSPEC;ifinfo->ifi_type = ARPHRD_ETHER;ifinfo->ifi_index = if_nametoindex("eth0");ifinfo->ifi_flags = IFF_UP;ifinfo->ifi_change = 0xFFFFFFFF;// 添加新接口名属性attr->rta_type = IFLA_IFNAME;attr->rta_len = RTA_LENGTH(strlen("eth1")+1);strcpy(RTA_DATA(attr), "eth1");nh->nlmsg_len += RTA_ALIGN(attr->rta_len);nh->nlmsg_flags |= NLM_F_REQUEST | NLM_F_ACK;// 发送netlink消息len = send(sockfd, nh, nh->nlmsg_len, 0);if (len == -1) {perror("send");close(sockfd);return -1;}// 接收netlink回复len = recv(sockfd, buffer, BUFSIZE, 0);if (len == -1) {perror("recv");close(sockfd);return -1;}// 处理netlink回复for (nh = (struct nlmsghdr *)buffer; NLMSG_OK(nh, len); nh = NLMSG_NEXT(nh, len)) {if (nh->nlmsg_type == NLMSG_ERROR) {perror("NLMSG_ERROR");close(sockfd);return -1;}}printf("Interface name has been set to eth1.\n");close(sockfd);return 0;
}

相关内容

热门资讯

喜欢穿一身黑的男生性格(喜欢穿... 今天百科达人给各位分享喜欢穿一身黑的男生性格的知识,其中也会对喜欢穿一身黑衣服的男人人好相处吗进行解...
发春是什么意思(思春和发春是什... 本篇文章极速百科给大家谈谈发春是什么意思,以及思春和发春是什么意思对应的知识点,希望对各位有所帮助,...
网络用语zl是什么意思(zl是... 今天给各位分享网络用语zl是什么意思的知识,其中也会对zl是啥意思是什么网络用语进行解释,如果能碰巧...
为什么酷狗音乐自己唱的歌不能下... 本篇文章极速百科小编给大家谈谈为什么酷狗音乐自己唱的歌不能下载到本地?,以及为什么酷狗下载的歌曲不是...
华为下载未安装的文件去哪找(华... 今天百科达人给各位分享华为下载未安装的文件去哪找的知识,其中也会对华为下载未安装的文件去哪找到进行解...
怎么往应用助手里添加应用(应用... 今天百科达人给各位分享怎么往应用助手里添加应用的知识,其中也会对应用助手怎么添加微信进行解释,如果能...
家里可以做假山养金鱼吗(假山能... 今天百科达人给各位分享家里可以做假山养金鱼吗的知识,其中也会对假山能放鱼缸里吗进行解释,如果能碰巧解...
一帆风顺二龙腾飞三阳开泰祝福语... 本篇文章极速百科给大家谈谈一帆风顺二龙腾飞三阳开泰祝福语,以及一帆风顺二龙腾飞三阳开泰祝福语结婚对应...
四分五裂是什么生肖什么动物(四... 本篇文章极速百科小编给大家谈谈四分五裂是什么生肖什么动物,以及四分五裂打一生肖是什么对应的知识点,希...
美团联名卡审核成功待激活(美团... 今天百科达人给各位分享美团联名卡审核成功待激活的知识,其中也会对美团联名卡审核未通过进行解释,如果能...