【发布时间】:2010-03-20 04:24:54
【问题描述】:
我正在设计一个简单的 c 代码来根据需要调用 iptables 命令。 我只想使用我的 c 代码从特定的 IP 地址丢弃数据包。 这就是为什么我必须根据给定的输入使用 iptables 命令。 是否可以使用c代码调用命令? 如果是那怎么办??? 提前谢谢..
【问题讨论】:
我正在设计一个简单的 c 代码来根据需要调用 iptables 命令。 我只想使用我的 c 代码从特定的 IP 地址丢弃数据包。 这就是为什么我必须根据给定的输入使用 iptables 命令。 是否可以使用c代码调用命令? 如果是那怎么办??? 提前谢谢..
【问题讨论】:
假设您的程序以 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 命令。如果不知道字符串的来源是否有效,您可能希望使用以下问题作为参考:
【讨论】:
可以在不使用 system() 或 exec*() 系列命令的情况下执行此操作,但是我相信您也有兴趣实际完成您的项目 :)
但是,如果您只需要程序中 iptables 的非常基本的功能,或者需要精确的错误处理,您可以获取 iptables 包的源代码。
高级警告:众所周知,研究 iptables ioctl 挂钩和相应的 netfilter 模块是一项思维液化任务。
【讨论】: