【问题标题】:i just want to use the iptables command in my c program我只想在我的 c 程序中使用 iptables 命令
【发布时间】:2010-03-20 04:24:54
【问题描述】:

我正在设计一个简单的 c 代码来根据需要调用 iptables 命令。 我只想使用我的 c 代码从特定的 IP 地址丢弃数据包。 这就是为什么我必须根据给定的输入使用 iptables 命令。 是否可以使用c代码调用命令? 如果是那怎么办??? 提前谢谢..

【问题讨论】:

    标签: c linux iptables


    【解决方案1】:

    假设您的程序以 root 身份运行,只需使用 fork() 和 exec(),并将 iptables 命令传递给 exec()。像

    if (0 == fork()) {
        execl("/sbin/iptables", ...); // supply the proper arguments to iptables.
    }
    

    编辑:我从其他人那里看到 system() 是比 fork/exec 更好的方法。

    听起来 Neha 不确定如何使用 sprintf 来格式化命令,以便它包含存储在其他变量中的 IP 地址。我认为它应该是这样的:

    char *host_to_block = ....
    char comm[1000];
    snprintf(comm, sizeof(comm), "iptables -A INPUT -s %s -j DROP", host_to_block);
    system(comm);
    

    请注意,这将是一个安全漏洞,除非您有代码来验证 host_to_block 是否包含 IP 地址而不是其他一些 shell 命令。如果不知道字符串的来源是否有效,您可能希望使用以下问题作为参考:

    how to validate an ip address

    【讨论】:

    • 而不是使用system(),然后使用fork,然后使用/sbin/iptables的execl,并将IP地址放入args数组中自己的元素中。这样你就不会运行 shell 进程,也不会发生 shell 注入(顺便说一下,它的效率也稍微高一点,但这无关紧要)
    • 我在使用 suid exec 调用 system() 时遇到问题,不得不恢复为 execl()。即使使用 execl,我也必须在每次 iptables 调用后添加 usleep(5000) 以绕过错误“资源暂时不可用”。
    【解决方案2】:

    可以在不使用 system() 或 exec*() 系列命令的情况下执行此操作,但是我相信您也有兴趣实际完成您的项目 :)

    但是,如果您只需要程序中 iptables 的非常基本的功能,或者需要精确的错误处理,您可以获取 iptables 包的源代码。

    高级警告:众所周知,研究 iptables ioctl 挂钩和相应的 netfilter 模块是一项思维液化任务。

    【讨论】:

    • +1 用于提及底层操作系统接口,即正确的方法。
    • 根据 Netfilter 网站的说法,调用 /sbin/iptables 是正确的方法。内核接口(或者实际上是 C 库)并非旨在成为稳定的 API。
    • Linux 有一个稳定的 ABI,不管那个网站说什么。 Linux 说“我们从不破坏用户空间”。所以用这个 API 就好了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多