内核中的网络 up/down 问题
Issue with network up/down in kernel
我正在尝试编写一个 Linux 内核模块,使用正确的命令,将关闭网络接口(比如 wlan0),将其 IP 地址更改为指定的 IP 地址,然后恢复接口向上。在评论开始之前,是的,我知道您可以使用 ifconfig,是的,我知道您也可以编写用户代码来执行此操作,但是对于我的研究项目,我正在尝试学习如何在 Linux 内核中执行此操作.
经过研究,我发现了 net_device
_ops 结构,它具有我需要为此调用的方法(ndo_stop
和 ndo_open
)。然而,我正在努力寻找使用示例,因此尝试了:
dev->netdev_ops->ndo_stop(dev);
这编译得很好,但是当模块 运行 时,设备没有关闭。
任何人都可以提供正确的用法示例或让我知道我做错了什么吗?
void targeted(int index, __u32 key){
unsigned short cur_if;
struct in_device *in_dev;
struct in_ifaddr *if_info;
struct net_device *dev;
//struct net_device_ops ops;
__be32 n_key;
__u32 test2;
test2 = 0x00FFFFFF;
//test2 = test2 | key;
n_key = cpu_to_be32(key);
cur_if = 0;
dev = first_net_device(&init_net);
while (dev && cur_if < IFMAX) {
in_dev = (struct in_device *)dev->ip_ptr;
for (if_info = in_dev->ifa_list; if_info != NULL; if_info=if_info->ifa_next){
if (cur_if == index){
dev->netdev_ops->ndo_stop(dev);
if_info->ifa_address = if_info->ifa_address & test2;
if_info->ifa_local = if_info->ifa_local & test2;
if_info->ifa_address = if_info->ifa_address | n_key;
if_info->ifa_local = if_info->ifa_local | n_key;
printk(KERN_DEBUG "New Test::: %pI4", &if_info->ifa_local);
//dev->netdev_ops->ndo_open(dev);
}
}
cur_if++;
dev = next_net_device(dev);
}
return;
}
这与我正在尝试的类似,实际上我试图实现某种隐身模式,应该这样做(root 是先决条件)。但它不是通过内核模块完成的。我仍然尽力提供帮助。我的步骤应该在这里:
停止所有真实(无环回等)网络设备
收集他们的 mac
将他们的 mac 更改为唯一的随机 mac
收集旧主机名并将主机名更改为唯一的随机名称
重新激活网卡
设置一些 iptables,
所有这一切都作为守护进程,等待特殊的 keycomobo 撤消所有更改。
让我们来看看答案,或者某种答案:
问题是,您肯定有 运行 一些应用程序,它们通过 udev 或其他方式控制您的网卡。我的示例是 WICD-daemon,它是 运行,一旦我在代码中关闭我的 nic,它就会立即被 wicd ( IIRC ) 打开。
我在谷歌上搜索并找到了一些关于卸载驱动程序的信息.....但这也意味着,我们不能再更改 mac 或 ip。
所以在内核中我们需要识别哪个userland-process占用了nic。
杀死这些进程可能很方便。
顺便说一句,您可以使用您提到的上面的命令,并在前面添加 ptrace,然后您将看到涉及哪些系统调用。
我正在尝试编写一个 Linux 内核模块,使用正确的命令,将关闭网络接口(比如 wlan0),将其 IP 地址更改为指定的 IP 地址,然后恢复接口向上。在评论开始之前,是的,我知道您可以使用 ifconfig,是的,我知道您也可以编写用户代码来执行此操作,但是对于我的研究项目,我正在尝试学习如何在 Linux 内核中执行此操作.
经过研究,我发现了 net_device
_ops 结构,它具有我需要为此调用的方法(ndo_stop
和 ndo_open
)。然而,我正在努力寻找使用示例,因此尝试了:
dev->netdev_ops->ndo_stop(dev);
这编译得很好,但是当模块 运行 时,设备没有关闭。
任何人都可以提供正确的用法示例或让我知道我做错了什么吗?
void targeted(int index, __u32 key){
unsigned short cur_if;
struct in_device *in_dev;
struct in_ifaddr *if_info;
struct net_device *dev;
//struct net_device_ops ops;
__be32 n_key;
__u32 test2;
test2 = 0x00FFFFFF;
//test2 = test2 | key;
n_key = cpu_to_be32(key);
cur_if = 0;
dev = first_net_device(&init_net);
while (dev && cur_if < IFMAX) {
in_dev = (struct in_device *)dev->ip_ptr;
for (if_info = in_dev->ifa_list; if_info != NULL; if_info=if_info->ifa_next){
if (cur_if == index){
dev->netdev_ops->ndo_stop(dev);
if_info->ifa_address = if_info->ifa_address & test2;
if_info->ifa_local = if_info->ifa_local & test2;
if_info->ifa_address = if_info->ifa_address | n_key;
if_info->ifa_local = if_info->ifa_local | n_key;
printk(KERN_DEBUG "New Test::: %pI4", &if_info->ifa_local);
//dev->netdev_ops->ndo_open(dev);
}
}
cur_if++;
dev = next_net_device(dev);
}
return;
}
这与我正在尝试的类似,实际上我试图实现某种隐身模式,应该这样做(root 是先决条件)。但它不是通过内核模块完成的。我仍然尽力提供帮助。我的步骤应该在这里:
停止所有真实(无环回等)网络设备
收集他们的 mac
将他们的 mac 更改为唯一的随机 mac
收集旧主机名并将主机名更改为唯一的随机名称
重新激活网卡
设置一些 iptables,
所有这一切都作为守护进程,等待特殊的 keycomobo 撤消所有更改。
让我们来看看答案,或者某种答案: 问题是,您肯定有 运行 一些应用程序,它们通过 udev 或其他方式控制您的网卡。我的示例是 WICD-daemon,它是 运行,一旦我在代码中关闭我的 nic,它就会立即被 wicd ( IIRC ) 打开。 我在谷歌上搜索并找到了一些关于卸载驱动程序的信息.....但这也意味着,我们不能再更改 mac 或 ip。 所以在内核中我们需要识别哪个userland-process占用了nic。 杀死这些进程可能很方便。 顺便说一句,您可以使用您提到的上面的命令,并在前面添加 ptrace,然后您将看到涉及哪些系统调用。