【问题标题】:FreeBSD IPFW add an IP to tableFreeBSD IPFW 将 IP 添加到表中
【发布时间】:2012-10-03 07:55:35
【问题描述】:

我想从 C 程序中将 IP 添加到 IPFW 中的表中。我不想调用 system() 因为这段代码必须尽可能高效。所以基本上我的问题是,有人可以解释这是如何工作的吗?由于没有可以使用的 API,我正在查看源代码(以查看添加的完成方式),但这需要的时间比预期的要长,如果可能的话,如果有人解释一下,那就太好了。

所以我想做的是当我收到来自客户端的连接时,我想将该客户端的 IP 地址放在某个表中。

提前致谢!

【问题讨论】:

    标签: c sockets freebsd ipfw


    【解决方案1】:

    这不是一个真正的答案,只是一个明显的建议。用 cvsup 查看系统的源代码。然后查找 ipfw.c ,在那里您将看到它用于修改规则的系统调用。 ipfw 程序是一个命令行工具,所以它必须在用户空间中。这意味着你必须能够做它所做的事情。 (尽管您必须拥有超级用户权限。)

    【讨论】:

    • 嗯,这正是我想要做的。我看到我必须通过 BSD 套接字发送它,但找不到我需要设置的选项。
    • 然后运行“ktrace ipfw add 1000 allow tcp from 127.0.0.1 to me”,你可能会看到这些标志 ;-)
    • 对不起,我的意思是:“truss ipfw ...”
    • 好的,所以我也这样做了,我可以从中获得的唯一有用信息是:socket(PF_INET,SOCK_RAW,255) = 3 (0x3) setsockopt(0x3,0x0,0x28 ,0x7fffffffda40,0xc,0x800a0408c) = 0 (0x0) 这没有帮助(至少我)。
    【解决方案2】:

    好的。所以我找到了解决方案。

    在 ip_fw.h 中有一个结构 - ipfw_table_entry

    代码如下所示:

    ...
    ipfw_table_entry entry;
    
    bzero(&entry, sizeof entry);
    
    entry.addr = inet_addr("192.168.1.0");
    entry.tbl = 100;
    entry.masklen = 32;
    
    setsockopt(ipfw_socket, IPPROTO_IP, IP_FW_TABLE_ADD, &entry, sizeof entry);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-05
      • 1970-01-01
      • 2014-07-06
      • 1970-01-01
      相关资源
      最近更新 更多