rdr в pf FreeBSD 6.3

Настройка сетевых служб, маршрутизации, фаерволлов. Проблемы с сетевым оборудованием.
Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
Lehan
рядовой
Сообщения: 44
Зарегистрирован: 2008-05-29 12:55:10

rdr в pf FreeBSD 6.3

Непрочитанное сообщение Lehan » 2008-05-29 13:07:11

ДД!

Подскажите, может кто-нибудь уже сталкивался...

Есть шлюз с тремя сетевыми картами:
$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: Спасибо статья-писателям и сайто-держателю. Очень многие статьи помогли в работе.

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2460 рублей (8 CPU, 8Gb RAM, 2x500Gb HDD, RAID 3ware 9750):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

RusH
проходил мимо
Сообщения: 4
Зарегистрирован: 2008-06-04 7:44:54

Re: rdr в pf FreeBSD 6.3

Непрочитанное сообщение RusH » 2008-06-04 8:05:57

если я правильно понял, то сетка 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

Lehan
рядовой
Сообщения: 44
Зарегистрирован: 2008-05-29 12:55:10

Re: rdr в pf FreeBSD 6.3

Непрочитанное сообщение Lehan » 2008-06-07 11:38:01

Не помогло :(

Кстати, а в таком случае порт 2525 должен быть в списке открытых портов в sockstat?
25 - то порт открыт и случается, а 2525 нету :(

Аватара пользователя
freeman
лейтенант
Сообщения: 734
Зарегистрирован: 2007-03-18 5:13:25

Re: rdr в pf FreeBSD 6.3

Непрочитанное сообщение freeman » 2008-06-07 22:39:02

Lehan писал(а): Может быть есть какие-нибудь ограничения при работе с функцией rdr в pf? В доке ни слова про какие-либо ограничения.
Нет никаких ограничений в доке.
На практике же тоже сам пробрасую более одной связки порт-IP, где обе переменные разные.
Остатся должен только один ...

Lehan
рядовой
Сообщения: 44
Зарегистрирован: 2008-05-29 12:55:10

Re: rdr в pf FreeBSD 6.3

Непрочитанное сообщение Lehan » 2008-06-09 9:22:55

NAT может каким-нибудь образом мешать?
У меня NAT поднят на 192.168.10. интерфейсе. Т.е. на 192.168.100. его нет.

nn_khv
проходил мимо
Сообщения: 8
Зарегистрирован: 2008-10-24 3:19:12

Re: rdr в pf FreeBSD 6.3

Непрочитанное сообщение nn_khv » 2008-10-24 5:34:56

Прошу прощения, если вопрос не в тему.
Подскажите, пожалуйста возможно ли посредством pf получить полноценный NAT а не маскарадинг ?
Мне нужно подменять адреса в пакетах от локальных юзеров, идущих к серверам снаружи не адресом самого шлюза, а адресами из выделенного мне пула public IP адресов, причём для каждого локального юзера только конкретный внешний адрес,т.к. они жёстко определены во всяческих инструкциях и заверены всеми возможными подписями.

В документации по pf везде пишется "NAT", но работает, насколько я поняла, только маскарадинг.
rdr из интернета к компьютеру в локальной сети работает, но в данном случае инициатором соединения должен быть локальный компьютер, а не внешний. А nat и binat могут только подменить IP адрес локального юзера адресом внешнего интерфейса шлюза...

Если pf нельзя в данном случае использовать, подскажите пожалуйста, у кого есть железно рабочее решение ?
Чтала про связку ipfw+natd, но в примерах почему-то везде тоже только маскарадинг. А ещё слыхала что в версии FreeBSD 7.0 можно обойтись и без natd, средствами только ipfw - а как?

Наталья

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

Re: rdr в pf FreeBSD 6.3

Непрочитанное сообщение zg » 2008-10-24 5:47:12

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
Последний раз редактировалось zg 2008-10-24 6:06:48, всего редактировалось 1 раз.

paradox
проходил мимо
Сообщения: 11620
Зарегистрирован: 2008-02-21 18:15:41

Re: rdr в pf FreeBSD 6.3

Непрочитанное сообщение paradox » 2008-10-24 5:49:11

если я правильно понял
то этоможно сделать токо если на одном интерфесе указать кучу альясов
а если можно указать алиясы
то сдесть уже бинат или нат нет проблема

дургих пока идей у меня нет


>zg
та ему вроде как еще и обратно надо

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

Re: rdr в pf FreeBSD 6.3

Непрочитанное сообщение zg » 2008-10-24 6:05:27

paradox писал(а):>zg
та ему вроде как еще и обратно надо
так я не ему, а ей :smile: ладно, ща поправлю, чтоб яснее стало -)))

paradox
проходил мимо
Сообщения: 11620
Зарегистрирован: 2008-02-21 18:15:41

Re: rdr в pf FreeBSD 6.3

Непрочитанное сообщение paradox » 2008-10-24 6:09:50

Наталья
неувидел))

nn_khv
проходил мимо
Сообщения: 8
Зарегистрирован: 2008-10-24 3:19:12

Re: rdr в pf FreeBSD 6.3

Непрочитанное сообщение nn_khv » 2008-10-24 8:05:32

спасибо,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 ...

paradox
проходил мимо
Сообщения: 11620
Зарегистрирован: 2008-02-21 18:15:41

Re: rdr в pf FreeBSD 6.3

Непрочитанное сообщение paradox » 2008-10-24 8:25:27

как в pf так и в ipf как zg показал
можно указывать какой интерфейс(айпишник) использовать для трансляции
попробуй указывать явно

теоретически должно прокатить

Аватара пользователя
freeman
лейтенант
Сообщения: 734
Зарегистрирован: 2007-03-18 5:13:25

Re: rdr в pf FreeBSD 6.3

Непрочитанное сообщение freeman » 2008-10-24 8:44:29

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 и обязательно расскажи что получилось :)
Остатся должен только один ...

nn_khv
проходил мимо
Сообщения: 8
Зарегистрирован: 2008-10-24 3:19:12

Re: rdr в pf FreeBSD 6.3

Непрочитанное сообщение nn_khv » 2008-10-24 9:09:23

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

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
и где здесь используются алиасы ? такую конструкцию я уже пробовала - не работает.

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

Re: rdr в pf FreeBSD 6.3

Непрочитанное сообщение zg » 2008-10-24 9:13:45

nn_khv, выложи

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

ifconfig -a

paradox
проходил мимо
Сообщения: 11620
Зарегистрирован: 2008-02-21 18:15:41

Re: rdr в pf FreeBSD 6.3

Непрочитанное сообщение paradox » 2008-10-24 9:15:27

Или вместо $ext_if реальные внешние IP и обязательно расскажи что получилось
ext_if И будут альясы
с кучей правил на каждый

nn_khv
проходил мимо
Сообщения: 8
Зарегистрирован: 2008-10-24 3:19:12

Re: rdr в pf FreeBSD 6.3

Непрочитанное сообщение nn_khv » 2008-10-24 12:34:50

вот, что выдаёт 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

наверное я ошибаюсь в синтаксисе - как правильно указать алиас ?

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

Re: rdr в pf FreeBSD 6.3

Непрочитанное сообщение zg » 2008-10-24 16:41:17

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.

paradox
проходил мимо
Сообщения: 11620
Зарегистрирован: 2008-02-21 18:15:41

Re: rdr в pf FreeBSD 6.3

Непрочитанное сообщение paradox » 2008-10-24 20:25:51

$ext_my_if может быть не токо интерфейсом а и айпишником
наскоко я помню

Аватара пользователя
freeman
лейтенант
Сообщения: 734
Зарегистрирован: 2007-03-18 5:13:25

Re: rdr в pf FreeBSD 6.3

Непрочитанное сообщение freeman » 2008-10-24 23:44:53

paradox писал(а):$ext_my_if может быть не токо интерфейсом а и айпишником
наскоко я помню
Да. Кроме этого тогда не будет
paradox писал(а):с кучей правил на каждый.
Смотреть кучу паразитных правил на всех выводах замаешся. Но ты все равно начни с всего интерфейса, ради интереса :) , а уж потом
freeman писал(а):Или вместо $ext_if реальные внешние IP и обязательно расскажи что получилось
Остатся должен только один ...

nn_khv
проходил мимо
Сообщения: 8
Зарегистрирован: 2008-10-24 3:19:12

Re: rdr в pf FreeBSD 6.3

Непрочитанное сообщение nn_khv » 2008-10-27 9:31:09

Понедельник, новый этап мучений с 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 указывается ?

Аватара пользователя
freeman
лейтенант
Сообщения: 734
Зарегистрирован: 2007-03-18 5:13:25

Re: rdr в pf FreeBSD 6.3

Непрочитанное сообщение freeman » 2008-10-27 13:42:40

В общем вариант

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

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 и смотреть что там куда и как бегает.
Остатся должен только один ...

nn_khv
проходил мимо
Сообщения: 8
Зарегистрирован: 2008-10-24 3:19:12

Re: rdr в pf FreeBSD 6.3

Непрочитанное сообщение nn_khv » 2008-10-28 9:31:28

сделала:
в 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

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

ping 212.173.12.1
пинг не проходит, смотрю 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 в данном случае не срабатывает с алиасом?
Или алиас как-то неправильно прописан ?

paradox
проходил мимо
Сообщения: 11620
Зарегистрирован: 2008-02-21 18:15:41

Re: rdr в pf FreeBSD 6.3

Непрочитанное сообщение paradox » 2008-10-28 9:49:53

давайте неспеша
для начала без всяческих бинатов и роут-то

чистый nat на исходящем интерфейсе
на пул айпишников по алиясам

сделайте и скажите сработало или нет

nn_khv
проходил мимо
Сообщения: 8
Зарегистрирован: 2008-10-24 3:19:12

Re: rdr в pf FreeBSD 6.3

Непрочитанное сообщение nn_khv » 2008-10-30 9:22:57

Спасибо всем, paradox, freeman, zg - всё заработало и без route-to.

сейчас выложу rc.conf и pf.conf - может быть в нём и есть избыточность правил, но по крайней мере всё работает.

А проблема у меня оказывается была с драйвером сетевухи "age0" -"Attansic(R) L1 Gigabit Ethernet Adapter"
его в дистрибутиве FreeBSD 7.0 нет, пришлось присобачивать отдельно. И почему-то при перезапуске эта карточка время от времени падает, причём как-то бессистемно. Чтобы она опять заработала, нужно не только выключить комп, но и снять напряжение с блока питания (выдернуть шнурок). А я-то думаю, что она из-за неправильных правил в pf.conf пакеты не пропускает... пробую разные варианты, замучилась прям :( . А её-то оказывается вообще нет :cf: !

В общем - теперь работает и 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 вырастает до нечитаемых размеров.
Если есть предложения по оптимизации, очень интересуюсь.
Всем спасибо.

Наталья