The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  ВХОД  слежка  RSS
"Как пробросить порт при наличии нескольких каналов в интерне..."
Вариант для распечатки  
Пред. тема | След. тема 
Форумы OpenNET: Виртуальная конференция (Public)
Изначальное сообщение [Проследить за развитием треда]

"Как пробросить порт при наличии нескольких каналов в интерне..."  
Сообщение от XoRe email(??) on 15-Мрт-07, 12:51 
Стоит машинка на FreeBSD 6.0.
У машинки 3 линка в интернет (у 2 линков реальные ип адреса, у третьего ип из сети 10.0.0.0, выходит в интернет через НАТ провайдера).
Причем один линк (который через НАТ) указан, как default gateway.
А на каждый из двух других линков прописано по некоторому количеству статических маршрутов.
И есть линк в локальную сеть 192.168.
А в локальной сети стоит ещё одна машинка.

Допустим, адреса на линках в интернет такие: 1.1.1.1, 2.2.2.2 и 10.0.0.3.
И допустим, внутренний ип-адрес машинки 192.168.0.1.
А ип-адрес ещё одной машинки в локалке 192.168.0.2.

Задача: пробросить в локальную сеть пару портов на 192.168.0.2.
Причем нужно, чтобы 192.168.0.2 видел, с какого адреса из интернета к нему идет подключение.
Кажется простым делом, с которым справляется ipfw+natd благодаря опции redirect-port.
Он отлично справляется, если все идет через один канал.
А когда несколько каналов, то получается вот что:
Приходит пакет с какого-то адреса в интернете (допустим с адреса 5.5.5.5) на адрес 1.1.1.1. (пакет 5.5.5.5 -> 1.1.1.1).
Проходит внутрь локалки, становясь пакетом вида 5.5.5.5 -> 192.168.0.2.
Машинка в локальной сети отвечает пакетом 192.168.0.2 -> 5.5.5.5.
И тут начинаются грабли.
Если ответный пакет уйдет в интернет с линка 1.1.1.1, то он преобразуется в пакет 1.1.1.1 -> 5.5.5.5.
И все будет нормально, ушел пакет 5.5.5.5 -> 1.1.1.1, пришел пакет 1.1.1.1 -> 5.5.5.5, соединение установлено.
А если ответный пакет уйдет с линка 2.2.2.2 или 10.0.0.3, то компьтеру придет ответный пакет 2.2.2.2 -> 5.5.5.5 или 10.0.0.3 -> 5.5.5.5, что довольно сложно опознать, как ответ на пакет 5.5.5.5 -> 1.1.1.1.

Сейчас это делается посредством программы redir (/usr/ports/net/redir).
Но у этой программы есть один нюанс.
При посылке пакета вида 5.5.5.5 -> 1.1.1.1 при прохождении через нашу машинку пакет преобразовывается в 192.168.0.1 -> 192.168.0.2.
Т.е. для машины 192.168.0.2 все соединения идут с адреса 192.168.0.1.

Необходимо сделать проброс так, чтоб 192.168.0.2 видел, с какого адреса из интернета к нему идет подключение.
Поиск по сайтам не помог.
Подскажите, пожалуйста, решение для сей ситуации.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

 Оглавление

Сообщения по теме [Сортировка по времени, UBB]


1. "Как пробросить порт при наличии нескольких каналов в интерне..."  
Сообщение от XoRe email(ok) on 16-Мрт-07, 11:29 
Статья http://www.opennet.me/base/net/nat_jump.txt.html натолкнула на решение.
Для примера буду использовать адреса выше, а пробрасываемые порты пусть будут 10000 и 20000.

Решение:
В ipfw у меня НАТ описан так:
${ipfw} add 16010 divert 8668 ip from not me to any via fxp0
${ipfw} add 16020 divert 8669 ip from not me to any via fxp1
${ipfw} add 16030 divert 8672 ip from not me to any via fxp2

Нужно прописать такое правило:
${ipfw} add 15610 divert 8669 tcp from 192.168.0.2 10000,20000 to any out

Причем, как видно из номера правила, его нужно прописать ПЕРЕД правилами с обычным натом.

Суть решения в том, что тогда даже если пакет собирается уйти наружу через другой интерфейс, он все равно будет завернут на нат того интерфейса, через который должен выходить.
После ната у исходящего пакета будет нужный внешний адрес, т.е. 1.1.1.1.

Ну а с помощью правил:
${ipfw} add 23010 fwd 1.1.1.2 ip from 1.1.1.1 to any
${ipfw} add 23030 fwd 2.2.2.3 ip from 2.2.2.2 to any
${ipfw} add 23040 fwd 10.0.0.4 ip from 10.0.0.3 to any
Пакет уйдет через тот линк, через который нужно.

fwd правила - это реализация policy based routing.

В целом решение получается такое:
Определиться с интерфейсом, на котором пробрасывать порты.
Такой интерфейс должен быть один.
Настроить на нем редирек портов вида:
-redirect_port tcp 192.168.0.2:10000 20000
Ну и добавить в фаерволл правило, которое будет подхватывать исходящие пакеты с пробрасываемого порта и прописывать им нужный внешний адрес.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

Архив | Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Оцените тред (1=ужас, 5=супер)? [ 1 | 2 | 3 | 4 | 5 ] [Рекомендовать для помещения в FAQ]




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2025 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру