"Двойной" NAT

FreeBSD, NetBSD, OpenBSD, DragonFly и т. д.

Модератор: arachnid

Аватара пользователя
Poor Fred
Сообщения: 1575
Статус: Pygoscelis papua
ОС: Gentoo Linux, FreeBSD

"Двойной" NAT

Сообщение Poor Fred »

Мучаюсь проблемой, реально ли осуществить "двойной" НАТ через одну и ту же сетевуху. Сложность в том, что через нее я соединяюсь с провайдером через РРРоЕ, но хочу еще ходить в локальную провайдерскую сеть на некоторые адреса через нее.
Реально ли иметь одновременно natd и ppp-nat? Что-то у меня не получается. Либо настроить natd чтобы он в зависимости от адреса, куда обращаются, отправлял пакеты либо на fxp0 либо на tun0? И как это делается? Или реально ли задать natd'у два интерфеса для работы.

Всю голову сломал. Локально на самом серваке более или менее получается, а натить от соседних компов - нет. Подскажите, плз, откуда танцевать.
Убить всех человеков!
Спасибо сказали:
Аватара пользователя
Shura
Сообщения: 1537
Статус: Оказывается и без KDE есть жизнь
ОС: FreeBSD 8.0-RC2

Re: "Двойной" NAT

Сообщение Shura »

может быть проблема с роутингом?
Rock'n'roll мертв © БГ
Спасибо сказали:
Аватара пользователя
Poor Fred
Сообщения: 1575
Статус: Pygoscelis papua
ОС: Gentoo Linux, FreeBSD

Re: "Двойной" NAT

Сообщение Poor Fred »

То есть? С роутингом у меня или у провайдера?

Хочешь сказать, что это простая задача, просто у меня что-то кривое? Так я и прошу подказать, что нужно поднять и что кому указать хотя бы в общих чертах, а то я из стороны в сторону шарахаюсь.
Убить всех человеков!
Спасибо сказали:
Igor B.
Сообщения: 324

Re: "Двойной" NAT

Сообщение Igor B. »

Poor Fred писал(а):
31.01.2006 10:46
То есть? С роутингом у меня или у провайдера?

Хочешь сказать, что это простая задача, просто у меня что-то кривое? Так я и прошу подказать, что нужно поднять и что кому указать хотя бы в общих чертах, а то я из стороны в сторону шарахаюсь.


С описанием проблемы у тебя задача. Ты не написал что есть "локальная сеть провайдера", что есть "некоторые адреса" в ней.

Если попытаться по-телепатить (глупо, не находишь? это ведь у тебя проблема...), то можно предположить типовое решение. Т.е. ты включен в локальную сеть провайдера (обычно это безлимитка за абонентку), а для выхода в и-нет устанавливаешь PPPoE соединение с его сервером (которое авторизуется и тарифицируется по трафику). При установлении соединения с VPN-сервером на него переписывается дефолтный маршрут (который ранее указывал на какой-то внутренний маршрутизатор провайдера) и ты теряешь связь с членами локалки, находящимися в других сегментах локальной сети. Так?

Если я не угадал (вполне вероятно, так как в этой схеме nat вообще не присутствует на твоей машине, он д.б. только на сервере провайдера), то ты не прав, не описав задачу по-людски. Если я угадал, то Shura тебе ответил совершенно точно - рисуй маршруты на те сегменты, которые у тебя "выпадают" при выходе в и-нет.
Спасибо сказали:
Аватара пользователя
Poor Fred
Сообщения: 1575
Статус: Pygoscelis papua
ОС: Gentoo Linux, FreeBSD

Re: "Двойной" NAT

Сообщение Poor Fred »

Виноват. Вероятно это мне так понятно, что не удосужился подробнее расписать. Попробую.

Есть комп под Фрей 6, соединяющийся с и-нетом через РРРоЕ. Пакеты в данном случае идут через tun0. Этот комп раздает и-нет МОЕЙ локалке. Тут все работает, проблем нет.
Но есть еще ПРОВАЙДЕРОВСКАЯ локалка (грубо говоря, все абоненты провайдера). То есть через эту же сетевуху, что соединяется с РРРоЕ-сервером, я могу обращаться к некоторому пулу адресов в этой локалке. В данном случае пакеты должны ходить через fxp0. Чтобы обращаться к адресам в ПРОВАЙДЕРСКОЙ локалке я должен завернуть некоторые запросы на дефолтный gateway, который я прописываю руками.
Хорошо, завернул. Когда сижу за этим компом с Фрей, то все отлично: обращаюсь к одному адресу - пакеты идут через tun0 и далее, т.е. через gateway, полученный от РРРоЕ-сервера, обращаюсь к адресам из ПРОВАЙДЕРСКОЙ локалки - идут через fxp0 и прописанный руками gateway.

А вот теперь хотелось бы чтобы такие же правила действовали и для членов МОЕЙ локалки, т.е. чтобы транзитные пакеты тоже отправлялись согласно этому правилу. Но вот тут какой-то затык. Вчера весь вечер просидел и выяснил, что транзитные пакеты таки уходят куда надо. tcpdump и логи файервола показывают, что пакеты от моего настольного компа, обращенные в ПРОВАЙДЕРОВСКУЮ локалку, через fxp0 проходят, не искажаются, файервол их не отбрасывает. Но обратно не возвращаюся! telnet и ftp-клиент пытаются открыть заданный адрес, но в конце концов отваливаются по таймауту. Хотя, повторюсь, на самом фряшном серваке локально все срабатывает отлично.

Вот в этом и вопрос. Как заставить сервак правильно разпихивать обращение из МОЕЙ локалки к разным адресам и возвращать обратно? Про два НАТа вопрос снимается.
Пробовал прикрутить mrouted, но вероятно это будет как из пушки по воробьям в мой ситуации. Кроме того, он вроде работает "зеркально" от того, что мне нужно.
Убить всех человеков!
Спасибо сказали:
Аватара пользователя
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU

Re: "Двойной" NAT

Сообщение sash-kan »

Poor Fred
в linux решается примитивно - правилом для iptables типа
-A POSTROUTING -o <интерфейс> -j MASQUERADE

думаю, в bsd должно быть еще проще.
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
Спасибо сказали:
Igor B.
Сообщения: 324

Re: "Двойной" NAT

Сообщение Igor B. »

1. Значит, ситуацию я угадал. Почти. В том смысле, что не угадал наличие "твоей" сети за твоим маршрутизатором.
2. Ты заодно объяснил, откуда взялся "первый" НАТ. Ты правишь адреса своей сети на адрес своего туннеля дабы "твоя" локалка выходила в И-нет.
3. Если я правильно понял, у тебя только один адрес локалки провайдера - повешенный на fxp0. А адресация твоей локальной сети в сеть провайдер "не лезет".
4. На твоем роутере все нормально, т.е. с маршрутизацией не нем все в порядке.
5. Если все вышеизложенное верно и ты опять ничего не упустил, то:
а) Ты сам себе правильно ответил насчет "двойного НАТ-а". Только неправильно термин употребил. Обычно под двойным НАТ-ом подразумевается двойное преобразование адреса.
б) А тебе нужно не двойное преобразование адреса, а двойной набор правил преобразования. Тебе нужно "дорисовать" правила, которые для пакетов, идущих на адреса локалки провайдера, будут менять исходящий адрес на адрес fxp0. Ну и сопутствующие обратные преобразования.

Извини, синтаксис сейчас не помню, давненько с FreeBSD не работал...
Спасибо сказали:
Аватара пользователя
Poor Fred
Сообщения: 1575
Статус: Pygoscelis papua
ОС: Gentoo Linux, FreeBSD

Re: "Двойной" NAT

Сообщение Poor Fred »

sash-kan писал(а):
01.02.2006 11:01
в linux решается примитивно - правилом для iptables типа
-A POSTROUTING -o <интерфейс> -j MASQUERADE

думаю, в bsd должно быть еще проще.


Я с iptables не знаком, поэтому даже не могу сообразить какая команда во Фре будет аналогичная. Если только

Код: Выделить всё

add divert natd all from any to XX.XX.XX.XX/24 via fxp0


Но это, боюсь, не прокатит. Т.к. НАТит сам РРР.

Igor B. писал(а):
01.02.2006 11:12
б) А тебе нужно не двойное преобразование адреса, а двойной набор правил преобразования. Тебе нужно "дорисовать" правила, которые для пакетов, идущих на адреса локалки провайдера, будут менять исходящий адрес на адрес fxp0. Ну и сопутствующие обратные преобразования.


в rc.conf прописано типа
route="-net xx.xx.xx.xx/24 10.10.100.1"
gateway="YES"
default_router="10.10.100.1"
Как-то так.

Ну и как показывает мониторинг, пакеты все-таки на эту сетевуху перенаправляются. Только обратно не возвращаются. А как настроить обратное преобразование?
Убить всех человеков!
Спасибо сказали:
Igor B.
Сообщения: 324

Re: "Двойной" NAT

Сообщение Igor B. »

М-да, начинается разговор слепого с глухим :)
У тебя в локалке какие адреса? Те, что ты обозначил иксами? Какие правила описывают преобразование адреса при выходе из _твоей_ локалки в и-нет? Тебе нужно накарябать аналогичное правило при выходе пакетов в локальную сеть провайдера. Обратно-то пакеты не возвращаются скорее всего потому, что адреса _твоей_ локалки в сети _провайдера_ неизвестны. Вот их и надо подменить на адрес твоей fxp0. Т.е. сделать аналогично тому, что происходит при обращении из твоей локалки в и-нет.
Спасибо сказали:
Аватара пользователя
Poor Fred
Сообщения: 1575
Статус: Pygoscelis papua
ОС: Gentoo Linux, FreeBSD

Re: "Двойной" NAT

Сообщение Poor Fred »

Уфф, победил я таки свою проблему.
Поставил вопрос по-другому и половина задачи решилась сама собой. Сначала меня смущало, что два интерфейса находятся физически на одном устройстве. Но абстрагировавшись от этого, понял, что мне нужно рассматривать два отдельных интерфейса - fxp0 и tun0, каждый из которых смотрит в свою публичную сеть. Вот от этого и плясал.
В двух словах, проблема теперь состояла в запуске двух natd. Это решилось копированием /etc/rc.d/natd в natd2, соответствующими правками его и /etc/rc.d/ipfw и прикручиванием второго natd на другой порт.

Если кому-то интересно, то могу изложить все в виде статьи, хотя я сам опирался на чужие статьи. Основние идеи взяты из этой и этой статей.

Правда, наткнулся на другие грабли. Теперь не могу локально на сервере себя же пропинговать - permission denied. В принципе, не такая уж проблема, главное, что компы в локалке его нормально видят и пингуют.
Убить всех человеков!
Спасибо сказали:
Аватара пользователя
Kotjara
Сообщения: 307
ОС: FreeBSD 7.0/Ubuntu 8.04

Re: "Двойной" NAT

Сообщение Kotjara »

(Poor Fred @ Feb 2 2006, в 12:38) писал(а):еперь не могу локально на сервере себя же пропинговать - permission denied

Скорее всего опять что то в правилах ipfw
Кстати
(Poor Fred @ Feb 1 2006, в 12:57) писал(а):add divert natd all from any to XX.XX.XX.XX/24 via fxp0


Верное решение
Так же (чтобы снова не проводить сеанс телепатической связи) неплохо было бы выложить правила IPFW по кот. у вас живёт сервер
Спасибо сказали:
Аватара пользователя
Poor Fred
Сообщения: 1575
Статус: Pygoscelis papua
ОС: Gentoo Linux, FreeBSD

Re: "Двойной" NAT

Сообщение Poor Fred »

Вот правила с небольшими сокращениями:

$fwcmd -f flush

$fwcmd add divert natd ip from not 192.168.1.1 to 10.10.100.0/24 via fxp0
$fwcmd add divert natd2 ip from not 192.168.1.1 to any via tun0
$fwcmd add fwd 10.10.100.1 ip from 10.10.100.3 to any via fxp0
$fwcmd add fwd pp.oe.gw.1 ip from my.add.re.ss to any via tun0
$fwcmd add divert natd ip from not 192.168.1.1 to 10.10.100.3 via fxp0
$fwcmd add divert natd2 ip from not 192.168.1.1 to my.add.re.ss via tun0

$fwcmd add deny ip from any to any via lo0
$fwcmd add allow ip from any to any via rl0 #<-- внутренний интерфейс

$fwcmd add allow ip from any to any out xmit tun0 setup
$fwcmd add allow ip from any to any out xmit fxp0 setup

$fwcmd add allow ip from any to any via tun0 established
$fwcmd add allow ip from any to any via fxp0 established

$fwcmd add reset log tcp from any to any 113 in recv tun0

$fwcmd add allow udp from any to dns.ser.ver.1 53 out xmit tun0
$fwcmd add allow udp from any to dns.ser.ver.2 53 out xmit tun0
$fwcmd add allow udp from dns.ser.ver.1 53 to any in recv tun0
$fwcmd add allow udp from dns.ser.ver.2 53 to any in recv tun0

$fwcmd add 65434 allow icmp from any to any
$fwcmd add 65435 deny ip from any to any
Убить всех человеков!
Спасибо сказали:
Аватара пользователя
Kotjara
Сообщения: 307
ОС: FreeBSD 7.0/Ubuntu 8.04

Re: "Двойной" NAT

Сообщение Kotjara »

Poor Fred
Хм, обычно помогает чтение доков да и пример rc.firewall очень помогает, ведь правил разрешающих обращаться к lo0(луп бэк) нет. После
$fwcmd -f flush
Поставьте
# Loopback setup
${fwcmd} add pass all from any to any via lo0
${fwcmd} add deny all from any to 127.0.0.0/8
${fwcmd} add deny ip from 127.0.0.0/8 to any

:D
Спасибо сказали:
Аватара пользователя
Poor Fred
Сообщения: 1575
Статус: Pygoscelis papua
ОС: Gentoo Linux, FreeBSD

Re: "Двойной" NAT

Сообщение Poor Fred »

Kotjara писал(а):
05.02.2006 18:45
Хм, обычно помогает чтение доков да и пример rc.firewall очень помогает, ведь правил разрешающих обращаться к lo0(луп бэк) нет.


Да, каюсь, облажалси я ;)

Теперь все работает, спасибо.
Убить всех человеков!
Спасибо сказали: