第一个部分是将标准的路由查找算法复制移植一份到nf_conntrack_ipv4模块中,第二部分就是在nf_conntrack被confirm的地方查询这个路由表,取出结果路由项中保存的info信息存储在conntrack中。这个操作仅仅针对一个流的第一个数据包。 兴许的数据包不再查询这个路由表。 内核的路由查找模块的移植代码一会儿我再给出,如今先...
跳过conntrack建立 在如下conntrack入口函数nf_conntrack_in中,如果报文设置了IP_CT_UNTRACKED标志,直接返回NF_ACCEPT。 unsignedintnf_conntrack_in(structsk_buff *skb,conststructnf_hook_state *state) {enumip_conntrack_info ctinfo;structnf_conn *ct, *tmpl; u_int8_t protonum;intdataoff, ret; tmpl= ...
通过kprobe的pre_handler来HOOK函数ipv4_confirm中调用nf_conntrack_confirm的具体指令跳过后续的nf_conntrack_confirm执行逻辑理论上是可行的,但毕竟要修改IP寄存器,有较大的稳定性风险。所以不考虑这种方法。 退而求其次,既然nf_conntrack_confirm无法HOOK, 可以考虑HOOK更外层的ipv4_confirm函数。nf_conntrack_confirm调用...
内核态一共需要实现两个部分,第一个部分是将标准的路由查找算法复制移植一份到nf_conntrack_ipv4模块中,第二部分就是在nf_conntrack被confirm的地方查询这个路由表,取出结果路由项中保存的info信息存储在conntrack中,这个操作仅仅针对一个流的第一个数据包。后续的数据包不再查询这个路由表。内核的路由查找模块的移植代...
实际上我的想法一開始就是错误的。正确性在于我知道我是错的。为何一直以来我一直在“修补”Linux内核协议栈以及Netfilter扩展的各种不良或者不完备的实现呢。比方“马上生效NAT”。比方双向静态NAT。比方不完备的conntrack confirm机制,不一而足。 这些缺陷难道Linux内核以及Netfilter社区的那帮大牛们意识不到吗?绝对不是...
1. conntrack表项初始化时 当一个数据包进入协议栈并且没有关联任何conntrack表项时,会为其初始化一个conntrack表项结构体,虽然它还没有必要被立即confirm,然而还是会被置入一个链表,整个过程大致如下: init_conntrack(){spin_lock_bh(&nf_conntrack_lock);// 这个expect机制我会在附录里详述,这里仅仅了解到所有...
优先级为NF_IP_PRI_CONNTRACK。 数据包在NF_INET_PRE_ROUTING时候会进入钩子ipv4_conntrack_in,之后在通向更加高层次NF_INET_LOCAL_IN时会进入ipv4_confirm钩子。 作为server如果有一个新的连接在PRE_ROUTING收到数据包,则为ORIG,然后server回复给client,此数据包会经过LOCAL_OUT出去那么这时的包就称为REPLY,再之后...
I can confirm the differences in newer Debian as@juanpablofavastated. Debian 9:nf_conntrack_ipv4nf_conntrack Debian 10:nf_conntrack Debian 11:nf_conntrack In Debian 9,nf_conntrackalso depends onnf_conntrack_ipv4so I guess it's still safe in Debian 9 if we just change this line tonf_conntr...
per gc run */ #define GC_MAX_EVICTS 256u static struct conntrack_gc_work conntrack_gc_work; void nf_conntrack_lock(spinlock_t *lock) __acquires(lock) { spin_lock(lock); while (unlikely(nf_conntrack_locks_all)) { spin_unlock(lock); /* * Order the 'nf_conntrack_locks_all' load ...
* At worst (or if we race), we will end up with a final duplicate in * __nf_conntrack_confirm and drop the packet. */ static void get_unique_tuple(struct nf_conntrack_tuple *tuple, const struct nf_conntrack_tuple *orig_tuple, const struct nf_nat_range2 *range, struct nf_...