nixp.ru v3.0

23 января 2017,
понедельник,
21:59:07 MSK

DevOps с компанией «Флант»
Аватар пользователя REDkiy
REDkiy написал 7 июня 2006 года в 14:18 (383 просмотра) Ведет себя как мужчина; открыл 89 тем в форуме, оставил 593 комментария на сайте.

Меня слегка переглючило и я немогу правильно построить правила:

Задача:

Сеть 1 — 192.168.1.0/24

Сеть 2 — 192.168.2.0/24

Между ними комп с 2 сетевухами:

eth0 — 192.168.1.1/24

eth1 — 192.168.2.1/24

Нужно связать эти сетки через iptables.

1 пример — нужно пакеты из 1 сети отправлять во 2 (ну вроде моста,быть может)

2 пример — первая сеть это типа интернет,а вторую нужно выпускать в него по NAT.

Примеры треба простые,но понятные.И ещё вообщем я прочёл пару туториалов, и основные понятия и порядок движения по цепочка и какая таблица где,примерно представляю.

Сама логика построения правил от меня ускользает.

Спасибо.

Dr. Evil

чтобы первый пример работал, надо:

1) включить ip_forward. не могу сказать, где в твоем дистрибутиве настраивается, ибо ты не дал информацию о нем. если выполнить это

$ echo 1 > /proc/sys/net/ipv4/ip_forward


, то перезагрузки будет работать (для второго примера это тоже необходимо :));

2) выставить политики в цепочке FORWARD на твоем шлюзе в ACCEPT;

3) настроить маршрутизацию на узлах, которые находятся за разными интерфейсами твоего шлюза, чтобы пакеты знали куда им идти из 192.168.1.0/24 в 192.168.2.0/24 и наоборот;

для начала этого достаточно, если я под вечер нормально сооброжаю :)

про второе:

я тут что-то не понял…

тебе надо, чтобы пакеты из 192.168.1.0/24 натились на ip-адрес eth1 твоего шлюза?

fly4life
Dr. Evil
про второе:

я тут что-то не понял…

тебе надо, чтобы пакеты из 192.168.1.0/24 натились на ip-адрес eth1 твоего шлюза?

Насколько я понял, автор хочет что-то типа этого:

iptables -t nat -A POSTROUTING -s 192.168.2.0/24 -o eth0 -j SNAT --to-source 192.168.1.1
REDkiy
iptables -t nat -A POSTROUTING -s 192.168.2.0/24 -o eth0 -j SNAT —to-source 192.168.1.1

Я понимаю это правило так:

Пакеты,адрес источника которых находится в диапазоне 192.168.2.0/24,отправляются на интерфейс eth0 и им в качестве источника прописывается адрес 192.168.1.1,адрес назначения не меняется.

Я правильно понял это правило?

потом(или сначала) делаю так:

# modprobe ip_tables
# modprobe ip_conntrack
# modprobe iptable_nat
# echo 1 > /proc/sys/net/ipv4/ip_forward
REDkiy
чтобы первый пример работал, надо:

1) включить ip_forward. не могу сказать, где в твоем дистрибутиве настраивается, ибо ты не дал информацию о нем. если выполнить это

Код:

$ echo 1 > /proc/sys/net/ipv4/ip_forward

, то перезагрузки будет работать (для второго примера это тоже необходимо :));

2) выставить политики в цепочке FORWARD на твоем шлюзе в ACCEPT;

3) настроить маршрутизацию на узлах, которые находятся за разными интерфейсами твоего шлюза, чтобы пакеты знали куда им идти из 192.168.1.0/24 в 192.168.2.0/24 и наоборот;

для начала этого достаточно, если я под вечер нормально сооброжаю :)

То есть никаких правил прописывать ненужно просто включить форвардинт?

А без настройки маршрутизации обойтись можно?

Genie
То есть никаких правил прописывать ненужно просто включить форвардинт?

нет. ещё или SNAT, или MAQUERADE правило необходимо.

ну и для conntrack (_ftp) и прочих.

А без настройки маршрутизации обойтись можно?

ну если только тебя устроит функциональность squid и прочих прокси.

REDkiy
Цитата:

То есть никаких правил прописывать ненужно просто включить форвардинт?

нет. ещё или SNAT, или MAQUERADE правило необходимо.

ну и для conntrack (_ftp) и прочих.

Цитата:

А без настройки маршрутизации обойтись можно?

ну если только тебя устроит функциональность squid и прочих прокси.

Это вроде понял.

Касательно предыдущего моего сообщения интересно услышать мнение.

fly4life
REDkiy
Я понимаю это правило так:

Пакеты,адрес источника которых находится в диапазоне 192.168.2.0/24,отправляются на интерфейс eth0 и им в качестве источника прописывается адрес 192.168.1.1,адрес назначения не меняется.

Я правильно понял это правило?

Не «на интерфейс eth0», а «с интерфейса eth0». А так, суть правильно понял.

REDkiy
потом(или сначала) делаю так:

# modprobe ip_tables
# modprobe ip_conntrack
# modprobe iptable_nat
# echo 1 > /proc/sys/net/ipv4/ip_forward

После ввода команды «iptables -t nat -A …» перечисленные тобой модули должны загрузиться сами.

А форвардинг пакетов между интерфейсами без разницы, когда включать. Хотя лучше всего, вместе со стартом системы, прописав эту единичку в соответствующем параметре файла sysctl.conf.

fly4life
Genie
нет. ещё или SNAT, или MAQUERADE правило необходимо.

Для «примера №1», вобщем-то, и не надо.

Genie
ну если только тебя устроит функциональность squid и прочих прокси.

Опять же, для «примера №1» без настройки маршрутизации на клиентских машинах не обойтись. Правда, «маршрутизация» — это слишком страшно сказано =). Там каждому клиенту достаточно будет выставить в качестве шлюза по умолчанию адрес смотрящего в его сеть интерфейса.

REDkiy

Для первого примера.

Вот к чему я пришёл:

если так:

iptables --policy INPUT ACCEPT
iptables --policy OUTPUT ACCEPT
iptables --policy FORWARD ACCEPT

Достаточно сделать так:

# echo 1 > /proc/sys/net/ipv4/ip_forward

И на клиентах указать адрес шлюза.

Если же так (что вообщем то мне кажется более правильным,и насколько я понимаю не только мне):

iptables --policy INPUT DROP
iptables --policy OUTPUT DROP
iptables --policy FORWARD DROP

То нужно уже делать так:

# echo 1 > /proc/sys/net/ipv4/ip_forward
# iptables -t filter --append FORWARD --protocol 0 --source 192.168.1.0/24 -j ACCEPT
# iptables -t filter --append FORWARD --protocol 0 --source 192.168.2.0/24 -j ACCEPT

Эффект интересен, комп на котором это настроено не отвечает на запросы,но при этом исправно связывает две сетки.

Со вторым пока разбираюсь.

fly4life
REDkiy
Для первого примера.

Вот к чему я пришёл:

если так:

iptables --policy INPUT ACCEPT
iptables --policy OUTPUT ACCEPT
iptables --policy FORWARD ACCEPT

Достаточно сделать так:

# echo 1 > /proc/sys/net/ipv4/ip_forward

И на клиентах указать адрес шлюза.

Угу, примерно про это и рассказывал Эвил в своём первом ответе ;).

REDkiy
Если же так (что вообщем то мне кажется более правильным,и насколько я понимаю не только мне):

iptables --policy INPUT DROP
iptables --policy OUTPUT DROP
iptables --policy FORWARD DROP

То нужно уже делать так:

# echo 1 > /proc/sys/net/ipv4/ip_forward
# iptables -t filter --append FORWARD --protocol 0 --source 192.168.1.0/24 -j ACCEPT
# iptables -t filter --append FORWARD --protocol 0 --source 192.168.2.0/24 -j ACCEPT

Эффект интересен, комп на котором это настроено не отвечает на запросы,но при этом исправно связывает две сетки.

В цепочке FORWARD настраиваются правила фильтрации для пакетов, предназначенных НЕ для локальной машины, а ммм… проходящих через неё. (т.е. транзитный трафик). Его ты разрешил своими правилами.

Фильтры для пакетов, предназначенных для твоего (и, соответсвенно, от твоего) компа, настраиваются в цепочках INPUT и OUTPUT. Правил для них ты не настраивал, а политики этих цепочек выставил в DROP. Вот и не отвечает твой рутер на «запросы».

REDkiy
В цепочке FORWARD настраиваются правила фильтрации для пакетов, предназначенных НЕ для локальной машины, а ммм… проходящих через неё. (т.е. транзитный трафик). Его ты разрешил своими правилами.

Фильтры для пакетов, предназначенных для твоего (и, соответсвенно, от твоего) компа, настраиваются в цепочках INPUT и OUTPUT. Правил для них ты не настраивал, а политики этих цепочек выставил в DROP. Вот и не отвечает твой рутер на «запросы».

Это всё понятно и так.

Просто это сравни колдовству,настолько чётко всё держишь в руках,аж дух захватывает! 8-)

В виндах у меня такое получается довольно редко. 8-(

Dr. Evil

никакого шаманства тут нет. это — просто настройка ;)

а то, что тебя так радует — одно из многих преимуществ UNIX над windows ;)

REDkiy

Я осваиваю iptables по:

«Iptables Tutorial 1.1.19» — Oskar Andreasson,в переводе Андрея Киселёва,

частично «Сетевые средства Linux» — Родерик В. Смит.

Помощь на данном форуме значительно помогает,

ну и так гугль.ру. 8-)

Вопрос такой возник:

При настройке натирования нужно указывать адрес компутера-роутера?

Dr. Evil

да, именно так. ты должен указать ip-адрес интерфейса, который, например, смотрит у тебя в Интернет. Конечно, в твоей схеме это может быть и не Интрнет, а локальная сеть, на выходе из которой ты поставишь свой роутер. Ты лучше схему дай с ip-адресами, тогда понятнее и тебе, и всем остальным будет… ;)

Genie
При настройке натирования нужно указывать адрес компутера-роутера?

какой из адресов тебя интересует?

у шлюза их минимум два. (за исключением lo)

REDkiy

Да чиво-та я перемудрил.

Схема с ip такая как я писал в начале.Есть у меня мини-полигон такой(но это не надолго,занимать целых две! машины бесконечно невозможно).

Насчёт натирования запутанно черезмерно у меня получилось,уж извиняйте пожалуйста.

Попробуем так:

Есть комп,на нём Debian GNU/Linux «Sarge».

eth0 — 192.168.1.1/24 — смотрит в локальную сеть

eth1 — 192.168.2.1/24 — смотрит на ADSL-модем.

Правило для iptables я представляю так:

iptables -t nat --append POSTROUTING --source 192.168.1.0/24 --out-interface eth0 -j SNAT --to-source 192.168.2.1

Не пробовал ещё,так что с уверенностью сказать работает или нет немогу,проверю позже.

Нужна ли при этом какая-либо настройка клиентов?

fly4life
REDkiy
Да чиво-та я перемудрил.

Схема с ip такая как я писал в начале.Есть у меня мини-полигон такой(но это не надолго,занимать целых две! машины бесконечно невозможно).

Насчёт натирования запутанно черезмерно у меня получилось,уж извиняйте пожалуйста.

Попробуем так:

Есть комп,на нём Debian GNU/Linux «Sarge».

eth0 — 192.168.1.1/24 — смотрит в локальную сеть

eth1 — 192.168.2.1/24 — смотрит на ADSL-модем.

Правило для iptables я представляю так:

iptables -t nat --append POSTROUTING --source 192.168.1.0/24 --out-interface eth0 -j SNAT --to-source 192.168.2.1

Не пробовал ещё,так что с уверенностью сказать работает или нет немогу,проверю позже.

Если тебе надо, чтобы первая сетка (1.х) выходила под одним адресом 192.168.2.1 (натилась) во вторую сеть (2.х), то всё так, за исключением '—out-interface'. «Исходящий» (out) интерфейс должен смотреть в ту сеть, в которую натится локалка, т.е. в твоём случае out-interface — eth1.

REDkiy
Нужна ли при этом какая-либо настройка клиентов?

Нужна настройка соответствующих маршрутов (или просто каждому клиенту в качестве шлюза по умолчанию задать смотрящий в его сеть адрес рутера, чего ты уже, судя по всему, и сделал).

Genie
Правило для iptables я представляю так:

в общем — правильно.

для простоты можно и MASQUERADE использовать.

но на статическом адресе — как у тебя — можно и SNAT (даже лучше) использовать.

Нужна ли при этом какая-либо настройка клиентов?

прописать им «Шлюз по умолчанию» внутренний адрес твоего шлюза. и всё.

кстати, почитать про активный/пассивный ftp — тоже не лишнее. у него дополнительная настройка есть. (да и не только это касается ftp, ну да ладно)

REDkiy
Если тебе надо, чтобы первая сетка (1.х) выходила под одним адресом 192.168.2.1 (натилась) во вторую сеть (2.х), то всё так, за исключением '—out-interface’. «Исходящий» (out) интерфейс должен смотреть в ту сеть, в которую натится локалка, т.е. в твоём случае out-interface — eth1.

Ошибся,имел в виду eth1.

eth1 — 192.168.2.1/24 — смотрит на ADSL-модем.

То есть отправили с eth1 на модем,а дальше модем сам разберётся куда-кому?

кстати, почитать про активный/пассивный ftp — тоже не лишнее. у него дополнительная настройка есть. (да и не только это касается ftp, ну да ладно)

Ох! Ну не всё сразу! Про IRC я помню тоже.

fly4life
REDkiy
То есть отправили с eth1 на модем,а дальше модем сам разберётся куда-кому?

По идее, должен.

REDkiy
По идее, должен.

Это я так для очистки совести.8-)

Завтра напишу примерный скрипт и отдам на растерзание.

Блин,еще скрипты учиться писать 8-).

REDkiy

Вот скрипт,сильно не ругайте,конструктивные предложения принимаются:

#!/bin/bash
#Первая локальная сеть
LAN_IP_RANGE_1="192.168.1.0/24"
LAN_IFACE_1="eth0"
IP_IFACE_1="192.168.1.1"
#Вторая локальная сеть
LAN_IP_RANGE_2="192.168.2.0/24"
LAN_IFACE_2="eth1"
IP_IFACE_2="192.168.2.1"
#localhost ip and interface
LO_IP="127.0.0.1"
LO_IFACE="lo"
#Путь к iptables
IPTABLES="/sbin/iptables"
#Политики по умолчанию
echo "Применение политик по умолчанию"
$IPTABLES --policy INPUT DROP
$IPTABLES --policy OUTPUT DROP
$IPTABLES --policy FORWARD DROP
#Если не включено в sysctl.conf
echo "1" > /proc/sys/net/ipv4/ip_forward
#Сброс правил во всех таблицах, чтобы быть уверенным в том что никакие предустановленные правила испортят нам жизнь
echo "Flush table nat:"
$IPTABLES -t nat --flush --verbose
echo "Flush table mangle:"
$IPTABLES -t mangle --flush --verbose
echo "Flush table filter:"
$IPTABLES -t filter --flush --verbose
#Секция с правилами
echo "Применение правил"
#Пример 1
#Разрешение форвардинга для диапазонов LAN_IP_RANGE_1 и LAN_IP_RANGE_2
$IPTABLES --append FORWARD --verbose --protocol 0 --source $LAN_IP_RANGE_1 -j ACCEPT
$IPTABLES --append FORWARD --verbose --protocol 0 --source $LAN_IP_RANGE_2 -j ACCEPT
#Пример 2
#Преобразование адресов для LAN_IP_RANGE_1
$IPTABLES -t nat --append POSTROUTING --verbose --protocol 0 --source $LAN_IP_RANGE_1 --out-interface $LAN_IFACE_2 -j SNAT --to-source $IP_IFACE_2
echo "Готово"
ecobeingecobeing.ru
Экология и вегетарианство на благо всем живым существам Планеты.