Страница 1 из 2
rdr в pf FreeBSD 6.3
Добавлено: 2008-05-29 13:07:11
Lehan
ДД!
Подскажите, может кто-нибудь уже сталкивался...
Есть шлюз с тремя сетевыми картами:
$ext_if - внешний интерфейс (интернет)
$inf_if - внутренний (192.168.10.)
$dmz_if - собсна подобие DMZ, в котором находятся сервера (192.168.100.).
В pf.conf есть строчка:
Код: Выделить всё
rdr on $ext_if proto tcp from any to any port 25 -> 192.168.100.1
, где $ext_if - внешний интерфейс сервера
Строчка срабатывает, т.е. пакеты из инета, идущие на 25 порт, редиректятся на другой сервер во внутренней сети.
Далее добавляю следующую строчку:
Код: Выделить всё
rdr on $ext_if proto tcp from any to any port 2525 -> 192.168.10.28 port 25
А эта строчка не срабатывает. Т.е. порт получается не закрыт, но телнетом, например, ответа не дождался. До сервера 192.168.10.28 пакеты не доходят.
Причем если перенаправить порт 2525 (или любой другой) на сервер 192.168.100.1, то пакеты идут.
Может быть есть какие-нибудь ограничения при работе с функцией rdr в pf? В доке ни слова про какие-либо ограничения.
Далее по тексту конфига pf.conf после rdr для чистоты эксперимента поставил pass quick all. До rdr стоит строчка nat, а еще выше описания таблиц. И все.
Заранее благодарен.
PS: Спасибо статья-писателям и сайто-держателю. Очень многие статьи помогли в работе.
Re: rdr в pf FreeBSD 6.3
Добавлено: 2008-06-04 8:05:57
RusH
если я правильно понял, то сетка 192.168.10 у тебя натится
попробуй в правиле
Код: Выделить всё
rdr on $ext_if proto tcp from any to any port 2525 -> 192.168.10.28 port 25
указать внешний ip явным образом,
типа
Код: Выделить всё
rdr on $ext_if proto tcp from any to $my_ext_ip port 2525 -> 192.168.10.28 port 25
где собссно вместо $my_ext_ip вписать сам ip
Re: rdr в pf FreeBSD 6.3
Добавлено: 2008-06-07 11:38:01
Lehan
Не помогло
Кстати, а в таком случае порт 2525 должен быть в списке открытых портов в sockstat?
25 - то порт открыт и случается, а 2525 нету

Re: rdr в pf FreeBSD 6.3
Добавлено: 2008-06-07 22:39:02
freeman
Lehan писал(а):
Может быть есть какие-нибудь ограничения при работе с функцией rdr в pf? В доке ни слова про какие-либо ограничения.
Нет никаких ограничений в доке.
На практике же тоже сам пробрасую более одной связки порт-IP, где обе переменные разные.
Re: rdr в pf FreeBSD 6.3
Добавлено: 2008-06-09 9:22:55
Lehan
NAT может каким-нибудь образом мешать?
У меня NAT поднят на 192.168.10. интерфейсе. Т.е. на 192.168.100. его нет.
Re: rdr в pf FreeBSD 6.3
Добавлено: 2008-10-24 5:34:56
nn_khv
Прошу прощения, если вопрос не в тему.
Подскажите, пожалуйста возможно ли посредством pf получить полноценный NAT а не маскарадинг ?
Мне нужно подменять адреса в пакетах от локальных юзеров, идущих к серверам снаружи не адресом самого шлюза, а адресами из выделенного мне пула public IP адресов, причём для каждого локального юзера только конкретный внешний адрес,т.к. они жёстко определены во всяческих инструкциях и заверены всеми возможными подписями.
В документации по pf везде пишется "NAT", но работает, насколько я поняла, только маскарадинг.
rdr из интернета к компьютеру в локальной сети работает, но в данном случае инициатором соединения должен быть локальный компьютер, а не внешний. А nat и binat могут только подменить IP адрес локального юзера адресом внешнего интерфейса шлюза...
Если pf нельзя в данном случае использовать, подскажите пожалуйста, у кого есть железно рабочее решение ?
Чтала про связку ipfw+natd, но в примерах почему-то везде тоже только маскарадинг. А ещё слыхала что в версии FreeBSD 7.0 можно обойтись и без natd, средствами только ipfw - а как?
Наталья
Re: rdr в pf FreeBSD 6.3
Добавлено: 2008-10-24 5:47:12
zg
nn_khv писал(а):Мне нужно подменять адреса в пакетах от локальных юзеров, идущих к серверам снаружи не адресом самого шлюза, а адресами из выделенного мне пула public IP адресов, причём для каждого локального юзера только конкретный внешний адрес,т.к. они жёстко определены во всяческих инструкциях и заверены всеми возможными подписями.
Код: Выделить всё
zg# man 5 ipnat
IPNAT(5) IPNAT(5)
NAME
ipnat, ipnat.conf - IP NAT file format
DESCRIPTION
The format for files accepted by ipnat is described by the following
grammar:
...
EXAMPLES
This section deals with the map command and its variations.
To change IP#'s used internally from network 10 into an ISP provided 8
bit subnet at 209.1.2.0 through the ppp0 interface, the following would
be used:
map ppp0 10.0.0.0/8 -> 209.1.2.0/24
Re: rdr в pf FreeBSD 6.3
Добавлено: 2008-10-24 5:49:11
paradox
если я правильно понял
то этоможно сделать токо если на одном интерфесе указать кучу альясов
а если можно указать алиясы
то сдесть уже бинат или нат нет проблема
дургих пока идей у меня нет
>zg
та ему вроде как еще и обратно надо
Re: rdr в pf FreeBSD 6.3
Добавлено: 2008-10-24 6:05:27
zg
paradox писал(а):>zg
та ему вроде как еще и обратно надо
так я не ему, а ей

ладно, ща поправлю, чтоб яснее стало -)))
Re: rdr в pf FreeBSD 6.3
Добавлено: 2008-10-24 6:09:50
paradox
Re: rdr в pf FreeBSD 6.3
Добавлено: 2008-10-24 8:05:32
nn_khv
спасибо,zg. Про IPNAT почитаю. Только мне его с нуля надо будет учить.
До этого только на pf делала маленькие шлюзики - везде провайдер только один IP-шник на контору выдавал.
Поэтому только pf и знаю более-менее. А тут попались такие монстры - куча public IP и все зарегистрированы в различных списках...
paradox, насчёт алиасов - сейчас попробую. пойду, как вы (BSD-шники) говорите "маны курить".
как я понимаю, алиасы нужно сделать на внешний интерфейс, столько, сколько используется public IP адресов.
а потом делать nat на основном интерфейсе, но подменять конкретный адрес адресом алиаса интерфейса ?
ну как в rc.conf это написать, я примерно поняла:
#lan-3COM
ifconfig_xl0="inet 192.168.1.1 netmask 255.255.255.0"
#internet-Attansic(R) L1 Gigabit Ethernet Adapter
ifconfig_age0="inet 212.173.12.2 netmask 255.255.255.128"
ifconfig_age0_alias0="inet 212.173.12.18 netmask 255.255.255.255"
ifconfig_age0_alias1="inet 212.173.12.27 netmask 255.255.255.255"
ifconfig_age0_alias2="inet 212.173.12.42 netmask 255.255.255.255"
....
и т.д.
а как потом в pf.conf эти алиасы использовать ?
если мне к примеру надо чтобы 192.168.1.15 выходил наружу как 212.173.12.18,
а 192.168.1.22 как 212.173.12.27 ...
Re: rdr в pf FreeBSD 6.3
Добавлено: 2008-10-24 8:25:27
paradox
как в pf так и в ipf как zg показал
можно указывать какой интерфейс(айпишник) использовать для трансляции
попробуй указывать явно
теоретически должно прокатить
Re: rdr в pf FreeBSD 6.3
Добавлено: 2008-10-24 8:44:29
freeman
nn_khv писал(а):а как потом в pf.conf эти алиасы использовать ?
если мне к примеру надо чтобы 192.168.1.15 выходил наружу как 212.173.12.18,
а 192.168.1.22 как 212.173.12.27 ...
Код: Выделить всё
nat on $ext_if from 192.168.1.15 to any -> 212.173.12.18
nat on $ext_if from 192.168.1.22 to any -> 212.173.12.27
Или вместо $ext_if реальные внешние IP и обязательно расскажи что получилось

Re: rdr в pf FreeBSD 6.3
Добавлено: 2008-10-24 9:09:23
nn_khv
Код: Выделить всё
nat on $ext_if from 192.168.1.15 to any -> 212.173.12.18
nat on $ext_if from 192.168.1.22 to any -> 212.173.12.27
и где здесь используются алиасы ? такую конструкцию я уже пробовала - не работает.
Re: rdr в pf FreeBSD 6.3
Добавлено: 2008-10-24 9:13:45
zg
Re: rdr в pf FreeBSD 6.3
Добавлено: 2008-10-24 9:15:27
paradox
Или вместо $ext_if реальные внешние IP и обязательно расскажи что получилось
ext_if И будут альясы
с кучей правил на каждый
Re: rdr в pf FreeBSD 6.3
Добавлено: 2008-10-24 12:34:50
nn_khv
вот, что выдаёт ifconfig -a
Код: Выделить всё
age0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
options=19b<RXCSUM,TXCSUM,VLAN_MTU,VLAN_HWTAGGING,VLAN_HWCSUM,TSO4>
ether 00:1e:8c:b4:33:7f
inet 212.173.12.2 netmask 0xffffff80 broadcast 212.173.12.127
inet 212.173.12.18 netmask 0xffffff80 broadcast 212.173.12.127
inet 212.173.12.27 netmask 0xffffff80 broadcast 212.173.12.127
media: Ethernet autoselect (1000baseTX <full-duplex>)
status: active
xl0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
options=8<VLAN_MTU>
ether 00:60:08:29:c3:9b
inet 192.168.1.1 netmask 0xffffff00 broadcast 192.168.1.255
media: Ethernet autoselect (100baseTX <full-duplex>)
status: active
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> metric 0 mtu 16384
inet6 fe80::1%lo0 prefixlen 64 scopeid 0x4
inet6 ::1 prefixlen 128
inet 127.0.0.1 netmask 0xff000000
pflog0: flags=141<UP,RUNNING,PROMISC> metric 0 mtu 33204
pfsync0: flags=0<> metric 0 mtu 1460
syncpeer: 224.0.0.240 maxupd: 128
в pf.conf написала:
Код: Выделить всё
int_if="xl0"
ext_if="age0"
ext_my_if="age0:1"
lo_if="lo0"
nat on $ext_my_if inet from 192.168.1.15 -> $ext_my_if
pass all keep state
пропускаю всё, пока меня фильтрация не интересует, только NAT.
pfctl -n -f /etc/pf.conf выдаёт ошибку :
no IP address found on age0:1
could not parse host specification
наверное я ошибаюсь в синтаксисе - как правильно указать алиас ?
Re: rdr в pf FreeBSD 6.3
Добавлено: 2008-10-24 16:41:17
zg
nn_khv писал(а):наверное я ошибаюсь в синтаксисе - как правильно указать алиас ?
подозреваю что так
Код: Выделить всё
nat on $ext_my_if inet from 192.168.1.15 -> 212.173.12.18
поскольку нашёл в мануале такой пример
Код: Выделить всё
# NO NAT
no nat on $ext_if proto ah from 144.19.74.0/24 to any
nat on $ext_if from 144.19.74.0/24 to any -> 204.92.77.100
In the example below, packets bound for one specific server, as well as
those generated by the sysadmins are not proxied; all other connections
are.
Re: rdr в pf FreeBSD 6.3
Добавлено: 2008-10-24 20:25:51
paradox
$ext_my_if может быть не токо интерфейсом а и айпишником
наскоко я помню
Re: rdr в pf FreeBSD 6.3
Добавлено: 2008-10-24 23:44:53
freeman
paradox писал(а):$ext_my_if может быть не токо интерфейсом а и айпишником
наскоко я помню
Да. Кроме этого тогда не будет
paradox писал(а):с кучей правил на каждый.
Смотреть кучу паразитных правил на всех выводах замаешся. Но ты все равно начни с всего интерфейса, ради интереса

, а уж потом
freeman писал(а):Или вместо $ext_if реальные внешние IP и обязательно расскажи что получилось
Re: rdr в pf FreeBSD 6.3
Добавлено: 2008-10-27 9:31:09
nn_khv
Понедельник, новый этап мучений с NAT-ом
Код: Выделить всё
nat on $ext_my_if inet from 192.168.1.15 -> 212.173.12.18
не прокатывает.
если делаю pass all, то это правило nat не имеет смысла, так как 192.168.1.15
маршрутизируется в инет не через алиас а через основной интерфейс 212.173.12.2
(проверяла так - делала ping шлюза 212.173.12.1 - на нём стоит касперский антихакер - показывает источник 192.168.1.15)
А как его заставить ходить через алиасный интерфейс, чтобы сработал NAT ?
это где-то в rc.conf указывается ?
Re: rdr в pf FreeBSD 6.3
Добавлено: 2008-10-27 13:42:40
freeman
В общем вариант
Код: Выделить всё
nat on 212.173.12.18 from 192.168.1.15 to any -> 212.173.12.18
пробовали ?
С маршрутиризацией тут тоже вопрос может выплыть. Решить попробовать можно так
Код: Выделить всё
pass in quick log on $int_if route-to 212.173.12.18 inet from 192.168.1.15 keep state
И если нет, то пора включать tcpdump и смотреть что там куда и как бегает.
Re: rdr в pf FreeBSD 6.3
Добавлено: 2008-10-28 9:31:28
nn_khv
сделала:
в rc.conf
Код: Выделить всё
gateway_enable="YES"
defaultroute="212.173.12.1"
#local
ifconfig_xl0="inet 192.168.1.1 netmask 255.255.255.0"
#internet-Attansic(R) L1 Gigabit Ethernet Adapter
ifconfig_age0="inet 212.173.12.2 netmask 255.255.255.128"
ifconfig_age0_alias0="inet 212.173.12.18 netmask 255.255.255.255"
в pf.conf
Код: Выделить всё
int_if="xl0"
ext_if="age0"
binat on $ext_if:1 inet from 192.168.1.15 to any-> 212.173.12.18
block log (all) all
pass in quick log (all) on $int_if route-to ($ext_if:1 212.173.12.1) inet from 192.168.1.15 to any keep state
pass quick log (all) on $ext_if:1 all keep state
и, на всякий случай
Код: Выделить всё
pass quick log (all) on $ext_if all keep state
делаю c 192.168.1.15
пинг не проходит, смотрю tcpdump -n -e -ttt -r /var/log/pflog
показывает, только:
Код: Выделить всё
pass in on xl0: 192.168.1.15 > 212.173.12.1: ICMP echo request, id 512, seq 9472, length 40
т.е. входящий пакет на внутреннем интерфейсе принимается, а потом никуда не маршрутизируется.
вопрос: почему ? стало быть route-to в данном случае не срабатывает с алиасом?
Или алиас как-то неправильно прописан ?
Re: rdr в pf FreeBSD 6.3
Добавлено: 2008-10-28 9:49:53
paradox
давайте неспеша
для начала без всяческих бинатов и роут-то
чистый nat на исходящем интерфейсе
на пул айпишников по алиясам
сделайте и скажите сработало или нет
Re: rdr в pf FreeBSD 6.3
Добавлено: 2008-10-30 9:22:57
nn_khv
Спасибо всем, paradox, freeman, zg - всё заработало и без route-to.
сейчас выложу rc.conf и pf.conf - может быть в нём и есть избыточность правил, но по крайней мере всё работает.
А проблема у меня оказывается была с драйвером сетевухи "age0" -"Attansic(R) L1 Gigabit Ethernet Adapter"
его в дистрибутиве FreeBSD 7.0 нет, пришлось присобачивать отдельно. И почему-то при перезапуске эта карточка время от времени падает, причём как-то бессистемно. Чтобы она опять заработала, нужно не только выключить комп, но и снять напряжение с блока питания (выдернуть шнурок). А я-то думаю, что она из-за неправильных правил в pf.conf пакеты не пропускает... пробую разные варианты, замучилась прям

. А её-то оказывается вообще нет

!
В общем - теперь работает и NAT наружу - с определённых локальных компов, и rdr внутрь - из сторонних организаций к ним.
rc.conf
Код: Выделить всё
gateway_enable="YES"
defaultroute="212.173.12.1"
#local
ifconfig_xl0="inet 192.168.1.1 netmask 255.255.255.0"
#internet-Attansic(R) L1 Gigabit Ethernet Adapter
ifconfig_age0="inet 212.173.12.2 netmask 255.255.255.128"
#alias gruz.sklad
ifconfig_age0_alias0="inet 212.173.12.18 netmask 255.255.255.255"
#alias buhgalteria
ifconfig_age0_alias1="inet 212.173.12.27 netmask 255.255.255.255"
pf_enable="YES"
pf_rules="/etc/pf.conf"
pf_flags=""
pflog_enable="YES"
pflog_logfile="/var/log/pflog"
pflog_flags=""
pf.conf
Код: Выделить всё
int_if="xl0"
ext_if="age0"
#ext_organization
nalogovaya="123.45.67.89"
#gruz.sklad
nat on $internet_if inet from 192.168.1.15 to any -> 212.173.12.18
rdr on $internet_if inet from any to 212.173.12.18 -> 192.168.1.15
#buhgalteria
nat on $internet_if inet from 192.168.1.22 to any -> 212.173.12.27
rdr on $internet_if inet from any to 212.173.12.27-> 192.168.1.22
block log (all) all
#gruz.sklad -to any
pass in quick log (all) on $int_if inet from 192.168.1.15 to any keep state
pass out quick log (all) on $ext_if inet from 212.173.12.18 to any keep state
#any - to gruz.sklad
pass in quick log (all) on $ext_if inet from any to 192.168.1.15 keep state
pass out quick log (all) on $int_if inet from any to 192.168.1.15 keep state
#buhgalteria -to nalogovaya
pass in quick log (all) on $int_if inet from 192.168.1.22 to $nalogovaya keep state
pass out quick log (all) on $ext_if inet from 212.173.12.27 to $nalogovaya keep state
#nalogovaya - to buhgalteria
pass in quick log (all) on $ext_if inet from $nalogovaya to 192.168.1.22 keep state
pass out quick log (all) on $int_if inet from $nalogovaya to 192.168.1.22 keep state
ну, понятно, что log (all) - это только на время отладки, и нужно ещё правила для антиспуфинга и т.п
но главное - то, что всё работает.
Причём, что интересно - алиасы в pf.conf не использую - указываю непосредственно IP-шники, но в rc.conf их всё равно надо прописывать - иначе nat не работает - только rdr.
Сейчас попробую как-то объединить похожих клиентов в списки и таблицы, иначе мой pf.conf вырастает до нечитаемых размеров.
Если есть предложения по оптимизации, очень интересуюсь.
Всем спасибо.
Наталья