错误如下所示:

# iptables -L
iptables v1.8.1 (legacy): can't initialize iptables table `filter': No chain/target/match by that name
Perhaps iptables or your kernel needs to be upgraded.

参考网上的说法,应该是filter表模块iptable_filter没有加载成功,或者内核编译选项根本就没有选上此功能。但是手动加载filter模块,没有问题:

# modprobe iptable_filter
# lsmod
Module                  Size  Used by
iptable_filter         16384  0
ip_tables              28672  1 iptable_filter
x_tables               40960  2 iptable_filter,ip_tables

但是问题还是存在,查一下iptables-1.8.1的源码中,打印错误的具体位置:

int do_command4(int argc, char *argv[], char **table, struct xtc_handle **handle, bool restore)
{.../* only allocate handle if we weren't called with a handle */if (!*handle)*handle = iptc_init(*table);/* try to insmod the module if iptc_init failed */if (!*handle && xtables_load_ko(xtables_modprobe_program, false) != -1)*handle = iptc_init(*table);if (!*handle)xtables_error(VERSION_PROBLEM,"can't initialize iptables table `%s': %s",*table, iptc_strerror(errno));

以上可见,问题出在iptc_init函数没有正确的初始化xtc_handle类型的变量handle,如下iptc_init函数:

struct xtc_handle * TC_INIT(const char *tablename)
{...sockfd = socket(TC_AF, SOCK_RAW, IPPROTO_RAW);if (sockfd < 0) return NULL;if (fcntl(sockfd, F_SETFD, FD_CLOEXEC) == -1) {fprintf(stderr, "Could not set close on exec: %s\n", strerror(errno));abort();}s = sizeof(info);strcpy(info.name, tablename);if (getsockopt(sockfd, TC_IPPROTO, SO_GET_INFO, &info, &s) < 0) {close(sockfd);return NULL;}DEBUGP("valid_hooks=0x%08x, num_entries=%u, size=%u\n",info.valid_hooks, info.num_entries, info.size);h = alloc_handle(&info);if (h == NULL) {close(sockfd);return NULL;}/* Initialize current state */h->sockfd = sockfd;h->info = info;h->entries->size = h->info.size;tmp = sizeof(STRUCT_GET_ENTRIES) + h->info.size;if (getsockopt(h->sockfd, TC_IPPROTO, SO_GET_ENTRIES, h->entries, &tmp) < 0)goto error;

最有可能出错的地方就是两个getsockopt函数,在TC_INIT函数中增加打印信息,重新编译一个iptables程序,但是TC_INIT位于libiptc/libiptc.c文件中,其编译之后为共享库文件libip4tc.so.0.1.0,将其替换系统目录/lib64下面的同名文件,方可看到打印输出。

最终确定getsocketopt函数执行SO_GET_INFO时出错,由于创建的为SOCK_RAW类型的套接口,内核处理函数为:

static int raw_getsockopt(struct sock *sk, int level, int optname,char __user *optval, int __user *optlen)
{if (level != SOL_RAW)return ip_getsockopt(sk, level, optname, optval, optlen);return do_raw_getsockopt(sk, level, optname, optval, optlen);
}

iptables中定义的level为TC_IPPROTO,实际上等于内核中的IPPROTO_IP,不等于SOL_RAW,调用函数ip_getsockopt:

int ip_getsockopt(struct sock *sk, int level,int optname, char __user *optval, int __user *optlen)
{int err;err = do_ip_getsockopt(sk, level, optname, optval, optlen, 0);...
#ifdef CONFIG_NETFILTER/* we need to exclude all possible ENOPROTOOPTs except default case */if (err == -ENOPROTOOPT && optname != IP_PKTOPTIONS &&!ip_mroute_opt(optname)) {int len;if (get_user(len, optlen)) return -EFAULT;err = nf_getsockopt(sk, PF_INET, optname, optval, &len);if (err >= 0)err = put_user(len, optlen);return err;}
#endif

对于函数ip_getsockopt,这里有个优先级,其先处理其它系统的getsockopt调用;之后再处理netfilter的调用,即函数nf_getsockopt。在内核中增加打印信息,发现SO_GET_INFO调用并没有进入nf_getsockopt函数处理,经检查发现,之前修改内核代码时在do_ip_getsockopt中增加了和SO_GET_INFO相同的选项值,导致此错误的发生,修正之后,iptables运行正常。

iptables不能初始化filter表问题相关推荐

  1. 10.15 iptables filter表案例

    2019独角兽企业重金招聘Python工程师标准>>> iptables常用知识回顾点 iptables -I/-A/-D 后紧跟 链 ,可以是INPUT,OUTPUT,FORWAR ...

  2. 10.15 iptables filter表小案例10.16/10.17/10.18 iptables nat表应用

    2019独角兽企业重金招聘Python工程师标准>>> 10.15 iptables filter表小案例 iptables 命令.语法总结 iptables-nvL //查看ipt ...

  3. iptables nat表含义_十(4)iptables语法、iptables filter表小案例、iptables nat表应用

    iptables语法 filter表: INPUT链:作用于进入本机的包 OUTPUT链:作用于送出本机的包 FORWARD链:作用于和本机无关的包 nat表: PREROUTING链:作用是包在刚刚 ...

  4. iptables filter表案例/iptables nat表应用

    iptables filter表案例 iptables filter 表案例 创建一个iptables.sh脚本 [root@Ask-02 ~]# vim /usr/local/sbin/iptabl ...

  5. 【CentOS 7笔记43】,防火墙和iptables filter表#

    2019独角兽企业重金招聘Python工程师标准>>> shallow丿ove firewalld和netfilter setenforce 0 #临时关闭selinux /etc/ ...

  6. 31次课(iptables filter表案例、iptables nat表应用)

    10.15 iptables filter表案例 iptables小案例,需求需要把80端口22端口还有21端口放行.但是22端口我需要指定一个ip段,只有这个ip段的ip访问的时候才可以访问,其他段 ...

  7. iptables基础——链与表

    1.防火墙相关概念 此处先描述一些相关概念. 1)从逻辑上讲,防火墙可以大体分为主机防火墙和网络防火墙. 主机防火墙:针对于单个主机进行防护. 网络防火墙:往往处于网络入口或边缘,针对于网络入口进行防 ...

  8. Linux防火墙-netfilter filter表案列与nat表应用

    iptables filter表案例 脚本代码和注释 [root@localhost ~]# vim /usr/local/sbin/iptables.sh ## 文档内容 #!/bin/bash # ...

  9. iptables总结--理解四表五链/snat/dnat/redirect/synproxy/性能

    1. iptables四表五链 四表五链: 链就是位置:共有五个 进路由(PREROUTING).进系统(INPUT) .转发(FORWARD).出系统(OUTPUT).出路由(POSTROUTING ...

最新文章

  1. 推导和实现:全面解析高斯过程中的函数最优化(附代码公式)
  2. 秋招面经来了,收藏!
  3. Go 语言调用 python2
  4. 使用CRT调试内存分配堆来找出未释放的内存空间
  5. 前端学习(1775):前端调试之session storage原理和查看
  6. 蓝桥杯第八届省赛JAVA真题----油漆面积
  7. Python学习笔记之函数(二)
  8. html判断字段不为空,js里是否为空字符串的判断
  9. Kubernetes入门培训(内含PPT)-(转)
  10. Authentication-- 更改现有Sharepoint网站的认证方式,让其支持FBA:1.前期准备
  11. 女生在施工单位项目部上工作,是怎样一种体验?
  12. 如何将Web项目的默认编译输出目录改为WebContent/WEB-INF/classe
  13. html5 密码强度,前端开发判断输入密码强度
  14. 广金计算机网络有限公司怎么样,广东金融学院到底怎么样!?
  15. python中出现nameerror_python类中出现NameError的问题
  16. html 内容写入数据库中,FoxPro数据库写入html文件中
  17. 求最大和 java_用java求最大子段和
  18. 全文搜索引擎solr使用说明
  19. OpenCV之Vec3f
  20. 盲盒是怎么赚钱的?(盲盒App的盈利逻辑)

热门文章

  1. 线性代数-Gilbert Strang(第二部分)
  2. 如何巧妙的更改ip核中的参数 以及parameter localparameter,`define 的区别
  3. python独立网站教程_UC头条:python: 从零到独立建设网站系列教程: 基础知识篇
  4. nfs +nis+ssh(2)
  5. 原生JS 实现放大镜
  6. 《机器学习实战》—— 朴素贝叶斯
  7. 低成本、强交互、沉浸式的云游戏,究竟如何实现?
  8. android预约管理系统,基于Android的医院就诊预约管理系统的设计与实现.doc
  9. android自定义键盘开源,Android自定义软键盘的设计与实现代码
  10. Vcenter 与 VCSA