"Двойной" NAT
Модератор: arachnid
-
- Сообщения: 1575
- Статус: Pygoscelis papua
- ОС: Gentoo Linux, FreeBSD
"Двойной" NAT
Мучаюсь проблемой, реально ли осуществить "двойной" НАТ через одну и ту же сетевуху. Сложность в том, что через нее я соединяюсь с провайдером через РРРоЕ, но хочу еще ходить в локальную провайдерскую сеть на некоторые адреса через нее.
Реально ли иметь одновременно natd и ppp-nat? Что-то у меня не получается. Либо настроить natd чтобы он в зависимости от адреса, куда обращаются, отправлял пакеты либо на fxp0 либо на tun0? И как это делается? Или реально ли задать natd'у два интерфеса для работы.
Всю голову сломал. Локально на самом серваке более или менее получается, а натить от соседних компов - нет. Подскажите, плз, откуда танцевать.
Реально ли иметь одновременно natd и ppp-nat? Что-то у меня не получается. Либо настроить natd чтобы он в зависимости от адреса, куда обращаются, отправлял пакеты либо на fxp0 либо на tun0? И как это делается? Или реально ли задать natd'у два интерфеса для работы.
Всю голову сломал. Локально на самом серваке более или менее получается, а натить от соседних компов - нет. Подскажите, плз, откуда танцевать.
Убить всех человеков!
-
- Сообщения: 1537
- Статус: Оказывается и без KDE есть жизнь
- ОС: FreeBSD 8.0-RC2
-
- Сообщения: 1575
- Статус: Pygoscelis papua
- ОС: Gentoo Linux, FreeBSD
Re: "Двойной" NAT
То есть? С роутингом у меня или у провайдера?
Хочешь сказать, что это простая задача, просто у меня что-то кривое? Так я и прошу подказать, что нужно поднять и что кому указать хотя бы в общих чертах, а то я из стороны в сторону шарахаюсь.
Хочешь сказать, что это простая задача, просто у меня что-то кривое? Так я и прошу подказать, что нужно поднять и что кому указать хотя бы в общих чертах, а то я из стороны в сторону шарахаюсь.
Убить всех человеков!
-
- Сообщения: 324
Re: "Двойной" NAT
С описанием проблемы у тебя задача. Ты не написал что есть "локальная сеть провайдера", что есть "некоторые адреса" в ней.
Если попытаться по-телепатить (глупо, не находишь? это ведь у тебя проблема...), то можно предположить типовое решение. Т.е. ты включен в локальную сеть провайдера (обычно это безлимитка за абонентку), а для выхода в и-нет устанавливаешь PPPoE соединение с его сервером (которое авторизуется и тарифицируется по трафику). При установлении соединения с VPN-сервером на него переписывается дефолтный маршрут (который ранее указывал на какой-то внутренний маршрутизатор провайдера) и ты теряешь связь с членами локалки, находящимися в других сегментах локальной сети. Так?
Если я не угадал (вполне вероятно, так как в этой схеме nat вообще не присутствует на твоей машине, он д.б. только на сервере провайдера), то ты не прав, не описав задачу по-людски. Если я угадал, то Shura тебе ответил совершенно точно - рисуй маршруты на те сегменты, которые у тебя "выпадают" при выходе в и-нет.
-
- Сообщения: 1575
- Статус: Pygoscelis papua
- ОС: Gentoo Linux, FreeBSD
Re: "Двойной" NAT
Виноват. Вероятно это мне так понятно, что не удосужился подробнее расписать. Попробую.
Есть комп под Фрей 6, соединяющийся с и-нетом через РРРоЕ. Пакеты в данном случае идут через tun0. Этот комп раздает и-нет МОЕЙ локалке. Тут все работает, проблем нет.
Но есть еще ПРОВАЙДЕРОВСКАЯ локалка (грубо говоря, все абоненты провайдера). То есть через эту же сетевуху, что соединяется с РРРоЕ-сервером, я могу обращаться к некоторому пулу адресов в этой локалке. В данном случае пакеты должны ходить через fxp0. Чтобы обращаться к адресам в ПРОВАЙДЕРСКОЙ локалке я должен завернуть некоторые запросы на дефолтный gateway, который я прописываю руками.
Хорошо, завернул. Когда сижу за этим компом с Фрей, то все отлично: обращаюсь к одному адресу - пакеты идут через tun0 и далее, т.е. через gateway, полученный от РРРоЕ-сервера, обращаюсь к адресам из ПРОВАЙДЕРСКОЙ локалки - идут через fxp0 и прописанный руками gateway.
А вот теперь хотелось бы чтобы такие же правила действовали и для членов МОЕЙ локалки, т.е. чтобы транзитные пакеты тоже отправлялись согласно этому правилу. Но вот тут какой-то затык. Вчера весь вечер просидел и выяснил, что транзитные пакеты таки уходят куда надо. tcpdump и логи файервола показывают, что пакеты от моего настольного компа, обращенные в ПРОВАЙДЕРОВСКУЮ локалку, через fxp0 проходят, не искажаются, файервол их не отбрасывает. Но обратно не возвращаюся! telnet и ftp-клиент пытаются открыть заданный адрес, но в конце концов отваливаются по таймауту. Хотя, повторюсь, на самом фряшном серваке локально все срабатывает отлично.
Вот в этом и вопрос. Как заставить сервак правильно разпихивать обращение из МОЕЙ локалки к разным адресам и возвращать обратно? Про два НАТа вопрос снимается.
Пробовал прикрутить mrouted, но вероятно это будет как из пушки по воробьям в мой ситуации. Кроме того, он вроде работает "зеркально" от того, что мне нужно.
Есть комп под Фрей 6, соединяющийся с и-нетом через РРРоЕ. Пакеты в данном случае идут через tun0. Этот комп раздает и-нет МОЕЙ локалке. Тут все работает, проблем нет.
Но есть еще ПРОВАЙДЕРОВСКАЯ локалка (грубо говоря, все абоненты провайдера). То есть через эту же сетевуху, что соединяется с РРРоЕ-сервером, я могу обращаться к некоторому пулу адресов в этой локалке. В данном случае пакеты должны ходить через fxp0. Чтобы обращаться к адресам в ПРОВАЙДЕРСКОЙ локалке я должен завернуть некоторые запросы на дефолтный gateway, который я прописываю руками.
Хорошо, завернул. Когда сижу за этим компом с Фрей, то все отлично: обращаюсь к одному адресу - пакеты идут через tun0 и далее, т.е. через gateway, полученный от РРРоЕ-сервера, обращаюсь к адресам из ПРОВАЙДЕРСКОЙ локалки - идут через fxp0 и прописанный руками gateway.
А вот теперь хотелось бы чтобы такие же правила действовали и для членов МОЕЙ локалки, т.е. чтобы транзитные пакеты тоже отправлялись согласно этому правилу. Но вот тут какой-то затык. Вчера весь вечер просидел и выяснил, что транзитные пакеты таки уходят куда надо. tcpdump и логи файервола показывают, что пакеты от моего настольного компа, обращенные в ПРОВАЙДЕРОВСКУЮ локалку, через fxp0 проходят, не искажаются, файервол их не отбрасывает. Но обратно не возвращаюся! telnet и ftp-клиент пытаются открыть заданный адрес, но в конце концов отваливаются по таймауту. Хотя, повторюсь, на самом фряшном серваке локально все срабатывает отлично.
Вот в этом и вопрос. Как заставить сервак правильно разпихивать обращение из МОЕЙ локалки к разным адресам и возвращать обратно? Про два НАТа вопрос снимается.
Пробовал прикрутить mrouted, но вероятно это будет как из пушки по воробьям в мой ситуации. Кроме того, он вроде работает "зеркально" от того, что мне нужно.
Убить всех человеков!
-
- Администратор
- Сообщения: 13939
- Статус: oel ngati kameie
- ОС: GNU
Re: "Двойной" NAT
Poor Fred
в linux решается примитивно - правилом для iptables типа
думаю, в bsd должно быть еще проще.
в linux решается примитивно - правилом для iptables типа
-A POSTROUTING -o <интерфейс> -j MASQUERADE
думаю, в bsd должно быть еще проще.
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
при сбоях форума см.блог
-
- Сообщения: 324
Re: "Двойной" NAT
1. Значит, ситуацию я угадал. Почти. В том смысле, что не угадал наличие "твоей" сети за твоим маршрутизатором.
2. Ты заодно объяснил, откуда взялся "первый" НАТ. Ты правишь адреса своей сети на адрес своего туннеля дабы "твоя" локалка выходила в И-нет.
3. Если я правильно понял, у тебя только один адрес локалки провайдера - повешенный на fxp0. А адресация твоей локальной сети в сеть провайдер "не лезет".
4. На твоем роутере все нормально, т.е. с маршрутизацией не нем все в порядке.
5. Если все вышеизложенное верно и ты опять ничего не упустил, то:
а) Ты сам себе правильно ответил насчет "двойного НАТ-а". Только неправильно термин употребил. Обычно под двойным НАТ-ом подразумевается двойное преобразование адреса.
б) А тебе нужно не двойное преобразование адреса, а двойной набор правил преобразования. Тебе нужно "дорисовать" правила, которые для пакетов, идущих на адреса локалки провайдера, будут менять исходящий адрес на адрес fxp0. Ну и сопутствующие обратные преобразования.
Извини, синтаксис сейчас не помню, давненько с FreeBSD не работал...
2. Ты заодно объяснил, откуда взялся "первый" НАТ. Ты правишь адреса своей сети на адрес своего туннеля дабы "твоя" локалка выходила в И-нет.
3. Если я правильно понял, у тебя только один адрес локалки провайдера - повешенный на fxp0. А адресация твоей локальной сети в сеть провайдер "не лезет".
4. На твоем роутере все нормально, т.е. с маршрутизацией не нем все в порядке.
5. Если все вышеизложенное верно и ты опять ничего не упустил, то:
а) Ты сам себе правильно ответил насчет "двойного НАТ-а". Только неправильно термин употребил. Обычно под двойным НАТ-ом подразумевается двойное преобразование адреса.
б) А тебе нужно не двойное преобразование адреса, а двойной набор правил преобразования. Тебе нужно "дорисовать" правила, которые для пакетов, идущих на адреса локалки провайдера, будут менять исходящий адрес на адрес fxp0. Ну и сопутствующие обратные преобразования.
Извини, синтаксис сейчас не помню, давненько с FreeBSD не работал...
-
- Сообщения: 1575
- Статус: Pygoscelis papua
- ОС: Gentoo Linux, FreeBSD
Re: "Двойной" NAT
Я с 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"
Как-то так.
Ну и как показывает мониторинг, пакеты все-таки на эту сетевуху перенаправляются. Только обратно не возвращаются. А как настроить обратное преобразование?
Убить всех человеков!
-
- Сообщения: 324
Re: "Двойной" NAT
М-да, начинается разговор слепого с глухим
У тебя в локалке какие адреса? Те, что ты обозначил иксами? Какие правила описывают преобразование адреса при выходе из _твоей_ локалки в и-нет? Тебе нужно накарябать аналогичное правило при выходе пакетов в локальную сеть провайдера. Обратно-то пакеты не возвращаются скорее всего потому, что адреса _твоей_ локалки в сети _провайдера_ неизвестны. Вот их и надо подменить на адрес твоей fxp0. Т.е. сделать аналогично тому, что происходит при обращении из твоей локалки в и-нет.

У тебя в локалке какие адреса? Те, что ты обозначил иксами? Какие правила описывают преобразование адреса при выходе из _твоей_ локалки в и-нет? Тебе нужно накарябать аналогичное правило при выходе пакетов в локальную сеть провайдера. Обратно-то пакеты не возвращаются скорее всего потому, что адреса _твоей_ локалки в сети _провайдера_ неизвестны. Вот их и надо подменить на адрес твоей fxp0. Т.е. сделать аналогично тому, что происходит при обращении из твоей локалки в и-нет.
-
- Сообщения: 1575
- Статус: Pygoscelis papua
- ОС: Gentoo Linux, FreeBSD
Re: "Двойной" NAT
Уфф, победил я таки свою проблему.
Поставил вопрос по-другому и половина задачи решилась сама собой. Сначала меня смущало, что два интерфейса находятся физически на одном устройстве. Но абстрагировавшись от этого, понял, что мне нужно рассматривать два отдельных интерфейса - fxp0 и tun0, каждый из которых смотрит в свою публичную сеть. Вот от этого и плясал.
В двух словах, проблема теперь состояла в запуске двух natd. Это решилось копированием /etc/rc.d/natd в natd2, соответствующими правками его и /etc/rc.d/ipfw и прикручиванием второго natd на другой порт.
Если кому-то интересно, то могу изложить все в виде статьи, хотя я сам опирался на чужие статьи. Основние идеи взяты из этой и этой статей.
Правда, наткнулся на другие грабли. Теперь не могу локально на сервере себя же пропинговать - permission denied. В принципе, не такая уж проблема, главное, что компы в локалке его нормально видят и пингуют.
Поставил вопрос по-другому и половина задачи решилась сама собой. Сначала меня смущало, что два интерфейса находятся физически на одном устройстве. Но абстрагировавшись от этого, понял, что мне нужно рассматривать два отдельных интерфейса - fxp0 и tun0, каждый из которых смотрит в свою публичную сеть. Вот от этого и плясал.
В двух словах, проблема теперь состояла в запуске двух natd. Это решилось копированием /etc/rc.d/natd в natd2, соответствующими правками его и /etc/rc.d/ipfw и прикручиванием второго natd на другой порт.
Если кому-то интересно, то могу изложить все в виде статьи, хотя я сам опирался на чужие статьи. Основние идеи взяты из этой и этой статей.
Правда, наткнулся на другие грабли. Теперь не могу локально на сервере себя же пропинговать - permission denied. В принципе, не такая уж проблема, главное, что компы в локалке его нормально видят и пингуют.
Убить всех человеков!
-
- Сообщения: 307
- ОС: FreeBSD 7.0/Ubuntu 8.04
Re: "Двойной" NAT
(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 по кот. у вас живёт сервер
-
- Сообщения: 1575
- Статус: Pygoscelis papua
- ОС: Gentoo Linux, FreeBSD
Re: "Двойной" NAT
Вот правила с небольшими сокращениями:
$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
$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
Убить всех человеков!
-
- Сообщения: 307
- ОС: FreeBSD 7.0/Ubuntu 8.04
Re: "Двойной" NAT
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

Хм, обычно помогает чтение доков да и пример 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

-
- Сообщения: 1575
- Статус: Pygoscelis papua
- ОС: Gentoo Linux, FreeBSD