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

Assymetric NAT на Linux

Добрый день.

Столкнулся с проблемой прохождения трафика P2P - торренты и сетевые игры на PS4/XBOX плохо работали из-за симметричного режима NAT при приализации NAT на базе Linux Iptables.

Для решения данной проблемы я написал отдельный модуль с функциональностью CGN для Linux, который показал заметно бОльшую производительность по сравнению со стандартным NAT в Linux (и это явно из-за урезанной функциональности моего модуля).

Хотя модуль и поддерживает только самые необходимые фичи, но он успешно проработал более 2 лет для >100k абонентов, пока не был вытеснен аппаратными решениями :)

 

Возможно это решение будет интересно тем, кто все еще использует NAT на базе Linux Iptables.

 

Предупреждение:

1. Качество кода не очень высокое, так как программирование на C - не моя специализация

2. Дальнейшая поддержка не планируется

 

P.S. Отдельное спасибо автору модулей ipt_NETFLOW и ipt_ratelimit - много идей и примеров было взято оттуда.

 

Ссылка на проект.

Share this post


Link to post
Share on other sites

Это шикарно. Теперь есть все компоненты для постройки браса на линухах ipt_netflow, ipt_ratelimit и вот ipt_cgnat, которого не хватало. Автору респект за раскрытие

Share this post


Link to post
Share on other sites

28 минут назад, pppoetest сказал:

Как разбираетесь с клиентами которым позарез нужен пптп?

Тоже , в свое время, стояли Эриксоны в качестве NAT box... За время их эксплуатации, а это года 4-ре, заявок на то, что вот такой протокол не работает через ваш NAT, было 5-6, не больше. Клиентам дали белые адреса и закрыли проблему. Сеть не очень большая ~20K клиентов. Сейчас перешли на CG-NAT на СКАТ. Пока не было ни одной заявки с жалобами на NAT.

Share this post


Link to post
Share on other sites

18 часов назад, vurd сказал:

Это шикарно. Теперь есть все компоненты для постройки браса на линухах ipt_netflow, ipt_ratelimit и вот ipt_cgnat, которого не хватало. Автору респект за раскрытие

А если бы еще всё это запихать в красивую обертку как у vyatta/vyos... Я бы купил.

Share this post


Link to post
Share on other sites

On 7/16/2019 at 6:11 AM, pppoetest said:

No ALGs for FTP/SIP/PPTP are implemented

Что интересно - особой необходимости в данном функционале в моем случае так и не возникло.

FTP работает в пассивном режиме, PPTP (TCP1723+GRE) тоже проходит через NAT. Проблемы с GRE могут быть в случае, когда несколько клиентов на одном внешнем IP используют GRE.

SIP не проверял.

Share this post


Link to post
Share on other sites

3 hours ago, uzd said:

особой необходимости в данном функционале в моем случае так и не возникло

ну ето и дело. 

Давай! Действуьи.

Share this post


Link to post
Share on other sites

я смотрю все такие спецы по GRE.

подскажите почему у у меня на современном debian  не натится gre.

ну то есть стоит  правило в iptables

 

iptables -t nat -I PREROUTING -s <src_ip>  -d <gw_ip>   -j NETMAP --to-address <internal_ip>

 

раньше всегда работало.  сейчас для всех типов трафика работает, для gre нет.

alg загружал-выгружал, sysctl дергал , по колесу стучал

 

Share this post


Link to post
Share on other sites

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

подскажите почему у у меня на современном debian  не натится gre.

modprobe ip_nat_pptp

Share this post


Link to post
Share on other sites

5 минут назад, jffulcrum сказал:

Аплинк у себя прикрыл?

мы сами себе аплинк.

это считайте разновидность хитрого fallover железок без дополнительного дублирования волокон.

в tcpdump все видно. но не форвардится и счетчики iptables тоже не увеличивает.

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

теперь, спустя год, забыл как.

там еще что-то возможно завязанное на net.netfilter.nf_conntrack_helper   и.т.п.

в общем точный рецепт я забыл

 

gre ходит не натуральный, фактически это IPOE микротиковский по 47 протоколу.

но везде работает с обычными pptp/gre хелперами.

 

 

Share this post


Link to post
Share on other sites

@LostSoul echo 1 > /proc/sys/net/netfilter/nf_conntrack_helper ?

 

https://home.regit.org/netfilter-en/secure-use-of-helpers/

Edited by ShumBor

Share this post


Link to post
Share on other sites

13 минут назад, ShumBor сказал:

 echo 1 > /proc/sys/net/netfilter/nf_conntrack_helper ?

ну написал же сообщением выше, что не помогает.

ни без хелперов с выкл и вкл,  ни с хелперами с выкл и вкл, ни в разных сочетаниях типа ip_nat_gre грузим, а ip_nat_pptp нет.

 

Share this post


Link to post
Share on other sites

40 минут назад, ShumBor сказал:

echo 1 > /proc/sys/net/netfilter/nf_conntrack_helper ?

неа, ему извне во внутрь. Но он не понимает как оно работает, ведь на микротике клац-клац по роликам с ютуба и работает, а тут роликов на ютубе нету :)

1 час назад, LostSoul сказал:

мы сами себе аплинк.

На микротиках? :))

 

PS. А зачем любителю некротиков вдруг понадобился линукс с NAT? Ставь себе свой любимый некрик и радуйся :)

Edited by TriKS

Share this post


Link to post
Share on other sites

16 hours ago, LostSoul said:

мы сами себе аплинк.

это считайте разновидность хитрого fallover железок без дополнительного дублирования волокон.

в tcpdump все видно. но не форвардится и счетчики iptables тоже не увеличивает.

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

теперь, спустя год, забыл как.

там еще что-то возможно завязанное на net.netfilter.nf_conntrack_helper   и.т.п.

в общем точный рецепт я забыл

 

gre ходит не натуральный, фактически это IPOE микротиковский по 47 протоколу.

но везде работает с обычными pptp/gre хелперами.

 

 

Можете пожалуйста показать conntrack для такой gre сессии и вывод lsmod?

Share this post


Link to post
Share on other sites

1 час назад, SABRE сказал:

Можете пожалуйста показать conntrack для такой gre сессии и вывод lsmod?

указанного соединения в conntrack просто не появляется.

счетчики соответствующих правил iptables не срабатывают.

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

 

список модулей ( не относящееся к сетевой подсистеме убрал для сокращения обьёма )

Цитата

 

Module                  Size  Used by
nf_nat_pptp            16384  0
nf_nat_proto_gre       16384  1 nf_nat_pptp
nf_conntrack_pptp      20480  1 nf_nat_pptp
nf_conntrack_proto_gre    16384  1 nf_conntrack_pptp
ip_tunnel              24576  0
nf_conntrack_netlink    40960  0
xt_conntrack           16384  1
ipt_MASQUERADE         16384  1
nf_nat_masquerade_ipv4    16384  1 ipt_MASQUERADE
xt_NETMAP              16384  6
xt_addrtype            16384  2
iptable_nat            16384  1
nf_conntrack_ipv4      16384  9
nf_defrag_ipv4         16384  1 nf_conntrack_ipv4
nf_nat_ipv4            16384  1 iptable_nat
nf_nat                 32768  5 nf_nat_masquerade_ipv4,nf_nat_ipv4,nf_nat_pptp,xt_NETMAP,nf_nat_proto_gre
nf_conntrack          131072  11 xt_conntrack,nf_nat_masquerade_ipv4,nf_conntrack_ipv4,nf_nat,nf_conntrack_pptp,ipt_MASQUERADE,nf_nat_ipv4,nf_nat_pptp,xt_NETMAP,nf_conntrack_netlink,nf_conntrack_proto_gre
libcrc32c              16384  2 nf_conntrack,nf_nat
iptable_raw            16384  0
tcp_diag               16384  0
inet_diag              24576  1 tcp_diag
ip_set                 40960  0
ip6table_filter        16384  0
ip6_tables             28672  1 ip6table_filter
iptable_filter         16384  1
nfnetlink_log          20480  1
nfnetlink              16384  4 nf_conntrack_netlink,ip_set,nfnetlink_log
vhost_net              24576  1
vhost                  45056  1 vhost_net
tap                    24576  1 vhost_net
iscsi_tcp              20480  0
libiscsi_tcp           20480  1 iscsi_tcp
ip_tables              28672  3 iptable_filter,iptable_raw,iptable_nat
x_tables               40960  9 ip6table_filter,xt_conntrack,iptable_filter,ipt_MASQUERADE,xt_addrtype,xt_NETMAP,ip6_tables,iptable_raw,ip_tables
e1000e                249856  0
ptp                    20480  1 e1000e
pps_core               20480  1 ptp

 

 

 

 

 

1 час назад, SABRE сказал:

Можете пожалуйста показать conntrack для такой gre сессии и вывод lsmod? 

или вы хотели вывод с других систем, где все работает?

 

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

1 hour ago, LostSoul said:

указанного соединения в conntrack просто не появляется.

счетчики соответствующих правил iptables не срабатывают.

Тогда и модули не интересно) Можете создать тестовое правило в raw с селектором такого типа пакетов, попадают ли они вообще туда? Если да, смотрим дальше iptables, нет - tcpdump и ingress фильтры

Share this post


Link to post
Share on other sites

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

Тогда и модули не интересно) Можете создать тестовое правило в raw с селектором такого типа пакетов, попадают ли они вообще туда? Если да, смотрим дальше iptables, нет - tcpdump и ingress фильтры

 

 

 

 

вот таким правилом ( raw )  пакеты proto=47  в лог падают, счетчики правила срабатывают
 

Цитата


iptables -t raw -s <src_ip>  -j LOG

 

 

 

вот такими двумя правилами счетчики не тикают,  в лог ничего не падает

 

Цитата

 

 iptables -t nat -I INPUT -s <src_ip> -j LOG

 iptables -t nat -I PREROUTING -s <src_ip> -j LOG


 

 

ситуация специфична для debian начиная с какого-то обновления

 

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.