Как выборочно отключить пересборку 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.

0 ответов

Другие вопросы по тегам