Как выборочно отключить пересборку IP?
На диаграмме ниже показан сценарий, включающий агрегирование трех медленных каналов по пропускной способности .
Быстрый хост на (@ ) обменивается данными с хостом наLAN
(@ ), который подключен тремя медленными каналами кWAN
через три роутера под управлением Linux v4.14.151 и/iptables
брандмауэры:
IP-трафик от быстрого хоста поступает к трем маршрутизаторам фрагментированным и рандомизированным (но всегда от54.239.98.8
). Я не могу контролировать эту фрагментацию (корпоративная политика, разберитесь) - я подозреваю, что фрагментация намеренно выполняется быстрым хостом.
ПРОБЛЕМА : Каждый маршрутизатор пытается заново собрать фрагментированные IP-пакеты, что приводит к потере данных, поскольку фрагменты проходят случайным образом через три маршрутизатора, и часто один маршрутизатор не может собрать все фрагменты пакетов для успешной повторной сборки.
Проанализировавiptables / netfilter
На диаграмме ниже я вижу, что неправильная повторная сборка происходит в PREROUTINGnetfilter
крючок, перед цепочками правил вraw
таблица обрабатывается.
ПОПЫТКА РЕШЕНИЯ : я изменил модуль ядра.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,
},
};
Полный исходный код этого модуля можно посмотреть здесь.
Это изменение кода отключает повторную сборку всех входящих пакетов и позволяет неизмененным IP-фрагментам передаваться на целевой хост в локальной сети (@).192.168.0.100
), который выполняет собственную сборку пакетов, поступающих от всех трех маршрутизаторов. Это решение работает, но оно некрасиво, поскольку изменяет код ядра и отключает дефрагментацию ВСЕХ пересылаемых пакетов (независимо от их источника).
ВОПРОС : Есть ли лучшее решение, чем внесение этого изменения в код ядра?
Особенно способ выборочного отключения IP-дефрагментации только для пакетов, поступающих от быстрого хоста в WAN@.ip.src == 54.239.98.8
.