记Linux报文到达主机但Socket收不到的异常

前言

这段经常遇到网络报文已经到达Linux主机,通过`tcpdump -i netif -nnN -vv`已可以看到报文已经到达某网卡,但是,socket却静悄悄、收不到的情况。

通过尝试发送其他同网段通信的报文,socket恢复活力,最后了解到,这是因为linux主机特殊的`rp_filter`网络参数,进行安全限制的效果:如果收到的报文,不是最优从此网卡上能够发出去的报文,则此报文会被丢弃掉,俗称**反向路径检查**

解决办法

  • 最优,保证同网段通信

  • 次,增加针对此主机全掩码的特殊路由,允许从此网卡进行收发,规避到rp_filter的影响

  • 再次,修改ip_forward或rp_filter网络协议栈参数让报文收发通畅,影响面比较大,所以,最低推荐顺序

你可能感兴趣的:(c++,Linux,网络,反向路径检查)