linux - Linux 4.14 中的 NETLINK_NFLOG 支持

我的这个程序在 Linux 2.6.34 上运行良好。将此程序移植到 4.14 时,套接字创建出现错误“错误::不支持协议(protocol)”。根据 http://man7.org/linux/man-pages/man7/netlink.7.html

NETLINK_NFLOG(直到并包括 Linux 3.16) Netfilter/iptables ULOG。

我们知道 4.14 中的替代方案是什么吗?

#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/uio.h>

#include <pthread.h>

#include <netinet/ip.h>
#include <linux/types.h>
#include <linux/netlink.h>

int main()
{
    struct sockaddr_nl addr;
    int mypid;
    int status;
    int sockfd = -1;

    /* mypid = getpid(); */
    mypid = pthread_self();

    sockfd = socket(AF_NETLINK, SOCK_RAW, NETLINK_NFLOG);
    if (sockfd <= 0) {
        printf("netlink socket() failed - rc:%d, errno:%d\n",
                sockfd, errno);
        perror("Error: ");
        return (-1);
    }

    /* set up socket address */
    memset(&addr, 0, sizeof (addr));
    addr.nl_pid = mypid;
    addr.nl_family = AF_NETLINK;
    /*
       nl_groups is the multicast
       group ID to which the ULOG
       messages will be sent.It
       is bitmap of hexadecimal
       format
       */
    addr.nl_groups = 1;

    /* bind socket to listen on
     * multicast group 1 */
    status = bind(sockfd, (struct sockaddr *)&addr, sizeof (addr));
    if (status < 0) {
        perror("bind:");
        close(sockfd);
        return (-1);
    }

    printf("socket bind successful\n");

    close(sockfd);
    return (0);
}

我尝试浏览内核源代码但无法识别。

我已经低于配置

CONFIG_NETFILTER=y
# CONFIG_NETFILTER_ADVANCED is not set
CONFIG_NETFILTER_INGRESS=y
CONFIG_NETFILTER_NETLINK=y
CONFIG_NETFILTER_NETLINK_LOG=y
# CONFIG_NETFILTER_NETLINK_GLUE_CT is not set
CONFIG_NETFILTER_XTABLES=y
CONFIG_NETFILTER_XT_MARK=y
CONFIG_NETFILTER_XT_TARGET_CONNSECMARK=y
CONFIG_NETFILTER_XT_TARGET_LOG=y
CONFIG_NETFILTER_XT_NAT=y
# CONFIG_NETFILTER_XT_TARGET_NETMAP is not set
CONFIG_NETFILTER_XT_TARGET_NFLOG=y
# CONFIG_NETFILTER_XT_TARGET_REDIRECT is not set
CONFIG_NETFILTER_XT_TARGET_SECMARK=y
CONFIG_NETFILTER_XT_TARGET_TCPMSS=y
CONFIG_NETFILTER_XT_MATCH_ADDRTYPE=y
CONFIG_NETFILTER_XT_MATCH_CONNTRACK=y
CONFIG_NETFILTER_XT_MATCH_POLICY=y
CONFIG_NETFILTER_XT_MATCH_STATE=y

最佳答案

NETLINK_NFLOG(直到并包括 Linux 3.16) 查看 libnml 中的工作示例

https://stackoverflow.com/questions/57878667/

相关文章:

android-management-api - Google Pixel 设备在发出重启命令后重启

swift - 如何在iOS 13 Share sheet中实现 "Options"

reactjs - 如何动态更改 React Native 堆栈导航屏幕的标题?

spring - 如何在没有 Spring Security 或 Spring Boot 的情况下禁

python - 如何在 pyspark 上创建分层拆分训练、验证和测试集?

reactjs - React - 组件在重新渲染后不更新

node.js - 将参数/通配符定义为 npm 脚本键/名称的一部分

c# - 如何在 ConfigureServices 方法中使用 ASP.NET Core 2.1

database - 使用扇出写入方法根据隐私设置(PostgreSQL、Redis)更新 Feed

firebase - 是否可以为不活动实现自动注销功能?