【问题标题】:Issue with network up/down in kernel内核中的网络启动/关闭问题
【发布时间】:2015-03-10 17:28:20
【问题描述】:

我正在尝试使用正确的命令编写一个 Linux 内核模块,它会关闭网络接口(比如说 wlan0),将其 IP 地址更改为指定的地址,然后重新启动接口。在 cmets 开始之前,是的,我知道您可以使用 ifconfig,是的,我知道您也可以编写用户代码来执行此操作,但是对于我的研究项目,我正在尝试学习如何在 Linux 内核中执行此操作。

经过研究,我发现了 net_device _ops 结构,它具有我需要为此调用的方法(ndo_stopndo_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;
}

【问题讨论】:

    标签: kernel linux-kernel


    【解决方案1】:

    这类似于我正在尝试的,实际上我尝试实现某种隐身模式,应该这样做(root是先决条件)。但这不是通过内核模块完成的。我仍然试图提供帮助。我的步骤应该在这里执行:

    1. 停止所有真实(无环回等)网络设备

    2. 收集他们的 mac

    3. 将他们的 mac 更改为唯一的随机 mac

    4. 收集旧主机名并将主机名更改为唯一的随机主机名

    5. 重新激活网卡

    6. 设置一些iptables,

    7. 这一切都作为一个守护进程,等待特殊的 keycomobo 撤消所有更改。

    让我们去寻找答案,或者某种答案: 问题是,您肯定会运行一些应用程序,这些应用程序可以通过 udev 或其他方式控制您的网卡。我的例子是 WICD-daemon,它正在运行,一旦我在代码中关闭了我的 nic,wicd (IIRC) 立即将它打开。 我在谷歌上搜索并找到了一些关于卸载驱动程序的信息……但这也意味着我们不能再更改 mac 或 ip。 所以在内核中我们需要确定哪个用户态进程占用了网卡。 杀死这些进程可能很方便。 顺便说一句,您可以使用上面提到的命令,并在前面加上 ptrace,然后您将看到涉及哪些系统调用。

    【讨论】:

    • 太棒了,感谢您的建议!我得研究一下,看看结果如何。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-20
    • 2017-08-06
    • 2019-04-06
    相关资源
    最近更新 更多