【问题标题】:Create a Loadable Kernel Module (LKM) to block a range of IP addresses创建可加载内核模块 (LKM) 以阻止 IP 地址范围
【发布时间】:2021-03-20 11:17:39
【问题描述】:

我正在尝试为 Ubuntu Linux 构建可加载内核模块 (LKM) 以阻止一系列 IP 地址。我的测试地址范围是 172.217.13.68/24。我尝试将 iphdr->saddr 与该范围的网络和广播地址进行比较。网络和广播地址最初以字符形式提供,但随后被强制转换为 unsigned int。当我们对范围使用这种方法时,所有的网络流量数据包都会被阻止,而不是那些在范围内的数据包。有关如何进行比较的任何建议?

我的代码: 语言 C

static struct nf_hook_ops nfho; //struct holding set of hook function options

//function to be called by hook
unsigned int hook_func(
  void *priv,
  struct sk_buff *skb,
  const struct nf_hook_state *state

) {
        struct iphdr* iph;
    static unsigned char *blockIPLow = "\xAC\xD9\x00\x00";
    static unsigned char *blockIPHigh = "\xAC\xD9\x00\xFF";

    if(skb){
            iph = ip_hdr(skb);

    if(iph && (iph->saddr>= *(unsigned int*)blockIPLow) && (iph->saddr<= *(unsigned int*)blockIPHigh))
        {
    printk(KERN_INFO "dropRange.c -- hook_func() dropped packets in range\n");
        return NF_DROP;
        }
    }

  /////////////////////  
  // ACCEPT ALL OTHER PACKETS
  /////////////////////
  return NF_ACCEPT;
}

更新:这个确切的代码适用于小范围的 IP。

【问题讨论】:

    标签: c linux firewall kernel-module ipv4


    【解决方案1】:

    大多数系统都是小端的。所以你从 string 到 int 的转换正在反转字节。因此,您实际上是在检查大于 0.0.227.172 且小于 255.0.227.172 的地址,这当然涵盖了大多数地址。

    如果您真的坚持使用这种不安全的强制转换,请颠倒字符串顺序,但在大端系统上它当然会失败。

    【讨论】:

    • 我之前把它按小端顺序排列,它不能阻止单个 IP。当我尝试阻止单个 IP 时,代码有效。除了那个地址,我可以ping通它周围的所有地址。但是,我的范围比较不起作用
    猜你喜欢
    • 1970-01-01
    • 2013-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    • 2011-09-14
    • 1970-01-01
    • 2016-05-16
    相关资源
    最近更新 更多