LINUX.ORG.RU

Маскарадинг для дотошных чайников

 , , ,


1

2

Всем привет, начал наконец-то изучать iptables. Прочитал несколько статей, вроде даже примерно понял(остались вопросы по пути пакета по цепочкам, т.к. везде по разному описано, думаю решить это тыканием палочкой в каждую цепочку и вдыхания в нос результата).

Статья - https://www.opennet.ru/base/net/debian_multilink.txt.html - в данной статье автор пишет следущее:

$IPT -t nat -A POTROUTING -m mark --mark 10 -j MASQUERADE # натим все пакеты которые имеют метку 10 
 $IPT -t nat -A POTROUTING -m mark --mark 11 -j MASQUERADE # натим все пакеты которые имеют метку 11

Вопрос - разве для маскарада не нужно указывать выходящий интерфейс? Так как у автора два провайдера через какой адрес в итоге выйдет абонент? И почему?



Последнее исправление: kovalev_94 (всего исправлений: 2)

Ответ на: комментарий от Anoxemian

Думаю для отделения одних юзеров от других. Вопрос именно с маскариднгом, в правиле написано натить и тех и других.

kovalev_94
() автор топика
Ответ на: комментарий от Anoxemian

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

kovalev_94
() автор топика

разве для маскарада не нужно указывать выходящий интерфейс

Не нужно. Точнее зависит от правила.

В iptables ты пишешь правило, в левой части условие, критерий отбора, а в правой части, после '-j' ты указываешь действие для этого правила. В данном случае '-j MASQUERADE'.

Пакеты по цепочкам двигаются по разному. Пакеты, адресованные самому шлюзу и от самого шлюза двигаются через одни цепочки, а транзитные пакеты - через другие.

Вот читай: https://www.opennet.ru/docs/RUS/iptables/

В этом разделе: https://www.opennet.ru/docs/RUS/iptables/#TRAVERSINGGENERAL есть схема движения пакетов.

anonymous
()
Ответ на: комментарий от kovalev_94

Он хочет сказать, что в случае '-m mark --mark 10 -j MASQUERADE' маскарадиться будут все пакеты, которые помечены маркировкой 10.

anonymous
()
Ответ на: комментарий от anonymous

Читал ее, правда не всю, путь пакета примерно понимаю(на опеннете в схемке не указана таблица raw, и в некоторых других схемах, из других источников написано что после цепочки output принимается еще одно routing desion). Вопрос в том с какого интерфейса будет взят адрес для inside global.

kovalev_94
() автор топика
Ответ на: комментарий от kovalev_94

Ну вот у меня у меня два белых ip 1.1.1.1 на eth0, 2.2.2.2 на eth1, я могу клиента занатить в 1.1.1.1 и в 2.2.2.2. Куда он занатиться если я не указываю интерфейс?

kovalev_94
() автор топика
Ответ на: комментарий от kovalev_94

Маскарадится по адресу исходящего интерфейса.

По этому правилу:

$IPT -t mangle -A PREROUTING -s $NET_SUB1 -d ! $NET_LOCAL -j MARK --set-mark 10 # все пакеты которые идут от $NET_SUB1 и не в $NET_LOCAL маркируем меткой 10
пакет помечается.

А по правилу вот этому:

-A POTROUTING -m mark --mark 10 -j MASQUERADE # натим все пакеты которые имеют метку 10 
по метке натится.

anonymous
()
Ответ на: комментарий от anonymous

Я конечно извиняюсь за мою непробиваемую тупость, но где у тебя указан интерфейс в который надо натить?

kovalev_94
() автор топика
Ответ на: комментарий от anonymous

Два интерфейса с белыми айпи, два интерфеса смотрящие в локалки, адреса с одной локалки, помечаем меткой 10, со второй 11. Пишем маршрутики. В какой занатяться абоненты с меткой 10, а в какой с меткой 11?

kovalev_94
() автор топика
Ответ на: комментарий от kovalev_94

Ты привел ссылку на статью и я разбираю в вписанное в ней.

В этих правилах исходящий интерфейс нигде не указан.

Если у тебя есть несколько исходящих адресов и ты хочешь указать адрес в который нужно натить, то тебе нужно использовать не '-j MASQUERADE', а использовать '-j SNAT' и уже в SNAT в соответствующем параметре указывать в какой исходящий адрес ты хочешь снатить пакет.

Почитай пожалуйста статью, ссылку на которую я привел.

anonymous
()
Ответ на: комментарий от kovalev_94

какой занатяться абоненты с меткой 10, а в какой с меткой 11?

Они занатятся в исходящий ip адрес. А этот ip адрес будет выбран согласно соответствующей таблицы маршрутизации.

Посмотри твою статью, там создаются дополнительные таблицы маршрутизации.

В цепочке PREROUT будет выбран маршрут движения пакета и интерфейс (адрес) с которого должен уйти пакет, а в конце в цепочке POSTROUTING будет выполнена трансляция исходящего сетевого адреса. В случае, если применяется правило MASQUERADE, то трансляция будет выполнена в исходящий адрес.

anonymous
()
Ответ на: комментарий от kovalev_94

Ты вообще читать статью по твоей ссылке пробовал?

Там все нормально расписано, шаг за шагом, что и почему делается.

anonymous
()

Вопрос - разве для маскарада не нужно указывать выходящий интерфейс?

Можно указать, а можно не указывать. Система просто сдедает то, что ты закомандуешь. Другой вопрос: как корректно сделать. И вот тут уже ДА, правильно указать интерфейс. Но опять же, если тебе достаточно идентифтцировать пакеты по меткам, то можно и без указания интерфейса.

rumgot ★★★★★
()
Последнее исправление: rumgot (всего исправлений: 1)
Ответ на: комментарий от anonymous

Вооооооооооооот. Теперь понял. В этом и был вопрос. На какой интерфейс натится если в правиле маскарад не указан интерфейс? Согласно таблице маршрутизации. Большое спасибо вам и всем принявшим в обсуждении.

kovalev_94
() автор топика
Ответ на: комментарий от anonymous

Да читал вроде)) Видимо просто не правильно формулировал вопрос. Ниже мне ответили. Тебе спасибо за участие. Кстати если два провайдера, выдают адрес по dhcp, snat бы не подошёл.

kovalev_94
() автор топика
Ответ на: комментарий от rumgot

Я понимаю что это конечно не аргумент, но хорошая причина для вопроса - в Cisco IOS я грубо говоря указываю «что натить куда натить» (куда натить либо интерфейс либо статический адрес ну или пул). Так вот как я понял snat это статический адрес, маскарад это интерфейс. Поэтому и встал в ступор когда увидел маскарад без указания интерфейс. Вопрос был именно про часть куда натить.

kovalev_94
() автор топика
Ответ на: комментарий от targitaj

Нет. Попробую прочитать. Но не все статьи на инглише мне даются. Спасибо.

kovalev_94
() автор топика

Когда ты пишешь iptables ... -o $IFACE -j MASQUERADE, то -o $IFACE - это фильтр, а не указание того, через какой интерфейс пакет должен выйти. Ядро уже знает, какой интерфейс будет использован, единственное, что ты можешь менять - цель (-j $TARGET).

Выдержка из man iptables:

iptables [-t table] {-A|-C|-D} chain rule-specification
...
rule-specification = [matches...] [target]
match = -m matchname [per-match-options]
target = -j targetname [per-target-options]

tiandrey ★★★★★
()
Последнее исправление: tiandrey (всего исправлений: 2)
Ответ на: комментарий от kovalev_94

в Cisco IOS я грубо говоря указываю «что натить куда натить»

«Натить» ничего не знает ни про «что», ни про «куда». NAT - это технология подмены адреса в пакете и только. «Куда» определяется таблицей маршрутизации, которая не имеет никакого отношения к NAT. У тебя в системе есть LO и, возможно, еще какие-то интерфейсы. Допустим, у тебя есть eth0, который смотрит в локалку, и eth1, который смотрит в Интернет. Если пакет пришел из eth и целью является локальный процесс, то это INPUT. Если пакет от локального процесса хочет выйти в eth, то это OUTPUT. Если пакет хочет из eth попасть в eth (мимо LO), то это комбинация из PREROUTIMG - FORWARD - POSTROUTING. Технология NAT позволяет подменить ip адрес в пакете. Адрес источника и/или получателя. Эта подмена сочетается с таблицей маршрутизации. Маскарадинг отличается от DNAT/SNAT только отсутствием знания какой ip ты будешь подставлять, маскарад сам будет определять. Если ты знаешь какой ip будешь подставлять, то маскарадинг использовать НЕ следует, для этого есть SNAT/DNAT. Кроме того, с помощью iptables можно ставить метки на пакетах, которые тоже можно использовать для маршрутизации. Просто пойми, что это два разных механизма (iptables и routing), которые могут работать совместно. Там еще есть механизм traffic control из пакета iproute2, который может задавать пропускные способности для соединений.

targitaj ★★★★★
()
Ответ на: комментарий от targitaj

Хммм. Я вроде как понял, но сбила с толку фраза - «не знает про что ни про куда». Это ты надеюсь говоришь в контексте ядра Linux? Иначе я совсем запутался))) И разве в правиле ты не задаешь «что»?

kovalev_94
() автор топика
Ответ на: комментарий от kovalev_94

Забудь про маскарад в циске - там всё несколько по другому. Начать хотя бы с того, что если ты не укажешь входной и выходной интерфейсы - NAT там не взлетит(момент с interface templates опустим пока)

В Cisco NAT - это отдельный набор операций, который может быть объединен с файрволом посредством общих route-map например.

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

Некоторые ограничения при этом правда раздражают - то же отсутствие возможности указать входящий интерфейс в POSTROUTING. Это к слову тот случай, когда можно выкрутиться метками.

Pinkbyte ★★★★★
()
Последнее исправление: Pinkbyte (всего исправлений: 1)
Ответ на: комментарий от Pinkbyte

Прошу меня простить за N-ую тучу вопросов, но все же: 1. Я думал файрвол в циске и прочих это acl, а route map как понял это Policy Based Routing. 2. Как метки помогают выкрутиться? Это же лишь маркировка для дальнейшего роутинга? Или это и имеется ввиду(как в моем примере).

P.S. Знаю что умность вопросов зашкаливает, но вдруг вы еще какой нибудь интересный способ расскажете)))

kovalev_94
() автор топика
Ответ на: комментарий от kovalev_94

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

Я думал файрвол в циске и прочих это acl

На ACL-ях строится только stateless файрвол. Если нужны гибкие правила - лучше смотреть в стороны Zone-based firewall. На тех цисках с которыми я работаю - он единственный вариант организации stateful-файрвола.

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

Именно поэтому лучше уж писюк с Linux, чем дрыще-аппаратный роутер. Ну а Cisco как всегда недостаток - это ценник :-)

route map как понял это Policy Based Routing

Не только. Но можно использовать и как PBR в том числе

Как метки помогают выкрутиться? Это же лишь маркировка для дальнейшего роутинга? Или это и имеется ввиду(как в моем примере).

Например так:

Задача - необходимо всё пришедшее в интерфейс eth0 натить с одним source-адресом, а пришедшее с eth2 - с другим. Указать -i в POSTROUTING нельзя. Вариант решения проблемы: маркируем пакеты с eth0 меткой допустим 10, а с eth2 - 20 в PREROUTING. В правилах -j SNAT указываем соответствующий -m mark.

Pinkbyte ★★★★★
()
Последнее исправление: Pinkbyte (всего исправлений: 3)
Ответ на: комментарий от targitaj

Ну пока так... есть некоторое понимание задней стенкой мозга, но не всего и не четко. Но на заданный вопрос впринципе ответ получил

kovalev_94
() автор топика
Ответ на: комментарий от kovalev_94

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

targitaj ★★★★★
()
Ответ на: комментарий от targitaj

Спасибо. Учту. Про визуализацию уже даже и сам пару раз замечал, пока на листике не напишешь получается хрень.

kovalev_94
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.