Доброго времени суток ! :)Настроиваю pbr на FreeBSD порт 1194 TCP/UDP, поднимаю pbr на PF. TCP порт работает как надо,т.е. пакет приходит на один из внешних интерфейсов ($IF1,$IF2) порт 1194 и с него же уходит. Но по UDP происходит следующее, пакет приходит на интефейс, но уходит не согласна правилу в pf'e, а уходит через default route минуя файрвол.
Я возможно чегото не понимаю с UDP, почему так происходит? И возможна ли работа pbr UDP портов. Проверял с ipfw происходит абсолютно тоже самое.
Как решил эту проблему, в 7.1 появилась поддержка нескольких таблиц маршрутизации и приходится запускать несколько сервисов для разных интерфейсов, все работает, но хотелось бы разобраться с PBR и понять в чем проблема.мои настройки:
pf rules:
pass in quick on $IF1 reply-to ($IF1 $GW1) proto {tcp udp} from <internet> to $ADDR1 port 1194
pass in quick on $IF2 reply-to ($IF2 $GW2) proto {tcp udp} from <internet> to $ADDR2 port 1194default route:
#route get default
route to: default
destination: default
mask: default
gateway: localhost
interface: lo0
uname -a
#uname -a
FreeBSD myhost 7.1-PRERELEASE FreeBSD 7.1-PRERELEASE #4: Wed Nov 19 16:01:16 MSK 2008 root@myhost:/usr/src/sys/i386/compile/myhost i386
я правильно понимаю, что сервис запущен один, он открывает один сокет, а входящих интерфейсов (ip-адресов сервиса) несколько ?
В линухе я на эту тему (кстати, с этим же сервисом) сделал так:
сервис слушает один айпи (+ порт :) ). Доступен по нескольким айпи-адресам.
если интерфейс/адрес не основной,т.е. сервис на нем не ждет соединений, то входящий пакет проходит сквозь DNAT + маркировку маркером в таблице соединений.
Исходящий от сервиса пакет проходит сквозь восстановление маркера соединения, обратный DNAT, а потом маршрутизируется туда куда надо, в зависимости от значения маркера.
Если нужно просто обеспечить привязку к сетевому интерфейсу, то, видимо, надо использовать только маркировку без DNAT.
PS: не забывайте про tcpdump.
>если интерфейс/адрес не основной,т.е. сервис на нем не ждет соединений, то входящий
>пакет проходит сквозь DNAT + маркировку маркером в таблице соединений.
>Исходящий от сервиса пакет проходит сквозь восстановление маркера соединения, обратный DNAT, а
>потом маршрутизируется туда куда надо, в зависимости от значения маркера.
>Если нужно просто обеспечить привязку к сетевому интерфейсу, то, видимо, надо использовать
>только маркировку без DNAT.Можно поподробней про DNAT и маркировку?
В freebsd тегирование пакетов ни к чему не приводит. В моем случае исходящий UDP пакет идет с адреса куда смотрит роут по умолчанию, т.е. пакет приъодит на внешний адрес 1.1.1.1 $IF1, а уходит ответ с интерфейса lo0 и адреса 127.0.0.1, с TCP исходящий=входящему адресу и проблем нет. А если повесить сервис на внутреннем интерфейсе и натить внешнии запросы на него (если это заработает), то я не увижу src адрес клиента, что меня не устраивает.
Мне кажется тут проблема имеенно с реализацией ip в freebsd или както связано со спецификой UDP, но тут я не совсем понимаю что происходит и не знаю куда ковырять.
>>если интерфейс/адрес не основной,т.е. сервис на нем не ждет соединений, то входящий
>>пакет проходит сквозь DNAT + маркировку маркером в таблице соединений.
>>Исходящий от сервиса пакет проходит сквозь восстановление маркера соединения, обратный DNAT, а
>>потом маршрутизируется туда куда надо, в зависимости от значения маркера.
>>Если нужно просто обеспечить привязку к сетевому интерфейсу, то, видимо, надо использовать
>>только маркировку без DNAT.
>
>Можно поподробней про DNAT и маркировку?Это всё под линуксом. Ищите в советах на этом сайте, есть статья по этому поводу.
Собственно чтобы искать было проще - вот ссылка http://www.opennet.me/openforum/vsluhforumID3/42663.html>
>В freebsd тегирование пакетов ни к чему не приводит. В моем случае
>исходящий UDP пакет идет с адреса куда смотрит роут по умолчанию,
>т.е. пакет приъодит на внешний адрес 1.1.1.1 $IF1, а уходит ответ
>с интерфейса lo0 и адреса 127.0.0.1, с TCP исходящий=входящему адресу и
>проблем нет.Расписывайте схему подробнее. Угадывать имена интерфейсов и что где что слушает - желания мало.
> А если повесить сервис на внутреннем интерфейсе и натить
>внешнии запросы на него (если это заработает), то я не увижу
>src адрес клиента, что меня не устраивает.Как и всегда, рекомендую включить мозг и подумать, чем отличается SNAT от DNAT.
Ваше мнение насчет "я не увижу src адрес клиента" ошибочно.
>
>Мне кажется тут проблема имеенно с реализацией ip в freebsd или както
>связано со спецификой UDP, но тут я не совсем понимаю что
>происходит и не знаю куда ковырять.К сожалению я совсем не знаю pf, а возможности ipfw по маркировке соединений изучать времени нет.
> Как и всегда, рекомендую включить мозг и подумать, чем
>отличается SNAT от DNAT.
> Ваше мнение насчет "я не увижу src адрес клиента"
>ошибочно.DNAT это обычный портредирект? я почему-то решил что dynamic nat. Извините я не силен в абривиатурах iptables.
во фре это делается так (pf'ом)
rdr extIF proto udp from <internet> to extADDR port https -> dmzADDR port https
nat on extIF proto udp from dmzADDR port https to <internet> -> extADDRда в таком случае буду видеть src адрес.
а если имеенно натить внешнии адреса на внутренние то не будут, но разговор не об этом.
советы по настройки линукса врятли хоть как-то помогут мне во freebsd.
В любом случае спасибо за ответы, линух какнибудь поковыряю.
Тоже столкнулся с проблемой роутинга UDPпроблема решается, когда нужная служба работает на одном интерфейсе, а не биндится на все.
тут же можно использовать и порт форвардинг для проброса UDP