Linux Netfilter conntrack对zone的支持

我真的羡慕自己,特别的极端崇拜,要是我拉二胡能像摆弄Linux网络那样随心所欲,我就敢请个一个月的无薪长假,去公园每天拉半天二胡...只可惜到现在还没怎么拉响。
       一个多月前,我对Netfilter conntrack做了一个优化,即将conntrack分为了多个表替换现在的一个表,目的是为了提高查找的效率,这个优化是独立进行的,我希望在最新的内核版本中存在这样的优化,然而没有。但是却有一个类似的,即conntrack zone的支持,这个特性不是为了优化,它仅仅在conntrack中增加了一个键值,即zone,这样就可以将同样的conntrack或者NAT规则放在不同的zone中了。这个特性有什么用呢?在LWN上有一篇Artical上有讲到:

The attached largish patch adds support for "conntrack zones",
which are virtual conntrack tables that can be used to seperate
connections from different zones, allowing to handle multiple
connections with equal identities in conntrack and NAT.

A zone is simply a numerical identifier associated with a network
device that is incorporated into the various hashes and used to
distinguish entries in addition to the connection tuples. Additionally
it is used to seperate conntrack defragmentation queues. An iptables
target for the raw table could be used alternatively to the network
device for assigning conntrack entries to zones.

This is mainly useful when connecting multiple private networks using
the same addresses (which unfortunately happens occasionally) to pass
the packets through a set of veth devices and SNAT each network to a
unique address, after which they can pass through the "main" zone and
be handled like regular non-clashing packets and/or have NAT applied a
second time based f.i. on the outgoing interface.

Something like this, with multiple tunl and veth devices, each pair
using a unique zone:

<tunl0 / zone 1>
     |
  PREROUTING
     |
  FORWARD
     |
  POSTROUTING: SNAT to unique network
     |
  <veth1 / zone 1>
  <veth0 / zone 0>
     |
  PREROUTING
     |
  FORWARD
     |
  POSTROUTING: SNAT to eth0 address
     |
  <eth0>

As probably everyone has noticed, this is quite similar to what you
can do using network namespaces. The main reason for not using
network namespaces is that its an all-or-nothing approach, you can‘t
virtualize just connection tracking. Beside the difficulties in
managing different namespaces from f.i. an IKE or PPP daemon running
in the initial namespace, network namespaces have a quite large
overhead, especially when used with a large conntrack table.

这是一篇很早以前的文章,我在纳闷之前怎么就没有注意到。请注意中间的那个图示,是不是和我的《单独一台机器测试OpenVPN加密隧道的问题和解决》这篇文章中的场景所一致呢?太TM像了,简直是一样的,但是解决的是不同的问题!引入conntrack zone的部分原因在于,某些类似veth的驱动程序的xmit并不会清除skb附着的conntrack结构体,毕竟网卡驱动和conntrack是两个独立的内核模块,二者没有必要联动,因此不要指望每一个xmit函数都会清除skb附着的额外结构体。此时zone就起到了一个过渡的作用,背后的牢骚是:我无法保证你清除conntrack,但是我自己可以替换掉它。
      以前的conntrack仅仅根据tuple来对应,每一个net namespace中仅仅维护一张依靠tuple作为查找键的conntrack表,一个skb如果在veth的一端已经附着了一个conntrack,加之veth驱动没有清除它,那么在另一端,该skb将保持这个conntrack,管理员除了可以notrack之外无法对它进行任何干预,完全由conntrack模块内部自动维护。conntrack zone的引入,使得你可以在raw表中为一个skb附着一个zone id为特定值的conntrack模板,该模板的zone id指示了接下来在conntrack查找时的zone,仅此而已,目前的mainline实现中,表还是一张表,只是多了一个键值。在我自己的实现中,分裂成了多张表。
       多了一个zone键值后,管理员可以从外部干预skb的conntrack了。抛开实现的方法,你可以认为你可以在iptables的raw表中为一个数据包设置一个zone id,该skb关联的conntrack在该zone中查找,在实现上,你可以将zone仅仅作为一个键值,也可以将其作为表索引引入多张表(为什么不呢?内存是问题吗?不是已经有touch highuser的办法了吗?)。
       二胡没拉响,问题一大堆,track or notrack?

时间: 2024-10-11 13:42:06

Linux Netfilter conntrack对zone的支持的相关文章

Linux netfilter 学习笔记 之十二 ip层netfilter的NAT模块代码分析

本节主要是分析NAT模块相关的hook函数与target函数,主要是理清NAT模块实现的原理等. 1.NAT相关的hook函数分析 NAT模块主要是在NF_IP_PREROUTING.NF_IP_POSTROUTING.NF_IP_LOCAL_OUT.NF_IP_LOCAL_IN四个节点上进行NAT操作,在上一节中我们知道nat表中只有PREROUTING.POSTROUTING.LOCAL_OUT三条链,而没有NF_IP_LOCAL_IN链,所以不能创建在LOCAL_IN hook点的SNAT

linux系统如何更改字符集的支持,解决Linux中文显示乱码使centos显示中文

linux系统如何更改字符集的支持 怎么设置Linux系统中文语言,这是很多小伙伴在开始使用Linux的时候,都会遇到一个问题,就是终端输入命令回显的时候中文显示乱码.出现这个情况一般是由于没有安装中文语言包,或者设置的默认语言有问题导致的.咗嚛本经验以centos为例,操作Linux怎么查看语言,设置修改语言 主要是更改/etc/locale.conf文件.centos7之前的版本的配置文件为:/etc/sysconfig/i18n 查看当前系统语言 登陆linux系统打开操作终端之后,输入 

Linux下安装libiconv使php支持iconv函数

libiconv组件安装好了可以让我们php支持iconv函数了,这个函数的作用就是字符编码强制转换了,下面和111cn小编一起来看一个Linux中安装libiconv使php支持iconv函数的例子吧. 问题: 线上运行的lamp服务器,php不支持iconv函数. 解决方法: 安装libiconv,重新编译apache,使php支持iconv函数,实现utf-8和gb2312编码的转换. 具体步骤: 1.下载libiconv cd /usr/local/src wget http://ftp

Linux下安装PHP的GD支持库

Linux下安装PHP的GD支持库 1.安装 zlib  wget ftp://ftp.sunfreeware.com/pub/freeware/SOURCES/zlib-1.2.3.tar.gz tar -zxf zlib-1.2.3.tar.gz cd zlib-1.2.3 ./configure –prefix=/usr/local/zlib make make install 2.安装 jpeg wget ftp://ftp.sunfreeware.com/pub/freeware/SO

Linux Netfilter开发小结

前置知识: IP包: struct ip { #if BYTE_ORDER == LITTLE_ENDIAN unsigned char ip_hl:4, /* header length */ ip_v:4; /* version */ #endif unsigned char ip_tos; /* type of service */ short ip_len; /* total length */ unsigned short ip_id;/* identification */ shor

Linux下markdown编辑软件 — retext 支持实时预览,存为pdf、html、ODT等

本文由Suzzz原创,发布于 http://www.cnblogs.com/Suzzz/p/4129368.html,转载请保留此声明 ReText是一个linux下的markdown和reStructedText的编辑器,支持实时预览.输出为pdf.html.ODT等功能. 直接上效果图 查看生成的 html 代码

《 转》Linux 网卡驱动程序对 ethtool 的支持和实现

Linux 的一个显著特点就是其强大的网络功能,Linux 几乎支持所有的网络协议,并在这些协议基础上提供了丰富的应用.对 Linux 网络管理的重要性不言而喻,这些管理依赖于网络工具,比如最常用的 ifconfig,route,ip,ethtool 等,其中 ethtool 提供了强大的网卡及网卡驱动管理能力,其具体的实现框架和网络驱动程序及网络硬件关系紧密,容易修改和扩展,能够为 Linux 网络开发人员和管理人员提供对网卡硬件,驱动程序和网络协议栈的设置,查看以及及调试等功能. 从典型的以

夺命雷公狗---linux NO:38 linux下nginx的pathinfo的支持

我们在nginx 中使用 thinkphp   的时候会遇到很多的问题,比如: 没权限,这个就是linux  权限管理的好处,我们给他权限.. 我们给他权限即可正常访问了: 然后我们为 IndexController  控制器下添加一个lists的方法: 然后我们添加一个lists的方法,如下所示: 保存退出.对她进行访问.. 没戏...因为nginx 不支持php后面的url 那里带斜线和后面带一串的参数..所以我们要想办法让他支持pathinfo.. 不过我们先来windows下的apach

为Linux上的Tomcat安装apr支持

在安装并配置好JDK和tomcat之后,就可以提供web的访问支持了,但是在启动的信息里面,会有相关的提示,说的意思就是要求你安装apr支持,而安装apr支持需要使用源代码一步一步来. 下面就请跟着我,使用源代码方式安装apr支持. 0.前提 ①请安装并配置好JDK和tomcat,并且创建链接文件,使得 /usr/java/jdk 相当于JDK的根目录 /usr/local/tomcat 相当于tomcat的根目录. ② 已经安装好了openssl的开发包,不管是源代码方式安装还是使用包管理器方