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

Linux NAT

Наверное тема ближе гуру linux, создали мы значит сеть ipoe и встал вопрос о NAT, тут или варварское расходование IP пространства или тот самый NAT

В принципе все ничего работает да и ладно, но есть одно, очень большая часть активной молодой аудитории просят белый IP, решаем пока VPN PPtP.

Есть вариант с общим большим VLAN, но тоже как-то городить костыли. Ну вот собственно вопрос, реально ли на Linux поднять схему NAT, где трансляция будет происходить просто сопоставлением адресов.

Ну тоесть 1 IP серый сопоставлять с 1 IP белым.

Есть еще вариант на будущее, наравне с серыми адресами выдавать еще и ipv6 адреса, но... я думаю, дело это долгое будет

 

P.S. Кстати никто не в курсе, почему в GOS поддержки ipv6 нет

Edited by stelsik

Share this post


Link to post
Share on other sites

NETMAP target

Share this post


Link to post
Share on other sites

и?

проще попробую изложить мысли, надо /8 сократить до /20 причем с сопоставлением 1 в 1

Share this post


Link to post
Share on other sites
Ищите ядро и iptables где есть "Full Cone NAT".

Говорят оно есть в природе.

Но никто не видел )

Share this post


Link to post
Share on other sites

Ivan Rostovikov, зачем что-то искать? Если речь идет про 1-to-1 NAT то все решается созданием двух правил - DNAT в PREROUTING-е (трафик к клиенту) и SNAT в POSTROUTING-е (трафик от клиента). Ядро Linux это не IOS, где нужно подбирать нужную версию. :)

 

Share this post


Link to post
Share on other sites

>созданием двух правил

Мне это не помогло. iptables все равно распределял адреса - "как бог на душу положит".

И не факт, что найденная Вами правильная версия iptables соберется на имеющемся ядре. По этому и ядро приходится менять.

Share this post


Link to post
Share on other sites

Ivan Rostovikov, зачем что-то искать? Если речь идет про 1-to-1 NAT то все решается созданием двух правил - DNAT в PREROUTING-е (трафик к клиенту) и SNAT в POSTROUTING-е (трафик от клиента).

А с NOTRACK это будет работать? Раз уж iproute nat устаревший.

Share this post


Link to post
Share on other sites

И не факт, что найденная Вами правильная версия iptables соберется на имеющемся ядре.

А зачем что-то искать и собирать? Могу поспорить на что угодно, что на любом дистрибутиве это заработает сразу. Нужно создать всего два правила.

Share this post


Link to post
Share on other sites
Ищите ядро и iptables где есть "Full Cone NAT".

Говорят оно есть в природе.

Но никто не видел )

binats = {
        '10.40.0.0/16' : '10.206.0.0/16',
        '10.41.0.0/16' : '10.126.0.0/16',
        '10.42.0.0/16' : '10.127.0.0/16',

        '10.43.0.0/17' : '10.128.0.0/17',
        '10.43.170.0/24' : '10.128.170.0/24',

        '10.44.0.0/17' : '10.129.0.0/17',
        '10.44.172.0/24' : '10.129.172.0/24',

        '10.45.0.0/16' : '10.130.0.0/16',

        '10.46.0.0/16' : '10.48.0.0/16',

        '10.47.0.0/17' : '10.128.128.0/17',

        '10.82.0.0/16' : '10.202.0.0/16',
        '10.83.0.0/16' : '10.203.0.0/16',
        '10.84.0.0/16' : '10.204.0.0/16',
        '10.85.0.0/16' : '10.229.0.0/16',

        '10.86.0.0/17' : '10.248.128.0/17',
        '10.87.0.0/17' : '10.129.128.0/17',
}

header = (
        'tc qdisc add dev eth1 ingress',
        'tc qdisc add dev eth1 root handle 1: prio'
)

priority = 10
flowid = 1

def make_rule (internal, external, pr, fl):
        print "tc filter add dev eth1 parent 1: protocol ip prio %d \\" % pr
        print "    u32 match ip src %s flowid 1:%d action nat \\" % (internal, fl)
        print "    egress %s %s" % (internal, external[:-3])

        print "tc filter add dev eth1 parent ffff: protocol ip prio %d \\" % (pr + 1)
        print "    u32 match ip dst %s flowid 1:%d action nat \\" % (external, (fl + 1))
        print "    ingress %s %s\n" % (external, internal[:-3])

for c in header:
        print c

print

for i in binats.keys():
        our_net = i
        binat = binats[i]
        make_rule (our_net, binat, priority, flowid)
        priority = priority + 2 
        flowid = flowid + 2

Share this post


Link to post
Share on other sites

И сколько таких правил надо для 1000 абонентов например?

Share this post


Link to post
Share on other sites

SokolovS, очевидно, что 2000 правил. Вопросы масштабируемости я сейчас не рассматриваю. Но если нужно действительно много правил, то отсылаю сюда: http://nfws.inl.fr/nfws_userday/Jesper-Bro...es-rulesets.pdf

 

cmhungry, как в такой схеме работает активный FTP?

 

Share this post


Link to post
Share on other sites

А с NOTRACK это будет работать? Раз уж iproute nat устаревший.

Не будет конечно. NAT средствами отличными от Netfilter-а я бы делать не стал. Хотя бы причине отсутствия в них helper-ов для "хитрых" протоколов.

Share this post


Link to post
Share on other sites

Сейчас вот на одном таком NAT+шейп, 3к клиентов. В тепличных условиях, и ручками можно прописать, что и куда натить, весь вопрос в нормальном решении

Ищите ядро и iptables где есть "Full Cone NAT".

Говорят оно есть в природе.

А разве -j SAME не оно самое? просто как надо это не работет
Edited by stelsik

Share this post


Link to post
Share on other sites
А разве -j SAME не оно самое?

same (-j SNAT --persistent в новых ядрах) не то. Вам же нужно выдавать один и тот же адрес, а same будет выдавать как попало после перегрузки компа. Тоже не понятно есть или нет аналог same для dnat. Даже если оно и есть, то непонятно как сделать соответствие 1 и того же адреса в snat и dnat.

 

Имхо, нужно делать как говорил Умник, по 2 правила на пользователя. Что-бы нормально работало под нагрузкой можно скриптами расписать все по разным цепочкам. Например, через ipset в -t nat POSTROUTING отправлять первые 100 клиентов, которым нужен чесный адрес, в отдельную цепочку 1ClientSnat, в этой цепочке уже 100 правил ната для первых 100 клиентов, далее 2ClientSnat для следующих 100 и т.д. То же самое для dnat-а в -t nat PREROUTING - 1ClientDnat, 2ClientDnat ...

 

В итоге получим для каждого пакета добавится только по +50-70 проверок (в среднем). Должно нормально работать под нагрузкой.

Edited by a_andry

Share this post


Link to post
Share on other sites
А разве -j SAME не оно самое?

same (-j SNAT --persistent в новых ядрах) не то. Вам же нужно выдавать один и тот же адрес, а same будет выдавать как попало после перегрузки компа. Тоже не понятно есть или нет аналог same для dnat. Даже если оно и есть, то непонятно как сделать соответствие 1 и того же адреса в snat и dnat.

 

Имхо, нужно делать как говорил Умник, по 2 правила на пользователя. Что-бы нормально работало под нагрузкой можно скриптами расписать все по разным цепочкам. Например, через ipset в -t nat POSTROUTING отправлять первые 100 клиентов, которым нужен чесный адрес, в отдельную цепочку 1ClientSnat, в этой цепочке уже 100 правил ната для первых 100 клиентов, далее 2ClientSnat для следующих 100 и т.д. То же самое для dnat-а в -t nat PREROUTING - 1ClientDnat, 2ClientDnat ...

 

В итоге получим для каждого пакета добавится только по +50-70 проверок (в среднем). Должно нормально работать под нагрузкой.

Умник говорил о гораздо меньшем количестве. Посмотрите, как lISG генерирует.

Share this post


Link to post
Share on other sites

cmhungry, как в такой схеме работает активный FTP?

не знаю, не пробовал =)

Share this post


Link to post
Share on other sites

Используем обе схемы: отдельный VLAN для публичников и Static NAT 1:1 на шлюзе.

Обе имеют свои достоинства и недостатки.

 

Единственное препятствие, с которым пришлось столкнуться, когда NAT работал на FreeBSD+pf:

BiNAT затыкался, если исходящий NAT делался на одном сервере, а входящий на другом(bgp).

Не спас даже pfSync.

 

cmhungry, как в такой схеме работает активный FTP?
не знаю, не пробовал =)

Умные люди пишут, что хреново работает - http://dslnet.ru/showthread.php?t=71150

Share this post


Link to post
Share on other sites
cmhungry, как в такой схеме работает активный FTP?
не знаю, не пробовал =)

Умные люди пишут, что хреново работает - http://dslnet.ru/showthread.php?t=71150

Это?
кстати, бимап весьма неудобен на практике, особенно при настройке FTP сервера
Маловато сведений из такой фразы можно вынести... А вопрос нужный и важный.

Share this post


Link to post
Share on other sites

Тоесть чтобы сделать BiNAT, надо попробовать заскриптовать ipset iphash

Что-то не совсем мысли понял, как iphash натить, при этом добиваться совпадения 1 в 1

Share this post


Link to post
Share on other sites
Единственное препятствие, с которым пришлось столкнуться, когда NAT работал на FreeBSD+pf:

BiNAT затыкался, если исходящий NAT делался на одном сервере, а входящий на другом(bgp).

Не спас даже pfSync.

Затыкался под большой нагрузкой, или вообще не завелось?

Share this post


Link to post
Share on other sites
Единственное препятствие, с которым пришлось столкнуться, когда NAT работал на FreeBSD+pf: BiNAT затыкался, если исходящий NAT делался на одном сервере, а входящий на другом(bgp).

Не спас даже pfSync.

Затыкался под большой нагрузкой, или вообще не завелось?

Под любой.

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

Если сервер один - тогда всё нормально.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this