URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID10
Нить номер: 4433
[ Назад ]

Исходное сообщение
"PF policy routing local interface"

Отправлено rusdis , 25-Ноя-09 14:47 
Здравствуйте! Подскажите пожалуйста, у меня не получается направить пакеты исходящие из localhost.
Конфигурация:
FREEBSD-7.1
PF
ng0 – внешний интерфейс с ограниченным каналом и реальным IP
gw_ng0-шлюз для ng0

vlan5-10.8.37.4 внешний интерфейс с дешевым трафиком и IP под NAT провайдера,
gw_vlan5 – шлюз 10.8.37.1

по умолчанию маршрутизация настроена на дешевый канал vlan5.
Хочу сделать, чтобы запросы на отправку/прием почты, и WEB инициализированными самим маршрутизатором  шли через канал с реальным IP ng0,


Пример:
Отправить пакеты через интерфейс ng0, приходящие на физический интерфейс re0:
<code>
pass in on re0 route-to (ng0 $gw_ng0)  proto {tcp, udp} from any to any port {80, 25} flags S/SA keep state
</code>
Данное правило работает, т.к. пакеты идут от ВНЕШНЕЙ машины на интерфейс re0.

Теперь пробую написать правило для пакетов исходящих от Localhost
т.к. путь по умолчанию настроен на gw_vlan5 ловлю их на vlan5
<code>
pass OUT on vlan5 route-to (ng0 $gw_ng0)  proto {tcp, udp} from any to any port {80, 25} flags S/SA keep state
</code>
не работает:
<code>
#tcpdump -nettti pflog0
tcpdump: WARNING: pflog0: no IPv4 address assigned
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on pflog0, link-type PFLOG (OpenBSD pflog file), capture size 96 bytes
000000 rule 2/0(match): pass out on vlan5: 10.8.37.4.62764 > 62.152.59.5.80:  tcp 40 [bad hdr length 0 - too short, < 20]
где 62.152.59.5 сайт ip-ping.ru
</code>

Похожую проблему нашел в статье
http://lists.freebsd.org/pipermail/freebsd-net/2007-July/014...
как я понял, эту проблему пытались решить с указанием маршрута по умолчанию на некий виртуальный интерфейс, и затем его там ловить, но не совсем понял как это сделать.


Содержание

Сообщения в этом обсуждении
"PF policy routing local interface"
Отправлено vagif , 25-Ноя-09 16:09 
привет!

лениво разбираться...
http://wiki.zeynalov.com/vagif:docs:freebsd:pf#load_balancin...- посмотри, тут есть мои живые конфиги.
Я тут пытался раскидывать трафик между stream & corbina.
причем corbina - было по умолчанию

как выяснилось, некоторые сайты не любят, когда для одной и той же сессии пакеты приходят с разных IP. И icq оказалась в том же числе. Поэтому некоторые адреса я явно загнал в какие-то каналы статически.


"PF policy routing local interface"
Отправлено rusdis , 25-Ноя-09 16:40 
>http://wiki.zeynalov.com/vagif:docs:freebsd:pf#load_balancin...- посмотри, тут есть мои >живые конфиги.

есля я правильно понял из конфигоф указанных на указанном сайте

pass in quick on $int_if route-to { ($ext_if2 $ext_gw2) } proto { tcp } from any to $icq keep state

pass in quick on $int_if route-to { ($corbina_if $corbina_gw) } proto { tcp, udp } from any to $corbina keep state


то $int_if это интерфейс к которому подключены пользователи/клиенты и если запрос придет от них на ip icq то он уйдет в ext_if2, если на ip corbina то уйдет на $corbina ;

такое правило как я уже писал у меня работает, проблема заключается в том что, если запустить traceroute на клиенте подключенному к $int_if до ip ICQ и до IP corbina, то каждый уйдет по своему интефейсу, ! НО ! если сделать traceroute с сервера до ip icq, и до ip corbina то все они пойдут на шлюз по умолчанию, т.е. в corbina, можете проверить.


"PF policy routing local interface"
Отправлено rusdis , 25-Ноя-09 17:17 
Хочу добавить вот еще что:
если написать
pass out log quick on vlan5 route-to (ng0 $gw_ng0) proto icmp from any to any keep state
и сделать ping -c 5 77.88.21.8

то

[root@julman /etc]# tcpdump -i ng0 host 77.88.21.8
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ng0, link-type NULL (BSD loopback), capture size 96 bytes
17:06:10.829710 IP 94.102.53.85 > ya.ru: ICMP echo request, id 18806, seq 0, length 64
17:06:10.980776 IP ya.ru > 94.102.53.85: ICMP echo reply, id 18806, seq 0, length 64
17:06:11.830409 IP julman.s > ya.ru: ICMP echo request, id 32702, seq 1, length 64
17:06:12.831183 IP julman.s > ya.ru: ICMP echo request, id 32702, seq 2, length 64
17:06:13.831959 IP julman.s > ya.ru: ICMP echo request, id 32702, seq 3, length 64
17:06:14.832765 IP julman.s > ya.ru: ICMP echo request, id 32702, seq 4, length 64

т.е. пакеты заворачиваются на ng0 но ПИНГ не проходит,
tcpdump -i vlan5 host 77.88.21.8
пакетов ни входящих ни исходящих не регистрирует


"PF policy routing local interface"
Отправлено vagif , 25-Ноя-09 17:26 

>том что, если запустить traceroute на клиенте подключенному к $int_if до
>ip ICQ и до IP corbina, то каждый уйдет по своему
>интефейсу, ! НО ! если сделать traceroute с сервера до ip
>icq, и до ip corbina то все они пойдут на шлюз
>по умолчанию, т.е. в corbina, можете проверить.

честно скажу, icmp пакетами не заморачивался...
но все это выглядит вполне логично, ведь правила навешиваются только на интерфейс пользователей ($int_if), а на сервере эти правила не работают.


"PF policy routing local interface"
Отправлено rusdis , 25-Ноя-09 17:43 
>честно скажу, icmp пакетами не заморачивался...
>но все это выглядит вполне логично, ведь правила навешиваются только на интерфейс
>пользователей ($int_if), а на сервере эти правила не работают.

В том то и дело что берем работающее правило для клиентского интерфейса меняем на нужный (vlan5) и направление на out , и не работает!



"PF policy routing local interface"
Отправлено rusdis , 30-Ноя-09 20:20 
Обгуглив весь интернет нашел в mail archive, то что мне нужно называлось Port-Based-Routing

http://www.mail-archive.com/misc@openbsd.org/msg36355.html

смысл таков
$ext_sainf - шлюз по умолчанию, куда идут все пакеты.
$ext_kiev - интерфейс через который следует выпустить пакет.
$gw_kiev  - шлюз для $ext_kiev

nat     on      $ext_sainf      proto   {tcp,udp}       from    self            to      any     port    smtp tag IF2    -> ($ext_kiev)


pass    out log quick   on      $ext_sainf      route-to ($ext_kiev $gw_kiev) tagged IF2 keep state

вот эти два правила решают поставленную задачу.


"PF policy routing local interface"
Отправлено vagif , 30-Ноя-09 21:26 
>Обгуглив весь интернет нашел в mail archive, то что мне нужно называлось
>Port-Based-Routing

кстати, новая FreeBSD 8 поддерживает на уровне ядра несколько роутинговых таблиц.
+ стала более продвинутая поддержка jail, со своим роутингом, nat'ом, fw, и т.д.

вот только руки все не доходят поковыряться...