Рейтинг:1

Почему все используют MASQUERADE/SNAT вместо NAPT/PAT?

флаг in

История

У меня есть виртуальный интерфейс VPN wireguard WG0 (может быть что угодно) и физический интерфейс eth0. Я хочу перенаправлять пакеты из VPN в свою локальную сеть или с интерфейса на другой интерфейс.

Почти все блоги, статьи, учебные пособия советуют использовать МАСКАРАД или же Источник NAT Только: iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

Более того, IP-маскарад это просто SNAT (источник NAT), он не меняет исходный порт.

Вопрос

  • Я ошибаюсь, думая, что я должен использовать NAPT/PAT вместо?
  • Для полноты, как я могу добавить правило NAPT/PAT с iptables и/или nftables?

Мысли

Возможны конфликты (исходный порт) между пакетами, сгенерированными хостом и отправленными с WG0 (или любые другие виртуальные/физические интерфейсы). ИМХО NAPT нужно использовать, чтобы избежать этих конфликтов.

RFC 2663, Преобразование сетевых адресов и портов (NAPT)

Рейтинг:6
флаг gr

Если пункт назначения может направить свой трафик к источнику, NAT или PAT не требуются.

Например, NAT/PAT не требуется, если VPN-клиенты в 10.8.0.0/24 хотят общаться с вашими LAN-устройствами в 192.168.1.0/24, пока задействованные устройства могут маршрутизироваться в другую сеть (через свой шлюз). ).

Когда источник находится в сети rfc1918 (частный IP-адрес), а пункт назначения — общедоступный IP-адрес, поскольку сети rfc1918 не маршрутизируются через Интернет, требуется NAT для замены частного IP-адреса общедоступным IP-адресом. Это перевод исходного адреса. Эту работу может выполнять SNAT, а не PAT.

Кроме того, вы ошибаетесь, полагая, что SNAT/MASQUERADE не меняет исходные порты.

Опция --to-source используется для указания источника, который должен использовать пакет. Эта опция, в самом простом случае, принимает один IP-адрес, который мы хотим использовать в качестве исходного IP-адреса в заголовке IP. Если мы хотим балансировать между несколькими IP-адресами, мы можем использовать диапазон IP-адресов, разделенных дефисом. IP-номера --to-source могут, например, выглядеть примерно так, как в приведенном выше примере: 194.236.50.155-194.236.50.160. Исходный IP-адрес для каждого потока, который мы открываем, затем будет случайным образом выделяться из них, и один поток всегда будет использовать один и тот же IP-адрес для всех пакетов в этом потоке. Мы также можем указать диапазон портов, которые будут использоваться SNAT. Тогда все исходные порты будут ограничены указанными портами. Тогда бит порта правила будет выглядеть так, как в приведенном выше примере: 1024-32000. Это действительно только в том случае, если -p tcp или -p udp были указаны где-то в совпадении с рассматриваемым правилом. iptables всегда будет стараться избегать каких-либо изменений портов, если это возможно, но если два хоста попытаются использовать одни и те же порты, iptables сопоставит один из них с другим портом.. Если диапазон портов не указан, то, если они необходимы, все исходные порты ниже 512 будут сопоставлены с другими портами ниже 512. Исходные порты между 512 и 1023 будут сопоставлены с портами ниже 1024. Все остальные порты будут сопоставлены с 1024 или выше.Как указывалось ранее, iptables всегда будет пытаться поддерживать исходные порты, используемые фактической рабочей станцией, выполняющей подключение. Обратите внимание, что это не имеет ничего общего с портами назначения, поэтому, если клиент попытается связаться с HTTP-сервером за пределами брандмауэра, он не будет сопоставлен с портом управления FTP.

https://www.frozentux.net/iptables-tutorial/iptables-tutorial.html#SNATTARGET

Обратите внимание, что если ваше устройство хочет подключиться к удаленному серверу через заданный порт назначения, есть вероятность, что операционная система уже назначила случайный исходный порт более 1024. Для доступа к удаленному HTTPS-серверу через порт 443 не требуется, чтобы исходный порт был 443.

Alexis avatar
флаг in
Без добавления статических маршрутов в шлюз или во все узлы локальной сети они не смогут направлять пакеты обратно в подсеть VPN. Требуется NAT/NAPT.
Alexis avatar
флаг in
Я не согласен с тем, что «эта работа может быть выполнена с помощью SNAT, а не PAT», NAPT необходим, если несколько компьютеров используют один и тот же общедоступный IP-адрес.
Alexis avatar
флаг in
Спасибо за ссылку, это не официальный документ iptables, и это моя проблема. Если это действительно так для правила NAT, это противоречит rfc. Я бы не хотел, чтобы iptables делал то, чего я не просил (изменение уровня 4).У вас есть какой-нибудь **официальный документ**, в котором говорится то же самое? сетевой фильтр, iptables или nftables? Кроме того, не смешивайте термин SNAT, описывающий концепцию, с именем цели в iptables. В соответствии с его определением `SNAT/MASQUERADE` **НЕ** изменяет уровень 4. Если `iptables` позволяет выполнять PAT/NAPT на своей так называемой цели SNAT, это другое дело.
флаг gr
Да, PAT необходим, но эта задача выполняется с помощью цели SNAT iptables (или MASQUERADE, что в основном является SNAT). Вот почему SNAT (или MASQUERADE) iptables достаточно, вам не нужно явно выполнять PAT. SNAT выполняет перевод портов, как указано в неофициальной документации, но подтверждается официальной документацией netfilter. См. раздел «6.3.4. Неявное сопоставление исходных портов». https://www.netfilter.org/documentation/HOWTO/NAT-HOWTO.txt
Alexis avatar
флаг in
Спасибо. Хороший улов, я буду считать, что он все еще актуален для ядер> 2.4. SNAT/MASQUERADE не должен неявно выполнять трансляцию портов. Я считаю, что это скорее решение netfilter объединить оба. (как указано в rfc2663) Хотелось бы, чтобы это было где-то объяснено или подробно описано. Я буду осторожен с другими системами.
ilkkachu avatar
флаг us
@ Алексис, TBH, ты немного глуп. На [справочной странице iptables] (https://man7.org/linux/man-pages/man8/iptables-extensions.8.html) сказано, что SNAT выполняет преобразование портов, а MASQUERADE аналогичен. И RFC, на который вы ссылаетесь, даже не упоминает ни один из этих двух терминов. Итак, задокументировано то, что он делает, и в RFC даже не используются те же термины, так что это даже не перегруженное значение. Нет проблем. Если вам нужна только трансляция адресов, вам придется использовать некоторые другие функции. `NETMAP` похоже, что это может быть один, но я его не использовал.
Alexis avatar
флаг in
@ilkkachu держи глупости за тебя, я тебе не друг.Справочная страница, на которую вы ссылаетесь, не указывает, что она выполняет автоматическое преобразование портов для `SNAT` или `MASQUERADE`, только параметры, которые мы можем интерпретировать как **необязательные**, указывающие на функцию, которая **в основном/99%** используется для явного * *Перенаправление порта**.
ilkkachu avatar
флаг us
@Алексис, это не так? Для SNAT: "--to-source [...] Если диапазон портов не указан, тогда исходные порты ниже 512 будут сопоставлены с другими портами ниже 512: от 512 до 1023 включительно будут сопоставлены с портами ниже 1024, а другие порты будут сопоставлены до 1024 и выше. Там, где это возможно, изменение порта не будет происходит." для MASQUERADE: "--to-ports порт[-порт] Это указывает диапазон исходных портов для использования, переопределяя стандартная эвристика выбора исходного порта SNAT (см. выше)."
ilkkachu avatar
флаг us
@ Алексис, а я никогда не говорил, что ты такой. Просто у вас, кажется, есть некоторые ожидания, которые просто не применимы, и что RFC, на который вы ссылаетесь, даже не поддерживает вас в вопросе об именах. Парни из Linux могут называть свои вещи так, как им нравится, и спустя годы и годы, когда они остаются такими, как они есть, они вряд ли изменят их. Так что, по сути, вы можете выбирать, хотите ли вы бороться с ветряными мельницами (что, по моему мнению, немного глупо) или принять все как есть. Если вы считаете, что документация недостаточно ясна, вы, конечно, можете отправить им отчет об ошибке, чтобы уточнить это?
Рейтинг:6
флаг za

У вас как-то неправильное различие между СНАТ/МАСКАРАД и NAPT/PAT. Это не так.

В Linux существует два типа динамических правил NAT, оба из которых вы называете «NAPT»:

  • исходный NAT, который намеревается оставить адрес назначения нетронутым и изменяет только источник адрес. Иногда это будет также измените исходный порт. Например, если в таблице отслеживания соединений уже есть запись с этим конкретным (proto, src-addr, src-port, dst-addr, dst-port) кортеж (src-addr и src-port после перевода), чтобы иметь возможность различать, что есть что, новый перевод должен использовать другой src-порт (поскольку это единственная степень свободы), поэтому «НАПТ» неминуемо произойдет. Примеры правил типа SNAT: СНАТ и МАСКАРАД. Разница между ними в том, что при использовании SNAT требуется указывать в правиле в какой адрес транслировать (и, возможно, какой диапазон портов использовать), а с MASQUERADE он сам делает выбор, исходя из того, через какой интерфейс пакету предназначен выход. Оба они должны быть установлены в РАЗМЕЩЕНИЕ цепочке после того, как была выполнена большая часть другой обработки, включая маршрутизацию пакета. Этот тип правила используется для того, чтобы многие компьютеры могли быть скрыты за одним IP-адресом выхода, например. для доступа в Интернет по локальной сети и так далее. Это также будет включать любых пользователей VPN, если вы собираетесь выходить в Интернет через VPN.
  • NAT назначения, который оставляет исходный адрес без изменений и обновляет только пункт назначения адрес и, если вы настроили это, порт назначения, так что это тоже правило «NAPT». Правила этого типа ДНКТ, ПЕРЕНАПРАВЛЕНИЕ, КЛАСТЕРИП и, вероятно, еще какие-то, всех не помню; они установлены в ПРЕДВАРИТЕЛЬНАЯ МАРШРУТИЗАЦИЯ цепочки, потому что решение о маршрутизации обычно должно быть изменено под влиянием правила. Пакет, который изначально предназначался самой машине (имеет ее адрес в качестве пункта назначения) и должен был быть пройден ВХОД и достиг какого-то локального процесса, вместо этого транслируется и после обхода ВПЕРЕД chain он перенаправляется дальше в какую-то другую систему. Или наоборот. Куда идти, INPUT или FORWARD, это решение о маршрутизации, которое мы должны изменить с помощью правила. Этот тип правила используется для доступа к какой-либо внутренней системе из Интернета.

Иногда, кстати, обе правила могут использоваться для одного пакета (и соединения). Это особый случай, но он полезен, если вам нужно, чтобы пакеты из какой-то внешней системы (поэтому в PREROUTING необходимо использовать DNAT) отображались как исходящие с какого-то внутреннего адреса (для чего SNAT используется в POSTROUTING).

В Linux также есть статические правила типа NAT, такие как СЕТЕВАЯ КАРТА который весьма специфичен и редко используется. Я сомневаюсь, что вы говорите об этом и видели какие-либо инструкции, в которых упоминается этот тип правила.

Linux делает абсолютно никакого различия между частными (RFC1918) и публичными адресами. Вы можете использовать NAT для своей общедоступной подсети, если хотите (но это будет пустой тратой адресов). Вы можете оставить частные IP-адреса без перевода (но обычно это приведет к тому, что они не будут подключаться к Интернету).

VPN — это не что иное, как дополнительный сетевой интерфейс на машине, и к нему следует относиться соответственно. Следовательно, вам разрешено использовать общедоступные адреса для VPN, если они у вас есть. Например, у меня может быть маршрутизация некоторой подсети /29 через VPN-маршрутизатор и настройка OpenVPN, чтобы вся эта общедоступная подсеть была моей сетью VPN! В то время как пример OpenVPN выглядит искусственным, WireGuard много скорее всего так настроено. Например, новое решение для пространства имен позволяет wireguard быть единственным интерфейсом в системе. Если есть требование, чтобы система напрямую имела общедоступный IP-адрес (я не буду обсуждать причины, по которым может исходить это требование), неизбежно, что вы в конечном итоге будете использовать общедоступные IP-адреса внутри VPN! Скорее всего, без какого-либо NAT для них.

Alexis avatar
флаг in
Спасибо за ваш длинный ответ. У NAT и NAPT есть определения, я правильно их интерпретирую. Я никогда не говорил о публичных/частных IP-адресах. Я не помечал wireguard, потому что, как вы сказали, не имеет значения, что управляет интерфейсом. Приемлемый ответ говорит мне, что **исходный NAT** netfilter фактически выполняет **NAPT/PAT** одновременно. Это все, что я пропустил, я думал, что мы должны явно указать netfilter, что мы хотим **также** трансляцию портов в сочетании с простым NAT.
Nikita Kipriyanov avatar
флаг za
Почему вы думаете, что определение, с которым вы столкнулись, правильное или что другого определения быть не может? NAT можно определить так, чтобы он также включал преобразование портов, и *это* определение используется в Linux, и не только в Linux. На самом деле «строгая» версия довольно непрактична, потому что преобладающее использование NAT в настоящее время заключается в том, чтобы позволить многим машинам получать доступ к Интернету с использованием одного общедоступного IP-адреса, а это *требует* перевода порта также по причине, которую я упомянул в своем ответе. Поэтому для практических целей разумнее использовать определение NAT, которое *включает* трансляцию портов.
Alexis avatar
флаг in
**rfc2663**: `Преобразование сетевых адресов – это метод, с помощью которого **IP-адреса** сопоставляются из одной области адресов в другую, обеспечивая прозрачную маршрутизацию к конечным хостам.` Я только что прочитал определение, и оно не включает NAPT. . Тем не менее, вы правы для практических целей, для всех документов / людей, упоминающих NAT, разумнее также явно включить PAT в свое определение.
Alexis avatar
флаг in
На самом деле, по определению, Linux и все они неверны, и все они должны использовать NAPT вместо NAT...в мире, где люди используют правильные термины.
Nikita Kipriyanov avatar
флаг za
Не вы и не RFC определяете правильный словарь. Язык — это живой зверь, над которым мы, похоже, абсолютно не властны ;) Единственное, что здесь имеет силу, — это общественный консенсус.
Alexis avatar
флаг in
Согласитесь, в таком случае это должно быть задокументировано или упомянуто шире. Очень редко встречаются упоминания о переводе портов в сочетании со страницей NAT doc/blog/tutorials/whatever. Отсюда мой вопрос.
TooTea avatar
флаг in
@ Alexis «NAT» - это просто стандартный общий отраслевой термин для любого вида трансляции сети и порта. Если вы не пишете RFC, вам не нужно проводить явное различие между NAT, NAPT и PAT. (Вы также увидите, как люди говорят о «полноконусном NAT», «симметричном NAT» и тому подобном.)

Ответить или комментировать

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