下图描述了一个网络,该网络涉及三个慢速通道吞吐量的聚合WAN
。每台路由器都试图重新组装分段的 IP 数据包,这会导致数据丢失,因为这些分段采用随机路径通过三个路由器,并且通常一台路由器无法收集所有数据包分段以成功重组。
来自快速主机的 IP 流量分段并随机到达三个路由器(但始终来自54.239.98.8
)。我无法控制这种碎片化(企业政治,去看看) - 我怀疑碎片化是由快速主机故意完成的。
我修改了内核模块nf_defrag_ipv4
以禁用PREROUTING
钩子中的有问题的碎片整理,如下所示:
static const struct nf_hook_ops ipv4_defrag_ops[] = {
{
.hook = ipv4_conntrack_defrag, /* I changed this to point to: return NF_ACCEPT; */
.pf = NFPROTO_IPV4,
.hooknum = NF_INET_PRE_ROUTING,
.priority = NF_IP_PRI_CONNTRACK_DEFRAG,
},
{
.hook = ipv4_conntrack_defrag,
.pf = NFPROTO_IPV4,
.hooknum = NF_INET_LOCAL_OUT,
.priority = NF_IP_PRI_CONNTRACK_DEFRAG,
},
};
该模块的完整源代码可以在这里查看。
有更好的解决方案吗?特别是一种仅对来自 WAN @ 上的快速主机的数据包选择性禁用 IP 碎片整理的方法ip.src == 54.239.98.8
。
(@)上的快速主机正在与( @ )WAN
上54.239.98.8
的主机通信,后者通过三个慢速通道连接到运行 Linux v4.14.151 和/防火墙的三个路由器:LAN
192.168.0.100
WAN
netfilter
iptables