Как настроить NAT без сохранения состояния для двух UDP-соединений из глобальной сети в специальное сетевое пространство имен?

Да, есть ряд экземпляров, которые можно найти путем поиска вызовов killи killpgвjobs.cв исходном коде Bash.

Одним из примеров является обработка остановленных заданий при запуске execили при выходе из оболочки:оболочка отправляет SIGTERMиSIGCONTвсем остановленным заданиям.

1
04.03.2021, 18:07
1 ответ

В конце концов я сам нашел решение после многих часов чтения документации, учебных пособий, предложений на различных веб-страницах, многочисленных испытаний, а также глубокого и всестороннего мониторинга и анализа сети и сетевых фильтров.

nft add table ip prot1
nft add chain ip prot1 prerouting '{ type filter hook prerouting priority -300; policy accept; }'
nft add rule ip prot1 prerouting iif enp1s0 udp dport '{ 50404, 50441 }' ip daddr set 0.0.0.17 notrack accept
nft add rule ip prot1 prerouting iif vprot0 ip saddr 0.0.0.17 notrack accept
nft add chain ip prot1 postrouting '{ type filter hook postrouting priority 100; policy accept; }'
nft add rule ip prot1 postrouting oif enp1s0 ip saddr 0.0.0.17 ip saddr set 0.0.0.6 accept

Страница netfilter hooks должна быть открыта и прочитана в первую очередь, чтобы понять следующее объяснение.

Пояснение к используемым командам:

  1. Добавлена ​​таблица netfilterдля протоколаip(IPv4 )с именем prot1.
  2. Цепочка добавляется в таблицу prot1с именем preroutingтипа filterдля хука preroutingс приоритетом -300. Важно использовать номер приоритета ниже -200, чтобы иметь возможность обойти отслеживание соединения conntrack. Это исключает использование цепочки типа natдля трансляции сетевых адресов назначения, поскольку она имеет еще более низкий приоритет.
  3. В таблицу prot1цепочки preroutingдобавлено фильтрправило , которое применяется только к пакетам IPv4, полученным на input inter face enp1s0типа протокола udp, имеющего в качестве dпункт назначения portлибо 50404, либо 50441, который изменяетipdпункт назначения address пакета с 0.0.0.6на 0.0.0.17и активирует no trackсоединение для этого UDP-пакета. Вердикт указывается явно с помощью accept, хотя на самом деле нет необходимости передавать UDP-пакет, полученный от службы svaЦП приложения для службы sv2ЦП связи, как можно быстрее к следующему крючку, который в этом случае крючок forward.
  4. Второе фильтрправило добавлено в таблицу prot1в цепочку prerouting, которое применяется только ко всем всем пакетам IPv4, полученным на iввод i. ] nter face vprot0, не зависящий от типа протокола (udp, icmp,... )имеющийipsисточник address 0.0.0.17для активации no trackсоединения для этот пакет. Конечно, также можно было бы фильтровать только UDP-пакеты с соответствующим номером порта источника или получателя, но это дополнительное ограничение здесь не требуется, и это правило также подходит для пакетов ICMP, отправляемых обратно с 0.0.0.17на 0.0.0.5в пункте назначения. порт еще не открыт, так как служба sv2в данный момент не запущена. Вердикт снова указывается явно с помощью acceptвместо использования неявного значения по умолчанию continueдля максимально быстрой передачи пакета на хук forward.
  5. Вторая цепочка добавляется в таблицу prot1с именем postroutingтипа filterдля хука postroutingс приоритетом 100. Важно использовать цепочку типа filter, а не типа nat, чтобы иметь возможность применять преобразование исходного адреса к пакетам UDP (и ICMP ), которые обходят отслеживание соединения.
  6. фильтрправило добавлено в таблицу prot1во вторую цепочку postrouting, которая применяется только к пакетам IPv4, отправленным на oвыход inter face enp1s0не зависит от типа протокола (udp, icmp,... ), имеющего в качестве source address 0.0.0.17, который изменяетipsource address пакета из 0.0.0.17до 0.0.0.6. Вердикт еще раз указывается явно с помощью accept, хотя на самом деле нет необходимости передавать UDP-пакет, полученный от службы sv2коммуникационного ЦП, службе svaприкладного ЦП как можно быстрее. Это правило также изменяет исходный адрес на 0.0.0.6ICMP-пакета, отправленного с 0.0.0.17на порт назначения, недоступный из-за того, что служба sv2еще не запущена.Таким образом, центральный процессор приложения никогда не замечает, что он обменивается данными по двум каналам UDP с интерфейсом, отличным от 0.0.0.6, что было вторым требованием для выполнения, хотя и не очень важным.

Было нелегко выяснить, что преобразование сети без сохранения состояния необходимо для этой очень специальной конфигурации сети и типа связи между службами svaи sv2и что NAT необходимо выполнять без с помощью крючка nat.

0
18.03.2021, 22:27

Теги

Похожие вопросы