Kernel: network:问题分析一例,包从二层到了三层,却没有到四层

现象,使用tcpdump命令可以抓到进来的包,但是使用strace看程序,却没有在socket上收到数据。
通过 nstat/netstat/ip-s/ethtoo-S/看各种计数,发现没有错误的包。
也没看到iptables的设置;
也没有防火墙的设置;

根据这个现象,如果一开始不知道答案的话,只能通过一下步骤来分析问题。
https://mzhan017.blog.csdn.net/article/details/126438658 ;这里有记录一些分析的大体步骤。

  1. 看内核代码,找到三层的入口函数:netif_receive_skb
  2. 使用ftrace,打开上面这个入口函数的:function_graph, https://mzhan017.blog.csdn.net/article/details/122283614;这个功能还是非常的强大,可以分析函数执行的时间,也可以查看余下函数的整体执行过程。非常易于理解代码。
  3. 获取如下的结果:
  2)               |  netif_receive_skb() {
  2)               |    netif_receive_skb_internal() {
  2)               |      skb_defer_rx_timestamp() {
  2)   0.119 us    |        classify();
  2)   0.623 us    |      }
  2)               |      __netif_receive_skb() {
  2)               |        __netif_receive_skb_core() {
  2)               |          /* netif_receive_skb: dev=ens224 skbaddr=ffff8bdfee5a7c00 len=535 */
  2)               |          ip_rcv() {
  2)               |            ip_rcv_finish() {
  2)   0.295 us    |              udp_v4_early_demux();
  2)               |              ip_route_input_noref() {
  2)               |                ip_route_input_slow() {
  2)   0.466 us    |                  fib_table_lookup();
  2)               |                  fib_validate_source() {
  2)               |                    __fib_validate_source.isra.13() {
  2)   0.250 us    |                      fib_table_lookup();
  2)   0.738 us    |                    }
  2)   1.117 us    |                  }
  2)   0.050 us    |                  ip_handle_martian_source.isra.37();
  2)   2.788 us    |                }
  2)   3.111 us    |              }
  2)               |              kfree_skb() {
  2)               |                skb_release_all() {
  2)   0.048 us    |                  skb_release_head_state();
  2)               |                  skb_release_data() {
  2)   0.224 us    |                    page_frag_free();
  2)   0.574 us    |                  }
  2)   1.226 us    |                }
  2)               |                kfree_skbmem() {
  2)               |                  kmem_cache_free() {
  2)   0.071 us    |                    __slab_free();
  2)   0.447 us    |                  }
  2)   0.776 us    |                }
  2)   2.633 us    |              }

  1. 根据上面的执行步骤,大体上可以看到ip_handle_martian_source.isra.37(); 走到了火星包的处理过程。 根据下面这个链接,可以打开火星包日志打印开关:https://mzhan017.blog.csdn.net/article/details/120923977
  2. 下面主要是看,为什么归到火星包去了,这个和rp_filter 这个功能相关。
  3. 为了安全,systemd的安装包里有这么一个配置,将这个rp_filter的功能打开了,所以就会出现标题里的现象。

你可能感兴趣的:(笔记,网络,问题分析)