AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 610989
Accepted
zwol
zwol
Asked: 2014-07-09 07:53:12 +0800 CST2014-07-09 07:53:12 +0800 CST 2014-07-09 07:53:12 +0800 CST

Linux NFLOG - 文档,来自 C 的配置

  • 772

几个不同的地方(例如http://wiki.wireshark.org/CaptureSetup/NFLOG)建议使用 Linux 的“NFLOG”防火墙模块来捕获由特定 UID 生成的数据包,如下所示:

# iptables -A OUTPUT -m owner --uid-owner 1000 -j CONNMARK --set-mark 1
# iptables -A INPUT -m connmark --mark 1 -j NFLOG --nflog-group 30 
# iptables -A OUTPUT -m connmark --mark 1 -j NFLOG --nflog-group 30 
# dumpcap -i nflog:30 -w uid-1000.pcap

我还没有找到任何关于它是如何工作的文档(特别是,netfilter.org有很多写得很糟糕的库 API 文档,据我所知,没有任何关于实际内核级防火墙的语义规则),所以我有几个问题:

  1. 有没有该死的文件,它藏在哪里?

  2. CONNMARK的东西真的有必要吗?也就是说,这也可以吗?

    # iptables -A INPUT -m owner --uid-owner 1000 -j NFLOG --nflog-group 30 
    # iptables -A OUTPUT -m owner --uid-owner 1000 -j NFLOG --nflog-group 30
    
  3. 是否需要运行“ulogd”才能使其正常工作?

  4. 有没有办法告诉内核为我选择一个未分配的组号并告诉我它是什么?

  5. 有没有办法告诉内核这些过滤规则应该在进程 X 终止时自动删除?(进程 X不会以 uid 1000 运行。)

  6. 大概该iptables命令会进行一些特殊ioctl调用或配置防火墙。是否有一个 C 库可用于在程序中执行相同的操作(即 Q4 中的“进程 X”)?

linux
  • 2 2 个回答
  • 11071 Views

2 个回答

  • Voted
  1. Best Answer
    Matthew Ife
    2014-07-09T08:25:14+08:002014-07-09T08:25:14+08:00

    有没有该死的文件,它藏在哪里?

    netfilter 站点上有一些示例可以帮助解释该功能。这是我在自己的代码中编写的用于设置 netfilter NFLOG 的函数。

    以下是他们提供的示例:http: //www.netfilter.org/projects/libnetfilter_log/doxygen/files.html

    void setup_netlogger_loop(
        int groupnum,
        queue_t queue)
    {
      int sz;
      int fd = -1;
      char buf[BUFSZ];
      /* Setup handle */
      struct nflog_handle *handle = NULL;
      struct nflog_g_handle *group = NULL;
    
      memset(buf, 0, sizeof(buf));
    
      /* This opens the relevent netlink socket of the relevent type */
      if ((handle = nflog_open()) == NULL){
        sd_journal_perror("Could not get netlink handle");
        exit(EX_OSERR);
      }
    
      /* We tell the kernel that we want ipv4 tables not ipv6 */
      if (nflog_bind_pf(handle, AF_INET) < 0) {
        sd_journal_perror("Could not bind netlink handle");
        exit(EX_OSERR);
      }
    
      /* Setup groups, this binds to the group specified */
      if ((group = nflog_bind_group(handle, groupnum)) == NULL) {
        sd_journal_perror("Could not bind to group");
        exit(EX_OSERR);
      }
      if (nflog_set_mode(group, NFULNL_COPY_PACKET, 0xffff) < 0) {
        sd_journal_perror("Could not set group mode");
        exit(EX_OSERR);
      }
      if (nflog_set_nlbufsiz(group, BUFSZ) < 0) {
        sd_journal_perror("Could not set group buffer size");
        exit(EX_OSERR);
      }
      if (nflog_set_timeout(group, 1500) < 0) {
        sd_journal_perror("Could not set the group timeout");
      }
    
      /* Register the callback */
      nflog_callback_register(group, &queue_push, (void *)queue);
    
      /* Get the actual FD for the netlogger entry */
      fd = nflog_fd(handle);
    
      /* We continually read from the loop and push the contents into
         nflog_handle_packet (which seperates one entry from the other),
         which will eventually invoke our callback (queue_push) */    
      for (;;) {
        sz = recv(fd, buf, BUFSZ, 0);
        if (sz < 0 && errno == EINTR)
          continue;
        else if (sz < 0)
          break;
    
        nflog_handle_packet(handle, buf, sz);
      }
    }
    

    CONNMARK的东西真的有必要吗?也就是说,这也可以吗?

    这是不必要的。

    是否需要运行“ulogd”才能使其正常工作?

    不——事实上我没有在这个应用程序中使用它。

    有没有办法告诉内核为我选择一个未分配的组号并告诉我它是什么?

    不是我知道的。在任何情况下,如果您为 HTTP 设置了 NFLOG 目标,一个用于记录丢弃的 FTP 数据包和一个用于扫描 SMTP 字符串的数据包,这将毫无用处。在这种情况下,您无法确定哪个规则绑定到哪个组,因此应该监听哪个组。

    有没有办法告诉内核这些过滤规则应该在进程 X 终止时自动删除?(进程 X 不会以 uid 1000 运行。)

    不,但内核仅填充最大大小的缓冲区,然后将丢弃数据。它不会在使用过多内存且未听规则的情况下对性能产生影响。

    大概 iptables 命令会进行一些特殊的 ioctl 调用或其他配置防火墙的操作。是否有一个 C 库可用于在程序中执行相同的操作(即 Q4 中的“进程 X”)?

    我知道没有 netfilter 库可以帮助您操作规则。不过,有一个内部驱动的库被用来代替。

    IPtables 继承了一种与用户空间对话的相当古老的方法——您打开一个 SOCK_RAW IP 套接字与它进行通信。这将完全被 nftables 删除(因为它没有任何意义),它将通过 netlink 说话来做同样的事情。

    • 6
  2. Lekensteyn
    2019-01-27T13:35:01+08:002019-01-27T13:35:01+08:00

    具体回答这部分:

    CONNMARK的东西真的有必要吗?也就是说,这也可以吗?

    # iptables -A INPUT -m owner --uid-owner 1000 -j NFLOG --nflog-group 30 
    # iptables -A OUTPUT -m owner --uid-owner 1000 -j NFLOG --nflog-group 30
    

    是的,这是必要的。不,您的提议不会匹配任何传入的数据包(也许它匹配本地计算机上的流量,但绝对不匹配外部网络流量)。

    只有本地的传出数据包具有关联的所有者。在 INPUT 链的早期,所有者信息不可用,因为数据包仍在路由中。为了匹配与传出流相关的传入数据包,有必要在 OUTPUT 链中标记“连接”,随后可以在 INPUT 链上进行匹配。

    另请参阅iptables-extensions手册页:

    所有者

    该owner模块仅匹配原始套接字。这意味着

    该模块尝试匹配数据包创建者的各种特征,用于本地生成的数据包。此匹配仅在 OUTPUT 和 POSTROUTING 链中有效。转发的数据包没有任何与之关联的套接字。来自内核线程的数据包确实有一个套接字,但通常没有所有者。

    (同样的警告也适用于 nftables。)

    • 0

相关问题

  • Linux 主机到主机迁移

  • 如何在 Linux 机器上找到有关硬件的详细信息?

  • 如何在 Linux 下监控每个进程的网络 I/O 使用情况?

  • 在 RHEL4 上修改 CUPS 中的现有打印机设置

  • 为本地网络中的名称解析添加自定义 dns 条目

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve