iptables不能初始化filter表问题
错误如下所示:
# 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表问题相关推荐
- 10.15 iptables filter表案例
2019独角兽企业重金招聘Python工程师标准>>> iptables常用知识回顾点 iptables -I/-A/-D 后紧跟 链 ,可以是INPUT,OUTPUT,FORWAR ...
- 10.15 iptables filter表小案例10.16/10.17/10.18 iptables nat表应用
2019独角兽企业重金招聘Python工程师标准>>> 10.15 iptables filter表小案例 iptables 命令.语法总结 iptables-nvL //查看ipt ...
- iptables nat表含义_十(4)iptables语法、iptables filter表小案例、iptables nat表应用
iptables语法 filter表: INPUT链:作用于进入本机的包 OUTPUT链:作用于送出本机的包 FORWARD链:作用于和本机无关的包 nat表: PREROUTING链:作用是包在刚刚 ...
- iptables filter表案例/iptables nat表应用
iptables filter表案例 iptables filter 表案例 创建一个iptables.sh脚本 [root@Ask-02 ~]# vim /usr/local/sbin/iptabl ...
- 【CentOS 7笔记43】,防火墙和iptables filter表#
2019独角兽企业重金招聘Python工程师标准>>> shallow丿ove firewalld和netfilter setenforce 0 #临时关闭selinux /etc/ ...
- 31次课(iptables filter表案例、iptables nat表应用)
10.15 iptables filter表案例 iptables小案例,需求需要把80端口22端口还有21端口放行.但是22端口我需要指定一个ip段,只有这个ip段的ip访问的时候才可以访问,其他段 ...
- iptables基础——链与表
1.防火墙相关概念 此处先描述一些相关概念. 1)从逻辑上讲,防火墙可以大体分为主机防火墙和网络防火墙. 主机防火墙:针对于单个主机进行防护. 网络防火墙:往往处于网络入口或边缘,针对于网络入口进行防 ...
- Linux防火墙-netfilter filter表案列与nat表应用
iptables filter表案例 脚本代码和注释 [root@localhost ~]# vim /usr/local/sbin/iptables.sh ## 文档内容 #!/bin/bash # ...
- iptables总结--理解四表五链/snat/dnat/redirect/synproxy/性能
1. iptables四表五链 四表五链: 链就是位置:共有五个 进路由(PREROUTING).进系统(INPUT) .转发(FORWARD).出系统(OUTPUT).出路由(POSTROUTING ...
最新文章
- 推导和实现:全面解析高斯过程中的函数最优化(附代码公式)
- 秋招面经来了,收藏!
- Go 语言调用 python2
- 使用CRT调试内存分配堆来找出未释放的内存空间
- 前端学习(1775):前端调试之session storage原理和查看
- 蓝桥杯第八届省赛JAVA真题----油漆面积
- Python学习笔记之函数(二)
- html判断字段不为空,js里是否为空字符串的判断
- Kubernetes入门培训(内含PPT)-(转)
- Authentication-- 更改现有Sharepoint网站的认证方式,让其支持FBA:1.前期准备
- 女生在施工单位项目部上工作,是怎样一种体验?
- 如何将Web项目的默认编译输出目录改为WebContent/WEB-INF/classe
- html5 密码强度,前端开发判断输入密码强度
- 广金计算机网络有限公司怎么样,广东金融学院到底怎么样!?
- python中出现nameerror_python类中出现NameError的问题
- html 内容写入数据库中,FoxPro数据库写入html文件中
- 求最大和 java_用java求最大子段和
- 全文搜索引擎solr使用说明
- OpenCV之Vec3f
- 盲盒是怎么赚钱的?(盲盒App的盈利逻辑)
热门文章
- 线性代数-Gilbert Strang(第二部分)
- 如何巧妙的更改ip核中的参数 以及parameter localparameter,`define 的区别
- python独立网站教程_UC头条:python: 从零到独立建设网站系列教程: 基础知识篇
- nfs +nis+ssh(2)
- 原生JS 实现放大镜
- 《机器学习实战》—— 朴素贝叶斯
- 低成本、强交互、沉浸式的云游戏,究竟如何实现?
- android预约管理系统,基于Android的医院就诊预约管理系统的设计与实现.doc
- android自定义键盘开源,Android自定义软键盘的设计与实现代码
- Vcenter 与 VCSA