LINUX.ORG.RU
решено ФорумAdmin

iptables masquerade 2 gw

 , ,


0

1

Здравствуйте!
Подскажите как правильно реализовать проброс или накидайте куда подумать.
Есть 2 сети:
lan1 - 10.20.20.0/24 gw 10.20.20.1
lan2 - 10.0.0.0/22 gw 10.0.0.1
Собрал между ними машину на debian с 2-мя сетевыми картами:
eth0 - 10.20.20.71/24 gw 10.20.20.1
eth1 - 10.0.0.71/22 gw 10.0.0.1
/etc/network/interfaces:

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
auto eth0
iface eth0 inet static

address 10.20.20.71
netmask 255.255.255.0
gateway 10.20.20.1
post-up ip rule add from 10.20.20.1 table table1
post-up ip route add 10.20.20.0/24 dev eth0 src 10.20.20.71 table table1
post-up ip route add default via 10.20.20.1 dev eth0 table table1

auto eth1
iface eth1 inet static
address 10.0.0.71
netmask 255.255.252.0
gateway 10.0.0.1
post-up ip rule add from 10.0.0.71 table table2
post-up ip route add 10.0.0.0/22 dev eth1 src 10.0.0.71 table table2
post-up ip route add default via 10.0.0.1 dev eth1 table table2
Нужно:
Чтоб машины между сетями общались через посредника, например так:
10.20.20.101->10.20.20.71:2222->masquerade->10.0.0.71->10.0.0.100:3389
Пробовал:
вариант1:
iptables -A FORWARD -i eth0 -o eth1 -j ACCEPT
iptables -t nat -A PREROUTING -p tcp -d 10.20.20.71 --dport 2222 -j DNAT --to-destination 10.0.0.100:3389
iptables -t nat -A POSTROUTING -p tcp -s 10.0.0.100 --sport 3389 -j SNAT --to-source 10.20.20.71:2222
При такой настройке на конечной машине wireshark показывает пакеты из сети 10.20.20.101->10.0.0.100 (ненужно)
вариант2:
iptables -t nat -A PREROUTING -p tcp -d 10.20.20.71 --dport 2222 -j DNAT --to-destination 10.0.0.100:3389
iptables -t nat -A POSTROUTING -o eth1-j MASQUERADE
Лучше, на конечной машине wireshark показывает пакеты из сети 10.0.0.71->10.0.0.100 , но ответ не уходит и соответственно соединение не устанавливается.
Вопросы:
- Может ли такое linux с iptables или нужна freebsd с ipfw?

Ответ на: комментарий от ne-vlezay

Маршрутизация дает обращение из разных сетей напрямую, то есть 10.20.20.101 может обратится к 10.0.0.100, а от этого как раз и хочу уйти.
Нат ведь как раз и выступает посредником заменяя ip «неродной сети» в «локальную», нет?
Задача в том, что клиент с ip адресом 10.20.20.101 не мог обратится напрямую к серверу 10.0.0.100, а стучался к посреднику 10.20.20.71 и (допустим) порт 2222, а посредник 10.20.20.71:2222 перекидывал на другой интерфейс 10.0.0.71 и от него стучался к 10.0.0.100 на (допустим) порт 3389 и обратно по этой же цепочке.

kozanostra ()

Что значит «ответ не уходит»? Если на конечную машину запрос приходит, то ответ с неё уходить должен. Другое дело, что он может дропнут в FORWARD, вы не показали, что у вас там касательно "-i eth1 -o eth0".

mky ★★★★★ ()
Ответ на: комментарий от ne-vlezay

при:
net.ipv4.conf.all.rp_filter=1
не работает

при:
net.ipv4.conf.all.rp_filter=0
работает
«работает» имеется ввиду в tcpdump проход пакетов между интерфесами

дальше, вот с такими настройками

iptables -t nat -A PREROUTING -p tcp -d 10.20.20.71 --dport 2222 -j DNAT --to-destination 10.0.0.100:3389
iptables -t nat -A POSTROUTING -j MASQUERADE
iptables -A FORWARD -j ACCEPT
идет такая цепочка прохода пакетов:
(комп1 10.20.20.101)-->(eth0 10.20.20.71 --> eth1 10.0.0.71)-->(комп2 10.0.0.100) пакет пришел
при обратном ответе:
(комп1 10.20.20.101) (eth0 10.20.20.71 X eth1 10.0.0.71)<--(комп2 10.0.0.100)
Цепь обрывается между интерфесами в обратном направлении
Важное замечание, если вначале пропустили. Комп между сетями НЕ является шлюзом не для одной сети!

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

Тогда правила iptables в студию. У меня такое правило почему-то работало.

Также желательно увидеть трафик с хоста, на который идёт проброс.

У меня на тестовом стенде было так:

# Host 1 (int_ip: 192.168.180.28; ext ip: 198.18.50.236)

iptables -t nat -A PREROUTING -d 198.18.50.236 -p tcp --dport 2222 -j DNAT --to-destination 192.168.180.27:22
iptables -t nat -A POSTROUTING -d 192.168.180.27 -p tcp --dport 22 -j MASQUERADE

# Host 2 (int_ip: 192.168.180.27; ext ip: none)

У меня схема почему-то работала.

Или же попробовать добавить:

iptables -A FORWARD -o eth0 -i eth1 -j ACCEPT
ne-vlezay ★★★★★ ()
Последнее исправление: ne-vlezay (всего исправлений: 3 )
Ответ на: комментарий от ne-vlezay

Сначала скриптом скидываю все правила:

#!/bin/sh
echo "Stopping firewall and allowing everyone..."
iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
iptables -t mangle -F
iptables -t mangle -X
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT
Запускаю на обоих компах которые надо связать wireshark, запускаю tcpdump на обоих интерфейсах соединяющего сети компе и перебором пробую разные правила.
Самая вроде как «правильная» и логически понятная цепочка это:
iptables -t nat -A PREROUTING -p tcp -d 10.20.20.71 --dport 3389 -j DNAT --to-destination 10.0.0.100:3389
iptables -t nat -A POSTROUTING -p tcp -d 10.0.0.100 --dport 3389 -j SNAT --to-source 10.0.0.71
iptables -A FORWARD -i eth0 -o eth1 -j ACCEPT
iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT
И не работает.
Все железо собрано на работе и изолировано от рабочей сети, поэтому результат tcpdump выложу только завтра. (На ДВ уже вечер).
p.s. Судя по отписавшимся коментариям и поиску в интернете, вариант должен работать, уже грешу на фаревол виндовс.

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

Что общее? Почему все так любять писать ″iptables -A″ и не показывают, что там ещё в FORWARD? Либо уж пишите ″iptables -I″, либо показывайте полный список правил.

при: net.ipv4.conf.all.rp_filter=1 не работает

Вы из таблицы main удалил маршруты, что-ли? Что сейчас в выводе комады ″ip route″?

mky ★★★★★ ()
Ответ на: комментарий от ne-vlezay

Какой у вас ядро?

Linux 3.2.0-4-686-pae #1 SMP Debian 3.2.57-3 i686 GNU/Linux

Убрал из /etc/network/interfaces строки:

post-up ip rule add from 10.20.20.1 table table1
post-up ip route add 10.20.20.0/24 dev eth0 src 10.20.20.71 table table1
post-up ip route add default via 10.20.20.1 dev eth0 table table1
и
post-up ip rule add from 10.0.0.71 table table2
post-up ip route add 10.0.0.0/22 dev eth1 src 10.0.0.71 table table2
post-up ip route add default via 10.0.0.1 dev eth1 table table2
все заработало с твоими двумя строчками:
iptables -t nat -A PREROUTING -p tcp -d 10.20.20.71 --dport 3389 -j DNAT --to-destination 10.0.0.100:3389
iptables -t nat -A POSTROUTING -p tcp -d 10.0.0.100 --dport 3389 -j SNAT --to-source 10.0.0.71

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

Что общее?

Общее я подразумевал

iptables -A FORWARD -j ACCEPT
ведь если не указывать интерфейсы, то эта строка укажет «разрешить проброс всему и везде», возможно ошибаюсь.

Почему все так любять писать ″iptables -A″

Потому, что эта строка указывается во многих примерах из сети и если пользователь не силен в iptables «универсальнее» скопипастить из примера, чем лезть в дебри iptables -[P,R,I,N,E]
На возможный будущий комент «нафиг лезть, если не силен», отвечу цитатой «Не стыдно не знать, стыдно не учиться»

и не показывают, что там ещё в FORWARD

Что показывать? Написал, что скриптом скидываю всё:

#!/bin/sh
#сбрасываем  правила
iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
iptables -t mangle -F
iptables -t mangle -X
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT
Если после этого в правилах, что-то остается, то подскажи что добавить для полного сброса iptables.

Вы из таблицы main удалил маршруты, что-ли?

С таблицей main ничего не делал, но возможно косвенно или прямо это произошло при добавлении строк в /etc/network/interfaces

post-up ip rule add from 10.20.20.1 table table1
post-up ip route add 10.20.20.0/24 dev eth0 src 10.20.20.71 table table1
post-up ip route add default via 10.20.20.1 dev eth0 table table1

и

post-up ip rule add from 10.0.0.71 table table2
post-up ip route add 10.0.0.0/22 dev eth1 src 10.0.0.71 table table2
post-up ip route add default via 10.0.0.1 dev eth1 table table2
Данные строки были написаны по инструкции https://timeweb.com/ru/community/articles/nastroyka-neskolkih-tablic-marshrut... , т.к. у каждой сети свой шлюз есть.

Что сейчас в выводе комады ″ip route″?

default via 10.0.0.1 dev eth1 
10.0.0.0/22 dev eth1  proto kernel  scope link  src 10.0.0.71 
10.20.20.0/24 dev eth0  proto kernel  scope link  src 10.20.20.71 

Задача на самом деле простая похожа как здесь Шлюз между двумя сетями.
Две сети со своими шлюзами, днсами, dhcp и т.д.
Нужно между ними сделать шлюз, чтоб клиент 10.20.20.101 обращался не напрямую 10.0.0.100 (можно vlan-ами, маршрутезацией и т.д. реализовать), а через посредника, чтоб физически доступа в сети между собой не было, кроме как через компьютер объединяющий их.

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

(можно vlan-ами, маршрутезацией и т.д. реализовать) но не нужно

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

то эта строка укажет «разрешить проброс всему и везде»,

Да, эта строка разрешает всё. Но перед ней могут быть другие строки-правила. И там может быть DROP. Такое на этом форуме уже бывало, когда кто-нибудь в iptables насобирает правила с разных сайтов, потом показывает одно правило с ″-A″ (добавить в конец), а пакеты дропаются другими правилами. В непонятных ситуациях лучше выкладывать вывод ″iptables-save -c″, забив звёздочками в правилах белые ip-адреса (если есть). У iptables-save вывод большой, но там сразу все таблицы «как есть», это проще читать, чем скрипт или отдельные правила. А счётчики помогают понять, срабатывало правило или нет.

Написал, что скриптом скидываю всё

Тут как-бы древовидный форум. Всё до конца не читай, отвечай на то что тебе писали :) Скрипт на момент написания предыдущего комента я не заметил.

Про два шлюза было понятно, единственно, что указывать два gateway в файле /etc/network/interfaces смысла нет. gateway это добавление default маршрута в таблицу маршрутизации main. Он там может быть только один. ЕМНИМ, не гарантируется какой из этих двух шлюзов «победит» после поднятия сети.

При таком выводе ″ip route″ не должен был срабатывать rp_filer. Странно. И странно, что с отключенным rp_filter было:

Цепь обрывается между интерфесами в обратном направлении

Если DROP в iptables не было, пакет мог «запутать» в маршрутах и уйти через другой интерфейс, но не исчезнуть. В целом, ваш «шлюз» отличается от обычного только NAT'ом, пакеты всё одно идут по маршрутам. И сейчас, если на 10.20.20.101 и 10.0.0.100 прописать маршруты друг к другу через ваш шлюз, то они смогут «общаться» по всем портам.

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