OpenBSD 4.8 не натятся 'icmp port unreachable'

Здравствуйте, может кто нибудь подсказать что происходит...,
(OpenBSD4.8)
правила:
int_if - внутр
ext_if - внешн
block all
pass proto icmp from any to any
pass on $ext_if from 192.168.10.95 to any binat-to 195.138.2.35
pass quick on $int_if
pass out quick on $ext_if

делаю трасерт с наружи(freedsd)
tcpdump -vni bge0 host 95.26.225.168
95.26.225.168.60063 > 195.138.2.35.33465: [udp sum ok] udp 12 (ttl 3, id 60094, len 40)
192.168.10.95 > 95.26.225.168: icmp: 195.138.2.35 udp port 33465 unreachable (ttl 126, id 9246, len 68, bad cksum 0!)
95.26.225.168.60063 > 195.138.2.35.33466: [udp sum ok] udp 12 (ttl 3, id 60095, len 40)
192.168.10.95 > 95.26.225.168: icmp: 195.138.2.35 udp port 33466 unreachable (ttl 126, id 9247, len 68, bad cksum 0!)

тоесть ответ внутренней машины (192.168.10.95) "udp port unreachable" не натится, в остальном всё нормально, с виндовых машин трасерт красивый.

Это что, новая фенечка OpenBSD ?
и где, что можно/нужно включить что бы разрешить натить эти "ответы" ?

Аватар пользователя BABUT

если дадите

если дадите больше информации, то возможно..
а так, лично я, вобще не вижу причин к тому, чтобы что-то тут натилось

Аватар пользователя fazer

а что вы имеете

а что вы имеете ввиду ?
вы намекаете на то что ответ "за натовой" машины на udp запрос на непрослушиваемый порт и не должен натится ? тогда если можно ссылочку на rfc .., а вот freebsd с темже pf отвечает вменяемо.

Аватар пользователя BABUT

я имею в виду,

я имею в виду, что в приведённом конфиге нет причин(правил), которые бы позволяли натить изнутри того, что за 195.138.2.35(192.168.10.95 в данном случае, как я понимаю). ссылочку конечно приведу- man pf.conf

если на-пальцах: на вход с 95.26.225.168 правило бината срабатывает. почему? потому, что есть такие мм..направления: "in on ext" и "out on int", где первое подпадает под него. казалось бы state, и в обратном направлении пойдёт по нему, но нет. почему? это к разработчикам. если не по state, то что тогда? а тогда имеем такие направления: "in on int" и "out on ext", где для первого сработающим(как последнее подходящее) будет "pass quick on $int_if", а для второго(по тем же причинам) "pass out quick on $ext_if". в последнем случае, для "in on int", мог бы сработать state, но вы его ограничили фейсом.

зы: если фряха столь могущественна, что ложит куй на логику pf, то пользуйтесь исключительно фряхой, не создавайте себе трудностей

Аватар пользователя fazer

>>я имею в виду,

>>я имею в виду, что в приведённом конфиге нет причин(правил), которые бы позволяли натить
>>изнутри того, что за 195.138.2.35(192.168.10.95 в данном случае, как я понимаю)
простите, видимо я действительно не понимаю принципа PF, почему в этом случае не сработает 1 правило (nat-to)
pass out on bge0 inet from 192.168.10.95 to any flags S/SA keep state (if-bound) nat-to 195.138.2.35 static-port
pass in on bge0 inet from any to 195.138.2.35 flags S/SA keep state (if-bound) rdr-to 192.168.10.95
(это реалные строчки из конфига после нормализации)

>>если на-пальцах: на вход с 95.26.225.168 правило бината срабатывает
мне почему-то кажется сработает "редирект"
... ну и всё остальное в контексте того что есть элементарный nat ... static-port

а самое забавное что это всё абсолютно рабочее в плане слушаемых портов, бинат работает идеально, проблема только с ICMP ... udp port ... unreachable

Не могли-бы Вы уважаемый просто исправить мои недочёты, внесите/удалите необходимые строчки в мой конфиг, думаю Вас это не затруднит.

Аватар пользователя BABUT

>почему в этом

>почему в этом случае не сработает 1 правило (nat-to)
>pass out on bge0 inet from 192.168.10.95 to any flags S/SA keep state (if-bound) nat-to 195.138.2.35 static-port
потому, что "pass out quick on $ext_if" тоже подходит под условие, и оно последнее подходящее, и оно quick(в случае, если бы не было последним), и в нём нет nat
>мне почему-то кажется сработает "редирект"
а разве не сказал об этом прямо?- "'in on ext' и 'out on int', где первое подпадает под него"
>а самое забавное что это всё абсолютно рабочее в плане слушаемых портов, бинат работает идеально
вот это и взрывает мозг. давайте больше информации
>внесите/удалите необходимые строчки в мой конфиг
не эмулируя ситуацию, предположу, что последние два правила нужно удалить/внести выше правила бината, отобрав при этом у них quick

зы: на основе личного опыта советую использовать тэги, т.е.
block all
match .. tag bla
match .. tag bla
match .. tag bla
pass tagged bla
у данного способа есть недостатки, но есть и весомое преимущество- не нужно рассматривать всё "на пальцах", можно свести весь конфиг к одному pass

Аватар пользователя fazer

если я

если я правильно понял, Вы имели ввиду что-то типа этого?

block all
pass on $int_if all no state
pass in on $ext_if inet from any to 195.138.2.35 flags S/SA keep state rdr-to 192.168.10.95
pass out on $ext_if inet from 192.168.10.95 to any flags S/SA keep state nat-to 195.138.2.35 static-port

те-же яйца:
tcpdump -ni bge0 host 95.26.225.240
13:47:08.571120 95.26.225.240.42095 > 195.138.2.35.33560: udp 12
13:47:08.572061 192.168.10.95 > 95.26.225.240: icmp: 195.138.2.35 udp port 33560 unreachable
13:47:13.572965 95.26.225.240.42095 > 195.138.2.35.33561: udp 12
13:47:13.573269 192.168.10.95 > 95.26.225.240: icmp: 195.138.2.35 udp port 33561 unreachable
bge0 = внешний.
может быть я опять что-то не то сдалал .., Вы не могли бы поправить.

Аватар пользователя BABUT

я чётко указал

я чётко указал что имел в виду, вы явно издеваетесь
вариант первый(удалить):
block all
pass proto icmp from any to any
pass on $ext_if from 192.168.10.95 to any binat-to 195.138.2.35

вариант второй(вставить):
block all
pass proto icmp from any to any
pass on $int_if
pass out on $ext_if
pass on $ext_if from 192.168.10.95 to any binat-to 195.138.2.35

но сам бы сделал так:
block all
match in on $int proto icmp from 192.168.10.95 tag PASS
match on $ext from 192.168.10.95 to any binat-to 195.138.2.35 tag PASS
pass tagged PASS

зы: если 192.168.10.95 планирует сама инициализировать соединения и не только icmp port unreachable, то ограничение по протоколу следует убрать
up: проверил, вариант рабочий

Аватар пользователя fazer

те-же яйца, только в профиль

#(I)
echo '
int_if="bge1"
ext_if="bge0"
block all
pass proto icmp from any to any
pass on $int_if
pass out on $ext_if
pass on $ext_if from 192.168.10.95 to any binat-to 195.138.2.35
' > /etc/pf.conf

pfctl -f /etc/pf.conf
pfctl -sr
block drop all
pass proto icmp all keep state
pass on bge1 all flags S/SA keep state
pass out on bge0 all flags S/SA keep state
pass out on bge0 inet from 192.168.10.95 to any flags S/SA keep state nat-to 195.138.2.35 static-port
pass in on bge0 inet from any to 195.138.2.35 flags S/SA keep state rdr-to 192.168.10.95

tcpdump -ni bge0 host 95.26.225.240
. . . . . . . . . . . . . . . . .
09:40:34.754361 95.26.225.240.44780 > 195.138.2.35.33473: udp 12 [tos 0xb8]
09:40:34.754641 192.168.10.95 > 95.26.225.240: icmp: 195.138.2.35 udp port 33473 unreachable
09:40:39.756340 95.26.225.240.44780 > 195.138.2.35.33474: udp 12 [tos 0xb8]
09:40:39.756619 192.168.10.95 > 95.26.225.240: icmp: 195.138.2.35 udp port 33474 unreachable

#(II)
echo '
int="bge1"
ext="bge0"
block all
match in on $int proto icmp from 192.168.10.95 tag PASS
match on $ext from 192.168.10.95 to any binat-to 195.138.2.35 tag PASS
pass tagged PASS
'> /etc/pf.conf

pfctl -f /etc/pf.conf
pfctl -sr
block drop all
match in on bge1 inet proto icmp from 192.168.10.95 to any tag PASS
match out on bge0 inet from 192.168.10.95 to any tag PASS nat-to 195.138.2.35 static-port
match in on bge0 inet from any to 195.138.2.35 tag PASS rdr-to 192.168.10.95
pass all flags S/SA keep state tagged PASS

tcpdump -ni bge0 host 95.26.225.240
tcpdump: listening on bge0, link-type EN10MB
09:47:54.930234 95.26.225.240.44780 > 195.138.2.35.33561: udp 12 [tos 0xb8]
09:47:59.932135 95.26.225.240.44780 > 195.138.2.35.33562: udp 12 [tos 0xb8]
09:48:04.935453 95.26.225.240.44780 > 195.138.2.35.33563: udp 12 [tos 0xb8]
09:48:09.936130 95.26.225.240.44780 > 195.138.2.35.33564: udp 12 [tos 0xb8]
т.е. вообще без ответа
Теперь что я не так сделал ?, какое "издевательство", следую Вашим советам.
Может быть у Вас что-то включено для этого в sysctl ? у меня всё из коробки (4.8).

Аватар пользователя BABUT

нет, я был не

нет, я был неправ относительно работоспособности, невнимательно проверял, простите. на практике это сообщение не только не натится, но даже не видится pf'ом, в том числе и на 47. однако верность логики в моём случае и неверность в вашем буду отстаивать

зы:
match in on vr0 inet from 192.168.85.10 to any tag PASS
match out on egress inet from 192.168.85.10 to any tag PASS nat-to 195.151.6.116 static-port
match in on egress inet from any to 195.151.6.116 tag PASS rdr-to 192.168.85.10
pass all flags S/SA keep state (pflow) tagged PASS

16:48:23.922967 194.84.63.20.54091 > 195.151.6.116.55555: udp 1470 (frag 47788:1472@0+)
16:48:23.922974 194.84.63.20 > 195.151.6.116: (frag 47788:6@1472)
16:48:23.924095 192.168.85.10 > 194.84.63.20: icmp: 195.151.6.116 udp port 55555 unreachable

Аватар пользователя fazer

А я собственно

А я собственно и не спорю с Вашел логикой, она проста и понятна... )
У меня просто задачи стоят не только получать ответы на udp, а и работать из за ната ))),
но как бы то нибыло кто-нибудь знает что происходит, это баг или преднамеренное поведение openbsd в отношении сих пакетов ?

Аватар пользователя BABUT

конечно это

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

Аватар пользователя ENcrypted

In order to state that this

In order to state that this is a bug, you have dig in into PF and find out exactly how rules are parsed and how exactly do they get expanded.

Аватар пользователя BABUT

т.е. все, для

т.е. все, для кого слишком сложно разобраться в коде pf и системы в целом, не имеют права слать багрепорты? обобщим и абстрагируем данную мысль: если вы не являетесь экспертом в некоторой области, то не имеете права предъявлять претензии с нею связанные. например: если вы не являетесь экспертом в акустике, медицине и юриспруденции, то не имеете права пожаловаться на соседа с перфоратором, мешающего вашему сну. я правильно вас понял?

Аватар пользователя ENcrypted

А зачем binat

А зачем binat собственно?

nat on $ext_if from 192.168.10.95 to any -> ($ext_if:0) static-port

эффект я думаю будет тотже.

Аватар пользователя ENcrypted

Просмотрев

Просмотрев правила повнимательней, решил что мешает последние правило.

смени pass on $ext_if from 192.168.10.95 to any binat-to 195.138.2.35
на pass quick on $ext_if from 192.168.10.95 to any binat-to 195.138.2.35

Аватар пользователя fazer

>> А зачем binat

>> А зачем binat собственно?
>> nat on $ext_if from 192.168.10.95 to any -> ($ext_if:0) static-port
>> эффект я думаю будет тотже.

pass out on bge0 inet from 192.168.10.95 to any flags S/SA keep state (if-bound) nat-to 195.138.2.35 static-port
pass in on bge0 inet from any to 195.138.2.35 flags S/SA keep state (if-bound) rdr-to 192.168.10.95
вот в такие две строчки раскладывает сам PF строку с bi-nat_ом, пасему эфект именно такой + возможность стучаться на внутреннюю машину снаружи, хачу классический PAT:) и он даже работает, вот только трасерт дуркует.

>> Просмотрев правила повнимательней, решил что мешает последние правило.
пробовал.., те-же яйца..., бинат сразу создает keep state и последние строчки ему по барабану.

Аватар пользователя ENcrypted

Well, we'll start from the

Well, we'll start from the beginning - traceroute does not sends UDP pkts.
Output you give is a port-probing.

Here some info:
traceroute hosme.unixconn.com from a 192.121.145.180 gives:

[cryptus]$ traceroute home.unixconn.com
traceroute to home.unixconn.com (212.116.70.46), 64 hops max, 40 byte packets
1 gateway.montagedrangarna.se (192.121.145.1) 0.267 ms 0.228 ms 0.237 ms
2 83.233.74.249 (83.233.74.249) 0.606 ms 0.661 ms 1.989 ms
3 se-host-80-89-163-213.stadenistaden.net (80.89.163.213) 0.851 ms 0.724 ms 0.738 ms
4 se-host-80-89-163-82.stadenistaden.net (80.89.163.82) 0.858 ms 0.727 ms 0.864 ms
5 83.233.79.13 (83.233.79.13) 0.856 ms 0.681 ms 0.736 ms
6 dr-se-lan-i70-1-v121.bredband2.net (82.209.165.146) 2.233 ms 2.102 ms 1.987 ms
7 dr-se-lnd-wg3-1-v120.bredband2.net (82.209.165.144) 2.107 ms 2.103 ms 2.113 ms
8 cr-se-mlm-kvg15-1-v514.bredband2.net (82.209.178.234) 1.980 ms 2.103 ms 1.988 ms
9 netnod-ix-ge-b-mmo-1500.bahnhof.net (195.69.117.85) 2.106 ms 1.977 ms 1.986 ms
10 mmo-cr1.lsk-rr1.bahnhof.net (85.24.151.219) 2.982 ms 2.978 ms 2.986 ms
11 82.209.176.138 (82.209.176.138) 2.732 ms 2.58 ms 2.987 ms
12 * * *
13 * * *
14 * * *
^C

while sniffing for ICMP on the other side gives:

freenas:~# tcpdump -n -infe0 icmp
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on nfe0, link-type EN10MB (Ethernet), capture size 96 bytes
21:32:45.347633 IP 194.254.54.91 > 212.116.70.46: ICMP 194.254.54.91 udp port 52699 unreachable, length 142
21:33:01.340966 IP 194.254.54.91 > 212.116.70.46: ICMP 194.254.54.91 udp port 52699 unreachable, length 142
21:33:21.123227 IP 82.48.88.181 > 212.116.70.46: ICMP 82.48.88.181 udp port 26835 unreachable, length 36
21:33:26.059119 IP 80.30.22.114 > 212.116.70.46: ICMP 80.30.22.114 udp port 25334 unreachable, length 142
21:33:39.171419 IP 82.48.88.181 > 212.116.70.46: ICMP 82.48.88.181 udp port 26835 unreachable, length 36
21:33:58.257841 IP 82.48.88.181 > 212.116.70.46: ICMP 82.48.88.181 udp port 26835 unreachable, length 36
21:34:03.289882 IP 95.42.36.33 > 212.116.70.46: ICMP host 95.42.36.33 unreachable, length 142
21:34:04.936707 IP 80.67.0.177 > 212.116.70.46: ICMP host 188.126.64.4 unreachable, length 36
21:34:18.392366 IP 80.30.22.114 > 212.116.70.46: ICMP 80.30.22.114 udp port 25334 unreachable, length 142
21:34:20.861486 IP 80.220.38.13 > 212.116.70.46: ICMP source quench, length 36
21:34:34.247099 IP 91.209.51.158 > 212.116.70.46: ICMP 91.209.51.158 udp port 39241 unreachable, length 142
21:34:34.256011 IP 87.255.14.79 > 212.116.70.46: ICMP 87.255.14.79 udp port 2768 unreachable, length 142
21:34:50.074481 IP 91.209.51.158 > 212.116.70.46: ICMP 91.209.51.158 udp port 39241 unreachable, length 142
21:34:50.083554 IP 87.255.14.79 > 212.116.70.46: ICMP 87.255.14.79 udp port 2768 unreachable, length 142
21:35:09.302289 IP 91.209.51.158 > 212.116.70.46: ICMP 91.209.51.158 udp port 39241 unreachable, length 142
21:35:09.310042 IP 87.255.14.79 > 212.116.70.46: ICMP 87.255.14.79 udp port 2768 unreachable, length 142
21:35:29.387114 IP 201.92.212.140 > 212.116.70.46: ICMP 201.92.212.140 udp port 42809 unreachable, length 36
21:35:45.097039 IP 91.192.152.17 > 212.116.70.46: ICMP time exceeded in-transit, length 36
21:35:45.163016 IP 93.65.198.197 > 212.116.70.46: ICMP 93.65.198.197 udp port 35432 unreachable, length 142
21:35:45.390687 IP 201.92.212.140 > 212.116.70.46: ICMP 201.92.212.140 udp port 42809 unreachable, length 36
21:36:01.092454 IP 91.192.152.17 > 212.116.70.46: ICMP time exceeded in-transit, length 36
21:36:01.136813 IP 95.67.166.114 > 212.116.70.46: ICMP 95.67.166.114 udp port 17442 unreachable, length 36
21:36:01.156233 IP 93.65.198.197 > 212.116.70.46: ICMP 93.65.198.197 udp port 35432 unreachable, length 142
21:36:01.488846 IP 80.30.22.114 > 212.116.70.46: ICMP 80.30.22.114 udp port 25334 unreachable, length 142
21:36:01.703649 IP 201.92.212.140 > 212.116.70.46: ICMP 201.92.212.140 udp port 42809 unreachable, length 36
21:36:17.099646 IP 91.192.152.17 > 212.116.70.46: ICMP time exceeded in-transit, length 36
21:36:17.170766 IP 93.65.198.197 > 212.116.70.46: ICMP 93.65.198.197 udp port 35432 unreachable, length 142
21:36:35.710070 IP 94.178.171.11 > 212.116.70.46: ICMP 94.178.171.11 udp port 1024 unreachable, length 142
21:36:50.429953 IP 92.237.0.223 > 212.116.70.46: ICMP 92.237.0.223 udp port 10786 unreachable, length 456

Do you see my remote IP in those logs? NO.

Аватар пользователя ENcrypted

So tell me abt your

So tell me abt your "traceroute".

Аватар пользователя ENcrypted

BTW, you can break me if

BTW, you can break me if you want ;)

OpenBSD 4.6 - client
FreeBSD 7.2 - server

Аватар пользователя fazer

i don`t understand, what is

i don`t understand,
what is the purpose of this flood?
who,where,why are you showing all of this.
The traceroutes absolutely nothing are telling about...
фигня какая-то, лучше бы сказали как это лечить)

Аватар пользователя ENcrypted

и как это все

и как это все смотрится на другой стороне?

Аватар пользователя BABUT

2ENcrypted не будет.

2ENcrypted
не будет. у него другая идея

Аватар пользователя ENcrypted

>делаю трасерт

>делаю трасерт с наружи(freedsd)
??

может всетаки тцпдамп?

Аватар пользователя ENcrypted

pass out on bge0 proto icmp

try 'pass out on bge0 proto icmp ... nat-to ...'

ICMP pkts seems to not fall under
pass out on bge0 inet from 192.168.10.95 to any flags S/SA keep state nat-to 195.138.2.35 static-port

and get out of bge0 because of
pass out on bge0 all flags S/SA keep state

Аватар пользователя ENcrypted

надо не

надо не багрепорт слать а писать в misc@. но как уже подмечено, ктото писал а ответа не получил.
остался вариант копать самому, а уж потом слать багрепорт когда отрыто.

Аватар пользователя BABUT

mikeb сделал патч,

mikeb сделал патч, жду когда приложит к pr

зы: а логика там мм..нетрадиционная, этот исходящий icmp, оказывается, проходит по state входящего udp %), и ничего уже с ним средствами пф не сделать- такая вот чОрная магия :\

up: http://cvs.openbsd.org/query-pr.html
номер 6564