美文网首页
linux conntrack对报文的处理

linux conntrack对报文的处理

作者: 苏苏林 | 来源:发表于2021-12-11 21:47 被阅读0次

Linux 内核中的 ct 系统,本身从不改变/操纵数据包。通常也不会丢弃数据包,只可能在极少数情况下发生这种情况。
ct更多的是为其他内核组件提供决策。如 NAT 子系统以及Iptables和Nftables 的状态包过滤模块。连接跟踪最重要的使用场景就是 NAT,NAT 依赖连接跟踪的结果。
所以,即使存在established 状态的 ct,数据包还是会经过各个hook点,各个内核组件,还是会查找路由表、neighbor表等。
如下,nat流程中,nf_nat_packet 调用 nf_nat_manip_pkt 调用 nf_nat_ipv4_manip_pkt ,使用nf_conntrack_tuple *target 对数据包进行修改,而且在PREROUTING只修改daddr 和 dport,在POSTROUTING只修改saddr和sport。

unsigned int
nf_nat_inet_fn(void *priv, struct sk_buff *skb, const struct nf_hook_state *state)
{
    ct = nf_ct_get(skb, &ctinfo);
    if (!ct)    // conntrack 不存在就做不了 NAT,直接返回,这也是我们为什么说 NAT 依赖 conntrack 的结果
        return NF_ACCEPT;

    nat = nfct_nat(ct);

    switch (ctinfo) {
    case IP_CT_RELATED:
    case IP_CT_RELATED_REPLY: /* Only ICMPs can be IP_CT_IS_REPLY.  Fallthrough */
    case IP_CT_NEW: /* Seen it before? This can happen for loopback, retrans, or local packets. */
        if (!nf_nat_initialized(ct, maniptype)) {
            struct nf_hook_entries *e = rcu_dereference(lpriv->entries); // 获取所有 NAT 规则
            if (!e)
                goto null_bind;

            for (i = 0; i < e->num_hook_entries; i++) { // 依次执行 NAT 规则
                if (e->hooks[i].hook(e->hooks[i].priv, skb, state) != NF_ACCEPT )
                    return ret;                         // 任何规则返回非 NF_ACCEPT,就停止当前处理

                if (nf_nat_initialized(ct, maniptype))
                    goto do_nat;
            }
null_bind:
            nf_nat_alloc_null_binding(ct, state->hook);
        } else { // Already setup manip
            if (nf_nat_oif_changed(state->hook, ctinfo, nat, state->out))
                goto oif_changed;
        }
        break;
    default: /* ESTABLISHED */
        if (nf_nat_oif_changed(state->hook, ctinfo, nat, state->out))
            goto oif_changed;
    }
do_nat:
    return nf_nat_packet(ct, ctinfo, state->hook, skb);
oif_changed:
    nf_ct_kill_acct(ct, ctinfo, skb);
    return NF_DROP;
}

相关文章

  • linux conntrack对报文的处理

    Linux 内核中的 ct 系统,本身从不改变/操纵数据包。通常也不会丢弃数据包,只可能在极少数情况下发生这种情况...

  • netfilter之nat

    总结如下:a. original方向报文根据规则做了转换,那么reply方向一定是根据conntrack连接状态做...

  • 核心路由器业界实现(1)--Cisco NCS6008(下)

    2 NCS6008的数据路径 报文从不同类型的物理接口上接收 NP上的报文处理引擎对报文进行各种处理 报文经由Fa...

  • 【tcp/udp】tcp/udp/icmp丢包分析

    一、 Linux 系统接收网络报文的过程 Linux 系统接收网络报文的过程: 首先网络报文通过物理网线发送到网卡...

  • java_8_第一个API

    组成要素 客户端:生成报文,发送报文,接收报文,处理报文 服务端:接收报文,解析报文,调用服务代码 服务代码:处理...

  • 接口测试

    接口测试的原理 测试人员借助工具模拟客户端向服务器端发送请求报文,服务器端接收请求报文后,对相应的报文做出处理并向...

  • MQTT5.0 消息发布流程

    概览 MQTT5.0协议对部分QoS报文,以及报文处理的流程做了一些升级,本文对此这部分升级的内容做简单的介绍。 ...

  • MQTT5.0 消息发布流程

    概览 MQTT5.0协议对部分QoS报文,以及报文处理的流程做了一些升级,本文对此这部分升级的内容做简单的介绍。 ...

  • 解决抓到的报文校验和错误问题

    解决抓到的报文校验和错误问题 在linux上使用tcpdump抓包,使用wireshark分析时发现发出的报文校验...

  • Dpdk与OpenvSwitch

    1、DPDKDPDK是X86平台报文快速处理的库和驱动的集合,大多数情况下运行在linux的用户态空间。 2、Op...

网友评论

      本文标题:linux conntrack对报文的处理

      本文链接:https://www.haomeiwen.com/subject/nqdlfrtx.html