[freebsd] TCP vs UDP в контексте туннеля.

12 views
Skip to first unread message

Nick Kostirya via freebsd

unread,
Jun 25, 2022, 2:47:13 AM6/25/22
to fre...@uafug.org.ua
Привет.

В туннель заворачивается на сервере X (192.168.10.1) вот так

${fwcmd} nat 2 config if vmx0 same_ports reset redirect_port udp 192.168.10.111:8080 8080 redirect_port tcp 192.168.10.111:8080 8080


На сервере Y (192.168.10.111) запросы tcpdump показывает приходят на 192.168.10.111, но вот ответы...

UDP ответ идет с 192.168.0.111 (вне туннеля) по внешнему интерфейсу rl0
а
TCP ответ идет с 192.168.10.111 (адрес туннеля), но тоже по внешнему интерфейсу rl0


Почему так?


Для UDP заворачиваю в туннель вот так
${fwcmd} add fwd 192.168.10.1 all from me 8080 to any out via rl0

И все работает. Сервер видит ответ X и пересылает дальше.

А вот с TCP forward не работает.
_______________________________________________
freebsd mailing list
fre...@uafug.org.ua
http://mailman.uafug.org.ua/mailman/listinfo/freebsd

Nick Kostirya via freebsd

unread,
Jun 26, 2022, 1:26:20 AM6/26/22
to fre...@uafug.org.ua
On Sat, 25 Jun 2022 09:47:00 +0300
Nick Kostirya via freebsd <fre...@uafug.org.ua> wrote:

> Привет.
>
> В туннель заворачивается на сервере X (192.168.10.1) вот так
>
> ${fwcmd} nat 2 config if vmx0 same_ports reset redirect_port udp 192.168.10.111:8080 8080 redirect_port tcp 192.168.10.111:8080 8080
>
>
> На сервере Y (192.168.10.111) запросы tcpdump показывает приходят на 192.168.10.111, но вот ответы...
>
> UDP ответ идет с 192.168.0.111 (вне туннеля) по внешнему интерфейсу rl0
> а
> TCP ответ идет с 192.168.10.111 (адрес туннеля), но тоже по внешнему интерфейсу rl0
>
>
> Почему так?


Проверил на NetBSD - аналогично. Но почему так?


>
>
> Для UDP заворачиваю в туннель вот так
> ${fwcmd} add fwd 192.168.10.1 all from me 8080 to any out via rl0
>
> И все работает. Сервер видит ответ X и пересылает дальше.
>
> А вот с TCP forward не работает.

А это еще не пробовал. Нужно читать про npf...

Eugene Grosbein

unread,
Jun 26, 2022, 2:36:54 PM6/26/22
to Nick Kostirya, fre...@uafug.org.ua
25.06.2022 13:47, Nick Kostirya via freebsd пишет:

> Привет.
>
> В туннель заворачивается на сервере X (192.168.10.1) вот так
>
> ${fwcmd} nat 2 config if vmx0 same_ports reset redirect_port udp 192.168.10.111:8080 8080 redirect_port tcp 192.168.10.111:8080 8080
>
>
> На сервере Y (192.168.10.111) запросы tcpdump показывает приходят на 192.168.10.111, но вот ответы...
>
> UDP ответ идет с 192.168.0.111 (вне туннеля) по внешнему интерфейсу rl0
> а
> TCP ответ идет с 192.168.10.111 (адрес туннеля), но тоже по внешнему интерфейсу rl0
>
>
> Почему так?
>
>
> Для UDP заворачиваю в туннель вот так
> ${fwcmd} add fwd 192.168.10.1 all from me 8080 to any out via rl0
>
> И все работает. Сервер видит ответ X и пересылает дальше.
>
> А вот с TCP forward не работает.

Нужен полный вывод ipfw show без каких-либо редактирований, разве что можешь заменить публичные адреса.

Nick Kostirya via freebsd

unread,
Jun 26, 2022, 11:11:18 PM6/26/22
to fre...@uafug.org.ua
On Mon, 27 Jun 2022 01:36:39 +0700
Eugene Grosbein <eu...@grosbein.net> wrote:

> 25.06.2022 13:47, Nick Kostirya via freebsd пишет:
> > Привет.
> >
> > В туннель заворачивается на сервере X (192.168.10.1) вот так
> >
> > ${fwcmd} nat 2 config if vmx0 same_ports reset redirect_port udp 192.168.10.111:8080 8080 redirect_port tcp 192.168.10.111:8080 8080
> >
> >
> > На сервере Y (192.168.10.111) запросы tcpdump показывает приходят на 192.168.10.111, но вот ответы...
> >
> > UDP ответ идет с 192.168.0.111 (вне туннеля) по внешнему интерфейсу rl0
> > а
> > TCP ответ идет с 192.168.10.111 (адрес туннеля), но тоже по внешнему интерфейсу rl0
> >
> >
> > Почему так?
> >
> >
> > Для UDP заворачиваю в туннель вот так
> > ${fwcmd} add fwd 192.168.10.1 all from me 8080 to any out via rl0
> >
> > И все работает. Сервер видит ответ X и пересылает дальше.
> >
> > А вот с TCP forward не работает.
>
> Нужен полный вывод ipfw show без каких-либо редактирований, разве что можешь заменить публичные адреса.

На W.W.W.W делаю запрос, который X.X.X.X перенаправляет в тeннель 192.168.10.1 -> 192.168.10.111
# echo hello | nc -w 1 X.X.X.X 8080

Ответ на дальнем конце туннеля (192.168.10.111), где стоит TCP сервер


# tcpdump -A -i rl0 'port 8080'
06:03:48.740345 IP 192.168.10.111.http-alt > W.W.W.W.35922: Flags [S.], seq 1829934935, ack 3960482503, win 65535, options [mss 1460,nop,wscale 6,sackOK,TS val 3660567064 ecr 2622412667], length 0
E..<..@.@..c..
oak.....Rm..W..*......`.............
./...N.{
06:03:49.740412 IP 192.168.10.111.http-alt > W.W.W.W.35922: Flags [S.], seq 1829934935, ack 3960482503, win 65535, options [mss 1460,nop,wscale 6,sackOK,TS val 3660568064 ecr 2622412667], length 0
E..<..@.@..c..
oak.....Rm..W..*......x.............
./...N.{
06:03:51.976288 IP 192.168.10.111.http-alt > W.W.W.W.35922: Flags [S.], seq 1829934935, ack 3960482503, win 65535, options [mss 1460,nop,wscale 6,sackOK,TS val 3660570300 ecr 2622412667], length 0
E..<..@.@..c..
oak.....Rm..W..*....................
./...N.{
06:03:56.266309 IP 192.168.10.111.http-alt > W.W.W.W.35922: Flags [S.], seq 1829934935, ack 3960482503, win 65535, options [mss 1460,nop,wscale 6,sackOK,TS val 3660574590 ecr 2622412667], length 0
E..<..@.@..c..
oak.....Rm..W..*....................
./.~.N.{


Выше - это ответ на вот это запрос, который пришел по ng0 тунелю:

# tcpdump -A -i ng0 'port 8080'
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ng0, link-type NULL (BSD loopback), capture size 262144 bytes
06:06:39.524166 IP W.W.W.W.35924 > 192.168.10.111.http-alt: Flags [S], seq 1945733787, win 64240, options [mss 1178,sackOK,TS val 2622583445 ecr 0,nop,wscale 7], length 0
E..<..@.3...ak....
o.T..s............o.........
.Qr.........

Eugene Grosbein

unread,
Jun 27, 2022, 4:03:48 PM6/27/22
to Nick Kostirya, fre...@uafug.org.ua
On 27.06.2022 10:11, Nick Kostirya via freebsd wrote:
> On Mon, 27 Jun 2022 01:36:39 +0700
> Eugene Grosbein <eu...@grosbein.net> wrote:
>
>> 25.06.2022 13:47, Nick Kostirya via freebsd пишет:
>>> Привет.
>>>
>>> В туннель заворачивается на сервере X (192.168.10.1) вот так
>>>
>>> ${fwcmd} nat 2 config if vmx0 same_ports reset redirect_port udp 192.168.10.111:8080 8080 redirect_port tcp 192.168.10.111:8080 8080
>>>
>>>
>>> На сервере Y (192.168.10.111) запросы tcpdump показывает приходят на 192.168.10.111, но вот ответы...
>>>
>>> UDP ответ идет с 192.168.0.111 (вне туннеля) по внешнему интерфейсу rl0
>>> а
>>> TCP ответ идет с 192.168.10.111 (адрес туннеля), но тоже по внешнему интерфейсу rl0
>>>
>>>
>>> Почему так?
>>>
>>>
>>> Для UDP заворачиваю в туннель вот так
>>> ${fwcmd} add fwd 192.168.10.1 all from me 8080 to any out via rl0
>>>
>>> И все работает. Сервер видит ответ X и пересылает дальше.
>>>
>>> А вот с TCP forward не работает.
>>
>> Нужен полный вывод ipfw show без каких-либо редактирований, разве что можешь заменить публичные адреса.
>
> На W.W.W.W делаю запрос, который X.X.X.X перенаправляет в тeннель 192.168.10.1 -> 192.168.10.111
> # echo hello | nc -w 1 X.X.X.X 8080
>
>
>
> Ответ на дальнем конце туннеля (192.168.10.111), где стоит TCP сервер
>
>
> # tcpdump -A -i rl0 'port 8080'

Я просил вывод ipfw show, а не tcpdump.

Nick Kostirya via freebsd

unread,
Jun 27, 2022, 10:23:25 PM6/27/22
to fre...@uafug.org.ua
On Tue, 28 Jun 2022 03:03:35 +0700
Eugene Grosbein <eu...@grosbein.net> wrote:

> On 27.06.2022 10:11, Nick Kostirya via freebsd wrote:
> > On Mon, 27 Jun 2022 01:36:39 +0700
> > Eugene Grosbein <eu...@grosbein.net> wrote:
> >
> >> 25.06.2022 13:47, Nick Kostirya via freebsd пишет:
> >>> Привет.
> >>>
> >>> В туннель заворачивается на сервере X (192.168.10.1) вот так
> >>>
> >>> ${fwcmd} nat 2 config if vmx0 same_ports reset redirect_port udp 192.168.10.111:8080 8080 redirect_port tcp 192.168.10.111:8080 8080
> >>>
> >>>
> >>> На сервере Y (192.168.10.111) запросы tcpdump показывает приходят на 192.168.10.111, но вот ответы...
> >>>
> >>> UDP ответ идет с 192.168.0.111 (вне туннеля) по внешнему интерфейсу rl0
> >>> а
> >>> TCP ответ идет с 192.168.10.111 (адрес туннеля), но тоже по внешнему интерфейсу rl0
> >>>
> >>>
> >>> Почему так?
> >>>
> >>>
> >>> Для UDP заворачиваю в туннель вот так
> >>> ${fwcmd} add fwd 192.168.10.1 all from me 8080 to any out via rl0
> >>>
> >>> И все работает. Сервер видит ответ X и пересылает дальше.
> >>>
> >>> А вот с TCP forward не работает.
> >>
> >> Нужен полный вывод ipfw show без каких-либо редактирований, разве что можешь заменить публичные адреса.
> >
> > На W.W.W.W делаю запрос, который X.X.X.X перенаправляет в тeннель 192.168.10.1 -> 192.168.10.111
> > # echo hello | nc -w 1 X.X.X.X 8080
> >
> >
> >
> > Ответ на дальнем конце туннеля (192.168.10.111), где стоит TCP сервер
> >
> >
> > # tcpdump -A -i rl0 'port 8080'
>
> Я просил вывод ipfw show, а не tcpdump.


Прошу прошение.

UDP

Начало туннеля.

# ipfw show
00100 1 34 nat 1 ip from any to me 8080 in via vmx0
00200 2 62 nat 1 ip from any 8080 to any
65000 56 3352 allow ip from any to any
65535 8928 1279978 deny ip from any to any

${fwcmd} nat 1 config if vmx0 same_ports reset redirect_port udp 192.168.10.111:8080 8080 redirect_port tcp 192.168.10.111:8080 8080
${fwcmd} add nat 1 ip from any to me 8080 in via vmx0
${fwcmd} add nat 1 ip from any 8080 to any

Сервер в конце туннеля

# ipfw show
00100 0 0 fwd 192.168.10.1 ip from 192.168.10.111 8080 to any via rl0
00200 1 31 fwd 192.168.10.1 ip from me 8080 to any out via rl0
65000 120 11064 allow ip from any to any
65535 122 10052 allow ip from any to any


${fwcmd} add fwd 192.168.10.1 all from 192.168.10.111 8080 to any via rl0


${fwcmd} add fwd 192.168.10.1 all from me 8080 to any out via rl0

TCP

Начало туннеля.

# ipfw show
00100 1 60 nat 1 ip from any to me 8080 in via vmx0
00200 0 0 nat 1 ip from any 8080 to any
65000 104 7636 allow ip from any to any
65535 8928 1279978 deny ip from any to any

Сервер в конце туннеля

# ipfw show
00100 4 240 fwd 192.168.10.1 ip from 192.168.10.111 8080 to any via rl0
00200 0 0 fwd 192.168.10.1 ip from me 8080 to any out via rl0
65000 63 4599 allow ip from any to any
65535 122 10052 allow ip from any to any

Eugene Grosbein

unread,
Jun 28, 2022, 4:44:40 AM6/28/22
to Nick Kostirya, fre...@uafug.org.ua

Лучше писать in recv vmx0 (хотя функционально это одно и то же).

> 00200 0 0 nat 1 ip from any 8080 to any

А вот тут большая ошибка: транслировать исходящие пакеты надо,
только если они уходят обратно в тот же интерфейс, то есть пропущено out xmit vmx0 в конце правила, добавь.

> 65000 104 7636 allow ip from any to any
> 65535 8928 1279978 deny ip from any to any
>
> Сервер в конце туннеля
>
> # ipfw show
> 00100 4 240 fwd 192.168.10.1 ip from 192.168.10.111 8080 to any via rl0
> 00200 0 0 fwd 192.168.10.1 ip from me 8080 to any out via rl0
> 65000 63 4599 allow ip from any to any
> 65535 122 10052 allow ip from any to any

Если тебе надо безусловно направлять ответные пакеты через 192.168.10.1, то правило нужно только одно
и чем оно будет короче, тем лучше:

ipfw add 100 fwd 192.168.10.1 ip from any 8080 to any out

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

Nick Kostyria via freebsd

unread,
Jun 30, 2022, 6:01:40 AM6/30/22
to fre...@uafug.org.ua
On Tue, 28 Jun 2022 15:44:32 +0700
Eugene Grosbein <eu...@grosbein.net> wrote:


> > 00200 0 0 nat 1 ip from any 8080 to any
>
> А вот тут большая ошибка: транслировать исходящие пакеты надо,
> только если они уходят обратно в тот же интерфейс, то есть пропущено out xmit vmx0 в конце правила, добавь.

Кстати, а в чем отличие out xmit от out recv?

>
> > 65000 104 7636 allow ip from any to any
> > 65535 8928 1279978 deny ip from any to any
> >
> > Сервер в конце туннеля
> >
> > # ipfw show
> > 00100 4 240 fwd 192.168.10.1 ip from 192.168.10.111 8080 to any via rl0
> > 00200 0 0 fwd 192.168.10.1 ip from me 8080 to any out via rl0
> > 65000 63 4599 allow ip from any to any
> > 65535 122 10052 allow ip from any to any
>
> Если тебе надо безусловно направлять ответные пакеты через 192.168.10.1, то правило нужно только одно
> и чем оно будет короче, тем лучше:
>
> ipfw add 100 fwd 192.168.10.1 ip from any 8080 to any out

_______________________________________________

Reply all
Reply to author
Forward
0 new messages