图1(点击可查看大图)
去程: 1 src(10.148.74.37:48640) dst(192.168.107.214:15010) 2 src(10.148.74.37:48640) dst(10.148.74.34:15010) # DNAT 回程: 3 src(10.148.74.34:15010) dst(10.148.74.37:48640) 4 src(192.168.107.214:15010) dst(10.148.74.37.48640) # SNAT
图2(点击可查看大图)
图3(点击可查看大图)
图4(点击可查看大图)
图5(点击可查看大图)
nf_conntrack_tcp_be_liberal - BOOLEAN 0 - disabled (default) not 0 - enabled
Be conservative in what you do, be liberal in what you accept from others. If it's non-zero, we mark only out of window RST segments as INVALID.
static bool tcp_in_window() { … if (before(seq, sender->td_maxend + 1) && in_recv_win && before(sack, receiver->td_end + 1) && after(sack, receiver->td_end - MAXACKWINDOW(sender) - 1))#检查收到的包的序列号是否在TCP接收窗口之内 { … } else {#这里就是不正常情况下,报文不在窗口里的处理,如果没有enable nf_conntrack_tcp_be_liberal, 那么res为false, 反之为true res = false; if (sender->flags & IP_CT_TCP_FLAG_BE_LIBERAL || tn->tcp_be_liberal) res = true; if (!res) { ... } } return res;
} } 接着看tcp_in_window返回值的处理: static int tcp_packet() { if (!tcp_in_window(ct, &ct->proto.tcp, dir, index, skb, dataoff, th)) { spin_unlock_bh(&ct->lock); return -NF_ACCEPT; } } #define NF_DROP 0 #define NF_ACCEPT 1
抓包尽可能的完整,在按照正常逻辑分析问题过滤的同时,也要关注非正常情况下的特殊报文,因为问题的出现往往就是非正常逻辑的报文引起的。
内核网络处理部分有很多细节的选项,在遇到百思不得其解的网络问题时,我们可以从这些选项上入手分析问题。
性能问题也会带来一些意想不到的功能问题。在我们系统设计开发的前期需要尽可能地关注和测试性能问题。
Ipvs本身是有连接空闲超时时间的,在没有TCP Keepalive的情况下,中间组件也是有可能删除连接导致Client/Server 被Reset。虽然我们目前遇到的不是这种情况,但也是以后值得关注的问题。
本期嘉宾: 张博,eBay 软件工程师,目前致力于eBay网络流量管理以及eBay Kubernetes平台网络相关组件开发维护。
下集预告