Linux调整conntrack,如何扩展Linux的ip_conntrack

到底成功了没有呢?我需要将这一切展示在/proc/net/nf_conntrack里面,但是由于我使用了acct机制,所以我需要打开内核的acct选项:

sysctl -w net.netfilter.nf_conntrack_acct=1

真正修改的地方在/net/netfilter/nf_conntrack_standalone.c的ct_seq_show函数:

if (seq_printf(s, "use=%u ", atomic_read(&ct->ct_general.use)))

goto release;

{

struct nf_info {

struct nf_conn_counter acct[2];

char *info;

};

struct nf_conn_counter *acct;

struct nf_info *info;

acct = nf_conn_acct_find(ct);

if (acct) {

info = (struct nf_info *)acct;

if (info->info) {

if (seq_printf(s, "info=%s\n", info->info)) {

goto release;

}

}

}

}

在测试的时候,/proc/net/nf_conntrack中拥有了一个信息:

ipv4 2 tcp 6 431985 ESTABLISHED src=192.168.1.109 dst=192.168.1.1 sport=33591 dport=50 packets=2 bytes=112 src=192.168.1.1dst=192.168.1.109 sport=50 dport=33591 packets=1 bytes=60 [ASSURED] mark=0 zone=0 use=2 info=1234567890

这就说明这种方法是可行的,改动的地方并不多,关键是你要找到一个危险性最少的开刀部位,然后按照OO的思想扩展它,给它它所有没有的行为。曾经,我对nat的extend进行了偷梁换柱,但那是不对的,正确的做法是在原有结构体的地址后面紧跟着进行扩展,类似0长度数组那种。

我需要解释一下程序的自解释了。Linux在实现nf_conntrack的extend的时候,为何将类型数值以及定义的顺序用一个枚举写死呢?换句话说那就是为何不允许用户随意定义extend呢?答案是:那很难!Why?试想,如果我把一个结构体给了一个extend type。请问我把这个type存在哪?除了事先自定义一个type序列,仅存的办法就是把这个type序列存在extend本身了,这就遇到了一个循环定义的问题,我们对此是没有办法的,一个程序很难看到一对数字后,然后就可以把它们看作一个结构体,起码的字段分界就无法解决。虽然可以用OO的思想之外,剩下的解决方案就是寻求一种自解释的数据格式。我能想到的就是ASN.1了。实际上,ASN.1也是一种事先定义的类型格式序列,只不过该序列是经过标准化的而已,一个ASN.1序列是不需要解释的,它可以自己解释自己,需要的仅仅是文档。一个ASN.1序列可以将一段数据解释为一个结构体,或者反过来也可以。OpenSSL里面的d2i/i2d就是做这个的。难道不是吗?

清明时节雨纷纷,就这样在没有雨的一整天过去了,没有从《JAVA编程思想》中看到什么思想,依然没有感悟到JAVA的思想,依然没有。0b1331709591d260c1c78e86d0c51c18.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值