Jump to content
Калькуляторы

Assymetric NAT на Linux

41 минуту назад, LostSoul сказал:

а как можно было call-центр крупного банка подключить с серым IP?

или у этого банка надомные операторы , подключающиеся к серверу банковской телефонии?

 

Второе, надомные. Там какой-то впн на базе веб приложения, шифрующийся сертификатом.

Вот сообщение, которое транслирует их ТП через пользователей операторам.

 

Цитата

Добрый день!Просьба помочь в решении проблемы.Я являюсь вашим клиентом (). Для выполнения своих рабочих обязанностей я использую интернет-сервис для совершения звонков из браузера (через стандартные-протоколы), но не могу им воспользоваться в полной мере — вероятнее всего проблема вызвана некорректными сетевыми настройками на вашем оборудовании.Проблема в следующем — при звонке, совершаемом через сайт, соединение устанавливается, но далее я ничего не слышу. Все локальные настройки на компьютере, а также аудио-настройки произведены корректно. Подключение осуществляется напрямую, роутер из маршрута исключён.Скорее всего, это происходит потому, что на вашей стороне фильтруются фрагментированные UDP-пакеты, в которых передаётся сертификат для согласования DTLS с клиентом. Особенность DTLS в том, что при передаче сертификат не помещается в один пакет — идут 2 пакета, второй помечается флагом fragmented.Подскажите, пожалуйста, настроена ли на вашем оборудовании фильтрация фрагментированных UDP-пакетов? При диагностике было выявлено, что прохождение фрагментированного UDP-трафика (как входящего, так и исходящего) заблокировано — http://n1.netalyzr.icsi.berkeley.edu/summary/id=369839a0-583-6a6c8967-13dc-4e42-903d .Проверить работу сервиса можно на этой странице — https://weboffice.tinkoff.ru/AstPage/Demo2/AstIvrcall В случае успешного вызова вы услышите голосовое меню; если UDP-трафик блокируется, при вызове будет тишина. 

 

Share this post


Link to post
Share on other sites

8 часов назад, LostSoul сказал:

жуткие вещи вы рассказываете.  что мешает проанализировать имеющиеся L3/L4 заголовки в рамках первого(первых) фрагментов , что необходимы для принятия решения о судьбе пакета, согласно настроенным и правилам и дальнейшей немедленной обработке и пересылке первого ( первых ) фрагментов? 

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

ну т.е. выполнять частично работу по дефрагментации (в части поиска сессий фраментов) самостоятельно в нате.

 

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

 

 

Share this post


Link to post
Share on other sites

А можно чуть подробнее о случаях (игры/torrent), 
когда возникают проблемы у обычного linux
nat (Address and Port-Dependent Mapping), и которые решаются
схемой Endpoint-Independent Mapping (Assymetric (Full Cone) NAT )?

 

А много проблем возникает из-за отсутствия hairpinning?

 

Плохо работают это как?

Edited by kisa

Share this post


Link to post
Share on other sites

Не сваливаться в ошибку, если список уже существует?

Не работали с ипсетом до сих пор? Там постоянно это пишешь)

 

-!, -exist
Ignore errors when exactly the same set is to be created or already added entry is added or missing entry is deleted

Share this post


Link to post
Share on other sites

On 7/21/2019 at 12:03 AM, SABRE said:

Прежде всего спасибо за Вашу работу - модуль действитеьно очень нужет и является хорошим решением между stateless NAT via iproute и stateful conntrack NAT.

Проверил на тестовом сервере - действительно NAT для GRE отрабатывает, но в сессиях записи об этом протоколе нет. Дописал часть правил чтобы клиентов, которые используют PPTP натить через conntrack:


ipset -N -! ct_fallback hash:ip

iptables -t raw -A PREROUTING -s <grey_net> -p tcp --dport 1723 -m set ! --match-set ct_fallback src -j SET --add-set ct_fallback src
iptables -t raw -A PREROUTING -s <grey_net> -p gre -m set ! --match-set ct_fallback src -j SET --add-set ct_fallback src
iptables -t raw -A PREROUTING -m set --match-set ct_fallback src -j RETURN
iptables -t raw -A PREROUTING -s <grey_net> -j CT --notrack
iptables -t raw -A PREROUTING -d <nat_pool> -j NAT --dnat


iptables -A FORWARD -d <grey_net> -j ACCEPT
iptables -A FORWARD -m set --match-set ct_fallback src -j ACCEPT
iptables -A FORWARD -s <grey_net> -j NAT --snat

iptables -t nat -A POSTROUTING -m set --match-set ct_fallback src -j SNAT --to-source <NAT_IP_for_fallback>

 

Спасибо за обратную связь. И вообще жалко было просто удалять наработки - может быть они кому-нибудь пригодятся.

 

On 7/21/2019 at 1:06 PM, kisa said:

А можно чуть подробнее о случаях (игры/torrent), 
когда возникают проблемы у обычного linux
nat (Address and Port-Dependent Mapping), и которые решаются
схемой Endpoint-Independent Mapping (Assymetric (Full Cone) NAT )?

 

А много проблем возникает из-за отсутствия hairpinning?

 

Плохо работают это как?

 

У нас были жалобы на "режим NAT3 при игре по сети на PS4".

Суть в том, что два клиента за NAT могут установить P2P-соединение в случае, когда у них Asymmetric NAT - для этого используется промежуточный сервер в интернете (что-то типа STUN-сервера), но трафик при этом ходит напрямую между клиентами. Для PS4 такой режим называется "NAT2".

Но если один из клиентов работает через Restricted NAT, то к нему никто не сможет подключиться по описанной выше схеме.

 

Похожая ситуация и с torrent. Если вам через Asymmetric NAT удалось подключиться к клиенту с Public IP, и этот клиент сообщил о вас дргим пирам, то эти пиры смогут подключиться к вам на тот же NAT_IP:NAT_Port, который вы используете для подключения к клиенту с Public IP. При Restricted NAT так не получится.

 

То есть обе ситуации не фатальны сами по себе, но в случае Asymmetric NAT это создает меньше проблем для клиентов.

Share this post


Link to post
Share on other sites

1 минуту назад, Huko сказал:

У кого нибудь получилось собрать модуль под Debian 10 ?

У меня.

 

Скрытый текст

root@nat-1:~# cat /etc/debian_version
10.3
root@nat-1:~# lsmod | grep nat
xt_nat                 16384  2

 

Share this post


Link to post
Share on other sites

Spoiler

# uname -a
Linux nat 4.19.0-8-amd64 #1 SMP Debian 4.19.98-1 (2020-01-26) x86_64 GNU/Linux


# make
make -C /lib/modules/4.19.0-8-amd64/build/ M=/usr/local/src/xt_NAT modules CONFIG_DEBUG_INFO=y                                                                                   
make[1]: Entering directory '/usr/src/linux-headers-4.19.0-8-amd64'
  CC [M]  /usr/local/src/xt_NAT/xt_NAT.o
/usr/local/src/xt_NAT/xt_NAT.c: In function ‘stat_seq_show’:
/usr/local/src/xt_NAT/xt_NAT.c:1547:43: warning: format ‘%ld’ expects argument of type ‘long int’, but argument 3 has type ‘s64’ {aka ‘long long int’} [-Wformat=]               
     seq_printf(m, "Active NAT sessions: %ld\n", atomic64_read(&sessions_active));
                                         ~~^     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                                         %lld
/usr/local/src/xt_NAT/xt_NAT.c:1548:42: warning: format ‘%ld’ expects argument of type ‘long int’, but argument 3 has type ‘s64’ {aka ‘long long int’} [-Wformat=]               
     seq_printf(m, "Tried NAT sessions: %ld\n", atomic64_read(&sessions_tried));
                                        ~~^     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                                        %lld
/usr/local/src/xt_NAT/xt_NAT.c:1549:44: warning: format ‘%ld’ expects argument of type ‘long int’, but argument 3 has type ‘s64’ {aka ‘long long int’} [-Wformat=]               
     seq_printf(m, "Created NAT sessions: %ld\n", atomic64_read(&sessions_created));
                                          ~~^     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                                          %lld
/usr/local/src/xt_NAT/xt_NAT.c:1550:41: warning: format ‘%ld’ expects argument of type ‘long int’, but argument 3 has type ‘s64’ {aka ‘long long int’} [-Wformat=]               
     seq_printf(m, "DNAT dropped pkts: %ld\n", atomic64_read(&dnat_dropped));
                                       ~~^     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                                       %lld
/usr/local/src/xt_NAT/xt_NAT.c:1551:39: warning: format ‘%ld’ expects argument of type ‘long int’, but argument 3 has type ‘s64’ {aka ‘long long int’} [-Wformat=]               
     seq_printf(m, "Fragmented pkts: %ld\n", atomic64_read(&frags));
                                     ~~^     ~~~~~~~~~~~~~~~~~~~~~
                                     %lld
/usr/local/src/xt_NAT/xt_NAT.c:1552:41: warning: format ‘%ld’ expects argument of type ‘long int’, but argument 3 has type ‘s64’ {aka ‘long long int’} [-Wformat=]               
     seq_printf(m, "Related ICMP pkts: %ld\n", atomic64_read(&related_icmp));
                                       ~~^     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                                       %lld
/usr/local/src/xt_NAT/xt_NAT.c:1553:36: warning: format ‘%ld’ expects argument of type ‘long int’, but argument 3 has type ‘s64’ {aka ‘long long int’} [-Wformat=]               
     seq_printf(m, "Active Users: %ld\n", atomic64_read(&users_active));
                                  ~~^     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                                  %lld
/usr/local/src/xt_NAT/xt_NAT.c: In function ‘nat_tg_init’:
/usr/local/src/xt_NAT/xt_NAT.c:1664:5: error: implicit declaration of function ‘setup_timer’; did you mean ‘sk_stop_timer’? [-Werror=implicit-function-declaration]              
     setup_timer( &sessions_cleanup_timer, sessions_cleanup_timer_callback, 0 );
     ^~~~~~~~~~~
     sk_stop_timer
cc1: some warnings being treated as errors
make[4]: *** [/usr/src/linux-headers-4.19.0-8-common/scripts/Makefile.build:315: /usr/local/src/xt_NAT/xt_NAT.o] Error 1                                                         
make[3]: *** [/usr/src/linux-headers-4.19.0-8-common/Makefile:1537: _module_/usr/local/src/xt_NAT] Error 2                                                                       
make[2]: *** [Makefile:146: sub-make] Error 2
make[1]: *** [Makefile:8: all] Error 2
make[1]: Leaving directory '/usr/src/linux-headers-4.19.0-8-amd64'
make: *** [Makefile:11: xt_NAT.ko] Error 2

 

ld поменять на lld ума хватило, но дальше уже не осилил.

 

У вас все по дефолту собралось, т.е. без изменений модуля ?

 

Share this post


Link to post
Share on other sites

2 минуты назад, Huko сказал:
  Показать содержимое


# uname -a
Linux nat 4.19.0-8-amd64 #1 SMP Debian 4.19.98-1 (2020-01-26) x86_64 GNU/Linux


# make
make -C /lib/modules/4.19.0-8-amd64/build/ M=/usr/local/src/xt_NAT modules CONFIG_DEBUG_INFO=y                                                                                   
make[1]: Entering directory '/usr/src/linux-headers-4.19.0-8-amd64'
  CC [M]  /usr/local/src/xt_NAT/xt_NAT.o
/usr/local/src/xt_NAT/xt_NAT.c: In function ‘stat_seq_show’:
/usr/local/src/xt_NAT/xt_NAT.c:1547:43: warning: format ‘%ld’ expects argument of type ‘long int’, but argument 3 has type ‘s64’ {aka ‘long long int’} [-Wformat=]               
     seq_printf(m, "Active NAT sessions: %ld\n", atomic64_read(&sessions_active));
                                         ~~^     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                                         %lld
/usr/local/src/xt_NAT/xt_NAT.c:1548:42: warning: format ‘%ld’ expects argument of type ‘long int’, but argument 3 has type ‘s64’ {aka ‘long long int’} [-Wformat=]               
     seq_printf(m, "Tried NAT sessions: %ld\n", atomic64_read(&sessions_tried));
                                        ~~^     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                                        %lld
/usr/local/src/xt_NAT/xt_NAT.c:1549:44: warning: format ‘%ld’ expects argument of type ‘long int’, but argument 3 has type ‘s64’ {aka ‘long long int’} [-Wformat=]               
     seq_printf(m, "Created NAT sessions: %ld\n", atomic64_read(&sessions_created));
                                          ~~^     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                                          %lld
/usr/local/src/xt_NAT/xt_NAT.c:1550:41: warning: format ‘%ld’ expects argument of type ‘long int’, but argument 3 has type ‘s64’ {aka ‘long long int’} [-Wformat=]               
     seq_printf(m, "DNAT dropped pkts: %ld\n", atomic64_read(&dnat_dropped));
                                       ~~^     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                                       %lld
/usr/local/src/xt_NAT/xt_NAT.c:1551:39: warning: format ‘%ld’ expects argument of type ‘long int’, but argument 3 has type ‘s64’ {aka ‘long long int’} [-Wformat=]               
     seq_printf(m, "Fragmented pkts: %ld\n", atomic64_read(&frags));
                                     ~~^     ~~~~~~~~~~~~~~~~~~~~~
                                     %lld
/usr/local/src/xt_NAT/xt_NAT.c:1552:41: warning: format ‘%ld’ expects argument of type ‘long int’, but argument 3 has type ‘s64’ {aka ‘long long int’} [-Wformat=]               
     seq_printf(m, "Related ICMP pkts: %ld\n", atomic64_read(&related_icmp));
                                       ~~^     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                                       %lld
/usr/local/src/xt_NAT/xt_NAT.c:1553:36: warning: format ‘%ld’ expects argument of type ‘long int’, but argument 3 has type ‘s64’ {aka ‘long long int’} [-Wformat=]               
     seq_printf(m, "Active Users: %ld\n", atomic64_read(&users_active));
                                  ~~^     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                                  %lld
/usr/local/src/xt_NAT/xt_NAT.c: In function ‘nat_tg_init’:
/usr/local/src/xt_NAT/xt_NAT.c:1664:5: error: implicit declaration of function ‘setup_timer’; did you mean ‘sk_stop_timer’? [-Werror=implicit-function-declaration]              
     setup_timer( &sessions_cleanup_timer, sessions_cleanup_timer_callback, 0 );
     ^~~~~~~~~~~
     sk_stop_timer
cc1: some warnings being treated as errors
make[4]: *** [/usr/src/linux-headers-4.19.0-8-common/scripts/Makefile.build:315: /usr/local/src/xt_NAT/xt_NAT.o] Error 1                                                         
make[3]: *** [/usr/src/linux-headers-4.19.0-8-common/Makefile:1537: _module_/usr/local/src/xt_NAT] Error 2                                                                       
make[2]: *** [Makefile:146: sub-make] Error 2
make[1]: *** [Makefile:8: all] Error 2
make[1]: Leaving directory '/usr/src/linux-headers-4.19.0-8-amd64'
make: *** [Makefile:11: xt_NAT.ko] Error 2

 

ld поменять на lld ума хватило, но дальше уже не осилил.

 

У вас все по дефолту собралось, т.е. без изменений модуля ?

 

Разумеется с изменениями. Вам помочь или вы просто интересуетесь у кого как дела? :)

Share this post


Link to post
Share on other sites

Просто думал, может я что не так делаю :)

Если не трудно - поделитесь вашими наработками, т.к. личных скиллов знания gcc не хватает.

Share this post


Link to post
Share on other sites

8 минут назад, Huko сказал:

Просто думал, может я что не так делаю :)

Если не трудно - поделитесь вашими наработками, т.к. личных скиллов знания gcc не хватает.

Автору прислали пул реквест, но он его не заапрувил. Вот он - https://github.com/andrsharaev/xt_NAT/pull/2

Нужно выполнить изменения, которые в нем указаны и всё соберётся.

Share this post


Link to post
Share on other sites

1 час назад, zhenya` сказал:

Зачем натить в6?

Например, переключение между брокерами. К примеру, у netassist случится сбой, можно переключить на he.

Share this post


Link to post
Share on other sites

7 часов назад, ne-vlezay80 сказал:

Этот модуль не умеет IPv6. Не нужно.

Вы не понимаете даже, что он делает. Не нужен тут этот комментарий, т.к. ничего кроме глупости автора он не показывает.

Ваши кейсы каких-то брокеров вообще к ipv6 имеют очень отдаленное отношение, как и ipv6 к проблематике решаемой данным модулем.

Share this post


Link to post
Share on other sites

34 минуты назад, vurd сказал:

Вы не понимаете даже, что он делает. Не нужен тут этот комментарий, т.к. ничего кроме глупости автора он не показывает.

Ваши кейсы каких-то брокеров вообще к ipv6 имеют очень отдаленное отношение, как и ipv6 к проблематике решаемой данным модулем.

Он меняет адрес источника в исходящем от клиента пакете и во входящем адрес назначения.
Что касается брокеров, то иногда это единственный способ получить ipv6. Особенно на VPS.
Про их глюки, можешь тут тему просмотреть. Там у netassist накрылся один из роутеров, в результате чего корректно не работал ipv6. Пришлось мне тогда переключаться на hurricane electric.
Конечно, у брокеров есть BGP, но чтобы его использовать, нужна своя AS и подсеть.Которую физикам получить достаточно проблематично. И могут возникнуть проблемы с чиновниками.

Share this post


Link to post
Share on other sites

Ну вот, теперь придется выкинуть RFC6296
:)

 

Может все же не так все плохо?

 

ip6tables -t mangle -I POSTROUTING -s fd00::/64 -o vboxnet0 -j SNPT --src-pfx fd00::/64 --dst-pfx 2001:e20:2000:40f::/64 
ip6tables -t mangle -I PREROUTING -i wlan0 -d 2001:e20:2000:40f::/64 -j DNPT --src-pfx 2001:e20:2000:40f::/64 --dst-pfx fd00::/64 

Ну и

 

sysctl -w net.ipv6.conf.all.proxy_ndp=1

 

Share this post


Link to post
Share on other sites

приветствую всех. не подскажите, как данный проект нам подзаточить под аутсорминг?

 

например: есть абонент с серым адресом, на которого мы делаем snat с одного белого ip. мы так делаем потому что так нам удобнее.

 

хотелось бы потестировать данное решение и посмотреть на производительность.

Share this post


Link to post
Share on other sites

On 3/6/2020 at 11:35 AM, vurd said:

Разумеется с изменениями. Вам помочь или вы просто интересуетесь у кого как дела? :)

Можете подсказать как собрать?

xt_NAT-master # make
make -C /lib/modules/4.19.0-0.bpo.6-amd64/build/ M=/home/user/xt_NAT-master modules CONFIG_DEBUG_INFO=y
make[1]: Entering directory '/usr/src/linux-headers-4.19.0-0.bpo.6-amd64'
  CC [M]  /home/user/xt_NAT-master/xt_NAT.o
/home/user/xt_NAT-master/xt_NAT.c: In function ‘nat_tg_init’:
/home/user/xt_NAT-master/xt_NAT.c:1690:5: error: implicit declaration of function ‘setup_timer’ [-Werror=implicit-function-declaration]
     setup_timer( &sessions_cleanup_timer, sessions_cleanup_timer_callback, 0 );
     ^~~~~~~~~~~
cc1: some warnings being treated as errors
/usr/src/linux-headers-4.19.0-0.bpo.6-common/scripts/Makefile.build:314: recipe for target '/home/user/xt_NAT-master/xt_NAT.o' failed
make[4]: *** [/home/user/xt_NAT-master/xt_NAT.o] Error 1
/usr/src/linux-headers-4.19.0-0.bpo.6-common/Makefile:1534: recipe for target '_module_/home/user/xt_NAT-master' failed
make[3]: *** [_module_/home/user/xt_NAT-master] Error 2
Makefile:146: recipe for target 'sub-make' failed
make[2]: *** [sub-make] Error 2
Makefile:8: recipe for target 'all' failed
make[1]: *** [all] Error 2
make[1]: Leaving directory '/usr/src/linux-headers-4.19.0-0.bpo.6-amd64'
Makefile:11: recipe for target 'xt_NAT.ko' failed
make: *** [xt_NAT.ko] Error 2

Эти исправления добавил https://github.com/andrsharaev/xt_NAT/pull/2/commits/834e2441fca0d1cdcf15ad29ebde3fc9b44ca523 https://github.com/andrsharaev/xt_NAT/pull/2/commits/44ada338854b3ab558afb0934dd1c84eb227a220
Linux host 4.19.0-0.bpo.6-amd64 #1 SMP Debian 4.19.67-2+deb10u2~bpo9+1 (2019-11-12) x86_64 GNU/Linux

 

 

И я же правильно понимаю, что этот модуль позволяет делать SNAT\DNAT без conntrack? У меня асимметричный роутинг и трафик может влетать через один сервер и на нём натится, а вылетать через другой и нужно чтобы он там обратно разначивался

Edited by Iluffka

Share this post


Link to post
Share on other sites

9 часов назад, Iluffka сказал:

И я же правильно понимаю, что этот модуль позволяет делать SNAT\DNAT без conntrack?

Без таблицы стейтов делать можно, но продумайте как пакеты в обратном направлении должны идти.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.