Мы — долго запрягаем, быстро ездим, и сильно тормозим.
www.lissyara.su —> статьи —> FreeBSD —> Мелочи —> redirect_port

Редирект порта с гейта на внутреннюю машину (natd)

Автор: lissyara.


    Понадобилось выпустить локальную машину по одному из портов в инет (www сервер, но, ввиду занятости 80 порта, снаружи он будет на 81-м. А вообще народ это юзает для всяких edonkey и прочего хламу). Гейт на FreeBSD6.0 - на нём уже стоял natd - народу из локалки надо же лазить в инет. Почитавши man natd, конкретно, раздел про redirect_port, стало ясно - сложностей особых нету. Для начала, для собственного удобства, решил переделать запуск natd - у меня он стартовал из /etc/rc.conf с указанием в виде флагов всех ключей запуска. Неудобно - а если завтра понадобится ещё на 5-ти машинах подобное мутить? Там строка запуска в километр будет. Итак. Приводим /etc/rc.conf к такому состоянию (показан кусок касающийся тока natd):
# NATD
natd_enable="YES"
natd_flags="-f /etc/natd.conf"

ну и создаём указанный файл, такого содержания:
# Интерфейс на котором работает natd (внешний)
interface rl0
# Пробовать оставить тот же самый порт у исходящих пакетов.
# При таком флаге лучше работают протоколы типа RPC. Если это
# невозможно то порт будет изменён.
same_ports
# nat`ить только частные сети (у вас же внутри частная сеть?)
unregistered_only
# самое интересное - то, ради чего все и затевалось.
# Редиректим пакеты по протоколу tcp, приходящие на внешний порт
# 81 на машину с адресом 192.168.20.251 и на 80-й порт.
redirect_port tcp 192.168.20.251:80 81

Заметтьте в файле используется не краткая а полная форма записи ключей. Потом перезапускаем машину (или убиваем natd и запускаем с командной строки с нужными ключами-файлами), интернет должен работать как и работал, а вот при попытке зайти на 81 порт - скорей всего будет облом. Файрволл. Я убил минут 30 пока понял почему оно работате так и только так:
${FwCMD} add allow tcp from any to 192.168.20.251 80 via ${LanOut}

Видать, пакеты в nat попадают ещё до файрволла, потому и приходится изгаляться с разрешением внутреннего адреса на внешнем интерфейсе (Вообще, если вдаваться в подробности - то пакеты через файр проходят неоднократно, и на каком из заходов действует это правило - я не знаю :()
Вот тока после этого и заработало.



размещено: 2006-04-21,
последнее обновление: 2008-10-30,
автор: lissyara


Abigor, 2006-04-24 в 9:01:54

было бы не плохо, если бы ты добавил в статью еще редирект для ftp так как это всегда больная тема =)

3EBC, 2006-05-02 в 0:33:23

А чего тут сложного?
Точно также пишешь в /etc/natd.conf:
redirect_port tcp 192.168.20.251:21 21
Всё.
Если пэссив моде используется, то тут надо целый диапазон портов указывать. Например в ProFTPD можно указать какие именно порты использовать для пассивного режима(для этого в proftpd.conf суем строку PassivePorts 8001 8100, таким образом будут использоваться порты с 8001 до 8100). Затем точно также в /etc/natd.conf добавляем:
redirect_port tcp 192.168.20.251:8001-8100 8001-8100
При этом также не забывааем добавить в proftpd.conf такую строку:
MasqueradeAddress <внешний_айпи_роутера>

SergDN, 2006-05-28 в 0:28:29

Когда редиректов несколько (по адресам и портам), как быть?
Есть некоторые неприятные зависимости результатов редиректа от расположения в файле правил на ipfw (особенно c проверкой состояния). Надежнее переходить на редирект в pf от OpenBSD. Тем более что даже от разработчиков толком не добится правильного решения подобных задач для ipfw/ipfw2. Не подставляйте свои шлюзы (примеров не будет :))

lissyara, 2006-05-28 в 9:26:52

По ушам не езди. На данный момент - это беспочвенное утверждение.

none, 2006-10-25 в 12:16:22

Спасибо за статью (-:
Для редиректа портов, для осла, использовал ipnat - очень просто и удобно, советую тоже обратить внимание (-:

FiSHeR, 2006-11-09 в 4:34:29

можно еще серез rinetd
rinetd.conf
0.0.0.0 1234 192.168.0.10 1234
откуда и куда
:)

vek, 2007-01-09 в 13:02:58

Ну спасибо ! Сильно помог.

Zeus, 2007-03-13 в 14:24:17

а еще есть хорошая утилитка в  в портах - bounce
bounce [-a localaddr | -b localaddr] [-p localport] machine port

kapvik, 2007-03-15 в 12:00:37

А ещё есть в портах redir

VAdim, 2007-03-22 в 11:07:18

Redir нормально пашет с ftp passive mode

sergio, 2007-03-30 в 17:03:17

Спасибо!
Есть еще вариант:
1) в файл /etc/services:
прописываем
nashport81     81/tcp
2) в /etc/inetd.conf пишем:
nashport81 stream  tcp     nowait  root    /usr/local/bin/socket   socket 192.168.0.1 80
3) killall -1 inetd


Тоже пашет!

Gracias, 2007-04-19 в 20:47:24

Думал что Nat'ом пользуюсь на 100%,
не тут-то было! echo "Thanks to Lissyara.su";)

Alexander Sheiko, 2007-05-04 в 5:55:23

> Я убил минут 30 пока понял почему оно работате так и только так

Пакеты попадают в файерволл дважды - на входе и на выходе из интерфейса...

Колян, 2007-08-30 в 18:43:34

Советую юзать айпинат, аффтар, пешы на мыло или в аську, 4461828.

ADilm, 2007-09-08 в 14:27:16

PF
время ipfw  уже прошло

Fmod, 2007-10-18 в 17:08:12

redirect_port отказывается работать если комп подключен в инет через адсл, уже все перепробовал :( (нужно чтоб некоторые сервера локальной сети были доступны из инета)
Приходится использовать rinetd и portfwd.
Причем в локальной сети redirect_port работает замечательно.
Заметил такую особенность redirect_port, при редиректе он выдает реальный ип того кто конектится, rinetd и portfwd заменяют ип на ип компа на котором установлены, из за чего невозможно вычислить ип подключившегося.
P.S. rinetd не рекомендую ибо виснет.

Fmod, 2007-10-26 в 21:50:08

Оказалось что и portfwd падает если использовать его для торентов. Вариант sergio с сокетами оказался самым лучшим. Только надо не забыть  cd /usr/ports/sysutils/socket && make install clean  

friman, 2007-12-05 в 13:57:52

Вот разберись как связать и почему так происходит когда nat отдельно, фильтр отдельно, шейпер отдельно ...
PF действительно лучший - умет всё сам.

vid, 2008-04-18 в 8:18:35

Для некоторых портов еще необходимо делать проброс и udp.
redirect_port tcp 192.168.20.251:80 81
redirect_port udp 192.168.20.251:80 81
и еще у меня заработало только когда я в ipfw добавил помимо
${FwCMD} add allow tcp from any to 192.168.20.251 80 via ${LanOut}
еще и
${FwCMD} add allow tcp from any to 192.168.20.251 80 via ${LanIn}

Volkoff, 2008-05-08 в 10:44:56

Предложенная схема не заработала на 7-ке, NAT просто игнорирует файлик natd.conf и слушает только стандартный 8668, скорее всего из-за компиляции в ядро. Зато заработала схема предложенная sergio. Только там надо добавить
${FwCMD} add allow tcp from "ип клиента или any" to ${IpOut} "порт" in via ${LanOut} setup
в правила фаирвола и разрешить inetd в rc.conf
inetd_enable="YES"

HOSTER, 2008-09-09 в 1:48:46

АЛЯ PF(Packet Filter)
rdr on em0 proto tcp from any to any port 99 -> google.com port 80

Прокинет что хочешь и куда хочешь!
Вот что нужно юзать )

mazdayka, 2008-09-19 в 9:34:31

socket -это конечно хорошо, но он показывает только локальный ip при пробросе, а как быть или что использовать если нужно знать реальный ip откуда идёт коннект?

Michael /780, 2008-10-30 в 8:58:09

 Решил поставить почтовый сервак за шлюзом. Этот шлюз раздает nat на несколько сетевых интерфейсов (раздает инет), сервисом natd+ipfw. Как тут быть?
redirect_port tcp 192.168.1.10:25 25
Где 192.168.1.10 - ip почтовика
Правило ipfw
${FwCMD} add allow tcp from any to 192.168.1.10 25 via ${внешний интерфейс с нат'ом}
Непонятки: где разрешать 110 порт на почтовик?

abigor, 2008-11-05 в 11:32:10

to Michael /780
там же
redirect_port tcp 192.168.1.10:110 110
${FwCMD} add allow tcp from any to 192.168.1.10 110 via ${внешний интерфейс с нат'ом}

Zar, 2008-11-18 в 11:57:17

народ, а что с natd в 7ой ветке? что с ним сделали? у меня как и у Volkoff не могу уже неделю настроить,
буква в букву переписал с боевого сервера  6.2... не работает... не редиректит порты... и логов нету..

Zar, 2008-11-19 в 9:20:16

ааа  разобрался.
на машине с которой редиректется порт должен быть прописан шлюз там машина на которую редеректят порт...
что то типо того...
блин три недели убил чтоб разобраться...

Damon_X, 2008-12-24 в 12:01:57

RINETD на 7ки отлично работал. Сбоев замечено не было. Ушёл от него из-за того, что подменяет IP!

Roland, 2009-02-04 в 15:36:42

на 7-ке что только не делал, месяц уже убил.
Не пашет ни ipfw nat ни divert natd(((




Аноним , 2009-02-27 в 17:32:29

Фря 7.1 ipfw + natd
Работает следующая конструкция,

${FwCMD} add allow tcp from any to 192.168.1.10 80 via ${внешний интерфейс с нат'ом}
+ inetd_enable="YES"

респект и уважуха !!!!
Дай вам Бог здоровья )))

daggerok, 2009-03-17 в 2:32:13

на 7-ке у меня так (надеюсь кому-то пригодится):
в /etc/rc.conf ничего о natd нет. я буду его запускать из скрипта фаера, и вообще мне проще по максимуму делать все в нем. скрипт лежит в /usr/local/etc/rc.d/
вот его часть касательно сабжа (пробрасываем, для примера, порт радмина. стандартный):
ipfw="/sbin/ipfw"
natd="/sbin/natd"
sysctl="/sbin/sysctl"
$sysctl net.inet.ip.fw.one_pass=0
oip="222.222.222.2" #внешний ип
oif="em0" #внешний иф
iip="192.168.0.1" #внутренний ип
iif="xl0" #внутренний иф
local_pc_ip="192.168.0.2" #тазик в локалке, на который надо пробросить порт 4899
#стартуем нат на внешнем ифе с редиректом:
$natd -m -s -n $oif -p 8669 -redirect_port tcp $local_pc_ip:4899 4899
#стартуем нат на внутриннем ифе:
$natd -m -s -n $iif -p 8668
#дальше собственно диверты:
$ipfw add divert 8669 log all from any to $oip 4899 in via $oif
$ipfw add divert 8668 log all from any to $local_pc_ip 4899 out via $iif
$ipfw add divert 8668 log all from $local_pc_ip 4899 to me in via $iif
$ipfw add divert 8669 log all from $local_pc_ip 4899 to any out via $oif
#ну и разрешаем нашим пакетам ходить через фаер:
$ipfw add allow tcp from any to $local_pc_ip 4899 via $oif
#в конце последнее правило
$ipfw add deny ip from any to any
#в нескольких статьях от "некоторых" авторов видел примеры с пробросами (более простые), но завершающиеся разрешающим правилом всего:))
$ipfw add allow ip from any to any
#меня это совершенно не вдохновляло, думаю многих так же не порадует.
#предложенная конструкция проверена и работоспособна на 7.1

daggerok, 2009-03-17 в 11:41:00

да, кста, можно так же не извращаться с двумя натами и сделать еще так (у меня работают оба варианта, тот что выше и следующий):

#вешаем нат на внешний ип с редиректом:
$natd -a ${oip} -p 8668 -redirect_port tcp $local_pc_ip:4899 4899

#собсно диверт:
$ipfw add divert 8668 ip from any to $oip in via $oif
$ipfw add divert 8668 ip from $local_pc_ip to any out via $oif

#для проверки обязательно перед денаем пишем следующие правила:
$ipfw add allow ip from any to me 4899
$ipfw add allow ip from any to $local_pc_ip 4899
$ipfw add allow ip from $local_pc_ip 4899 to any
#хотя мне кажется, что первое их этих трех правил (ip from any to me 4899) ненужно :)
# в любом случае потом можно будет по ipfw show посмотреть, ходят ли через него пакеты
#есть не ходят то можно спокойно убить его :)
#лично мне оно было нужно из-за того что в скрипте фаера, ниже - были определенные запреты.

#ну и обязательно последнее запрещающее правило:
$ipfw add deny ip from any to any

#в этом варианте используется один нат, и по идее, так должно быстрее работать чем в примере выше
#хотя хз :))

rexxer, 2010-09-14 в 10:36:49

Всем привет!
Настраивал это дело на 2х машинах - поначалу был везде разный результат и пришлось помучаться. В результате был найден рецепт.
1. НАТД умеет редиректить любые порты в любые.
2. Разрешающее правило для прохождения пакета должно стоять после диверта (у меня он одним правилом).
3. Перед этим не должно стоять правил разрешающих и з апрещающих есстественно.
4. Самое интересное, что net.inet.ip.fw.one_pass=0 не помогло.

yanixoids, 2010-09-28 в 12:09:25

И зачем такие паравозы, все банально и просто в ipfw+ipnat. В ipnat'e достаточно пробросить 80 порт на локальную машинку и всего делов.

rdr em0(вн.интерфейс) from any to out_ip port=80 -> 192.168.1.50 port 81 tcp





 

  Этот информационный блок появился по той простой причине, что многие считают нормальным, брать чужую информацию не уведомляя автора (что не так страшно), и не оставляя линк на оригинал и автора — что более существенно. Я не против распространения информации — только за. Только условие простое — извольте подписывать автора, и оставлять линк на оригинальную страницу в виде прямой, активной, нескриптовой, незакрытой от индексирования, и не запрещенной для следования роботов ссылки.
  Если соизволите поставить автора в известность — то вообще почёт вам и уважение.

© lissyara 2006-10-24 08:47 MSK

Время генерации страницы 0.1403 секунд
Из них PHP: 47%; SQL: 53%; Число SQL-запросов: 77 шт.
Исходный размер: 32741; Сжатая: 9678