内核netfilter框架
2020-11-10 09:57:19 0 举报
netfilter,linux内核,网络协议栈
作者其他创作
大纲/内容
nf_conntrack_in
选择对应的qos策略来进行处理
nf_nat_ipv4_fn根据协议类型做SNAT转换
入口路由查找
是
iptunnel_xmit添加外层IP头部信息ip_local_out调用本地发送函数进行发送
调用skb的nf_conn里的helper处理函数来对报文进行处理
不对数据包做处理
LINUX内核协议栈
网络层协议栈
sch_handle_egress在出口处做流量限速
将报文发送到下一环节
获取 IP_CT_DIR_REPLY 以及IP_CT_DIR_ORIGINAL 方向上的的hash
NF_IP_LOCAL_IN
NF_IP_PRE_ROUTING
__dev_queue_xmit
nf_nat_setup_info在iptables的nat函数里对链接表项的特征标识进行转换
nf_conntrack_handle_icmp如果为icmp报文,则进行处理
能够找到skb的nf_conn并且报文的所属链接还没有被confirm
nf_ct_deliver_cached_events发送链接跟踪信息缓存消息
发送
gre_build_header给skb添加gre头部
否
上层协议栈
nf_ct_set将获取到的特生标识设置到skb->_nfct = nfct;
__dev_xmit_skb做qos队列调度
无
判断是否已经关联了nf_conn或者设置了不跟踪标记
nf_conntrack_event_cache 发送IPCT_RELATED关联消息
有
ip_tunnel_lookup根据skb的地址以及设备信息查找ip_tunnel
ipgre_xmit调用gre的tun设备发送函数
ipv4_confirm
__nf_conntrack_find_get查看获取的标识在链接追踪表里有没有现成的条目
没有
sch_direct_xmit将报文通过网卡发送
NF_IP_POST_ROUTING
gre_rcv处理gre协议隧道
nf_nat_initialized有没有进行过行过manip类型的NAT转换
其他传输层·协议
ipv4_conntrack_in
nf_nat_packet选择不同的协议处理函数做DNAT转换
__netif_receive_skb_core内核协议栈入口函数
icmp协议
判断链接状态是否为related并且是icmp报文
循环遍历用iptables注册的nat处理函数
没有找到的nf_conn或者当前报文所属连接为IP_CT_RELATED_REPLY状态
sch_handle_ingress在入口处做流量限速
nf_ct_del_from_dying_or_unconfirmed_list从非确认链表中删除此链接特征标识
skb->dev = tunnel->dev;gro_cells_receive将skb的dev切换为隧道设备的dev
nf_nat_ipv4_in获取报文ip头部
__iptunnel_pull_header将外层的IP头部去掉
init_conntrack初始化一个skb的特征标识条
出口路由子系统
将报文丢弃
Qos框架
tcf_classify遍历所有class的filter查看能否匹配
nf_ct_add_to_dying_list添加到dying表里进入老化流程
内核隧道框架
判断qdisc是否空闲
__netif_receive_skb_core网卡接收报文
nf_conntrack_handle_packet根据四层协议选择不同的处理函数来去更新链接状态
nf_nat_inet_fn获取ctinfo的状态
ipv4_conntrack_local
get_l4proto尝试获取四层协议信息
出口路由查找
可以
查看能否从链接跟踪表里查找到源和目的对应的跟踪链接条目
Netfilter框架
没有找到
不可以
获取失败
NF_IP_FORWARD
ip_is_fragment判断报文有没有分帧
gre_parse_header解析gre头部信息
nf_ct_add_to_unconfirmed_list将特征标识添加到未确认链接的链表中
ct->status |= IPS_CONFIRMED设置为confirm__nf_conntrack_hash_insert添加到对应的链接跟踪表里
可以找到
resolve_normal_ct解析并获取其报文特征标识
清除skb的nf_conn转到下一项处理
ip_tunnel_xmit获取要封装报文的IP头部信息ip_route_output_key查找路由信息
nf_nat_icmp_reply_translation处理icmp报文
数据报文入口
linux内核网络协议栈
nf_ct_is_confirmed防止在加锁前过程中发生报文的复制
NF_IP_LOCAL_OUT
报文发送
nf_nat_ipv4_local_fn根据协议类型做DNAT转换
需要重复解析
将报文从网卡上发送出去
发送链接追踪的IPCT_REPLY事件
nf_nat_ipv4_in
接收
获取dev的netdev_queue并判断q->enqueue是否为NULL
nf_conntrack_confirm
helper返回 NF_ACCEPT
0 条评论
下一页