nixp.ru v3.0

18 октября 2017,
среда,
01:29:24 MSK

DevOps с компанией «Флант»
Аватар пользователя REDkiy
REDkiy написал 7 июня 2006 года в 14:18 (431 просмотр) Ведет себя как мужчина; открыл 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 "Готово"