LINUX.ORG.RU

Множество ipv6 адресов на одном интерфейсе

 , , ,


1

3

Надо реализовать следующую схему:


client(addr4_client) <-> proxy(addr4_proxy:port, addr6_proxy) <-> some_remote_host(remote_addr6)

«Выходной» адрес на проксе addr6_proxy зависит от входящего порта, например:

  • Клиент коннектится на 192.168.1.1:1000, исходящее соединение к хосту уходит с ipv6_0
  • Клиент коннектится на 192.168.1.1:1001, исходящее соединение к хосту уходит с ipv6_1
  • Ну и так далее

Первое, что приходит в голову - это навесить на интерфейс кучу ipv6 адресов и перед коннектом делать на сокет bind() на соответствующий адрес (в зависимости от входящего порта). Что меня пугает, это то, что портов (и, соответственно, ipv6 адресов может быть 10000 и более), а, судя по гуглению в интернетах, рекомендуемые значения для net.ipv6.conf.all.max_addresses это 16, 32 и 64, по дефолту почти везде стоит 16. Это, видимо, связано с тем, как хранятся эти адреса в кишках ядра (насколько я знаю, там хэш-таблица, но деталей не знаю, вполне возможно, что для большого количества адресов там поиск вырождается в линейную сложность).

Собственно вопросы:

  • Возникнут ли проблемы при описанном подходе (навешивании тысяч адресов на один интерфейс)? И какие это могут быть проблемы (производительность?) ?
  • Какие есть альтернативные подходы к решению данной задачи (маппинг: входящие ipv4:port <-> исходящие ipv6)
☆☆☆☆☆

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

Harald ★★★★★
()

А что мешает просто взять и потестить всё это?

Deleted
()
Ответ на: комментарий от anonymous

Они никак не хотели, собственно реализацию надо придумать мне. Вот мне почему-то кажется, что то, что написано в посте - это отстойная реализация, вопрос в том, как сделать лучше.

DELIRIUM ☆☆☆☆☆
() автор топика
Ответ на: комментарий от DELIRIUM

ну, если требование о жесткой уникальной связи dst-port -> src_ipv6 — внешнее, то от навешивания кучи адресов на интерфейс никак не уйдешь, иначе просто ответ обратно не дойдет

можно, конечно, интерфейс загнать в промиск (работать от рута) и реализовать весь стек протоколов у себя в программе :)

anonymous
()
Ответ на: комментарий от true_admin

А какие именно подробности нужны?

  • Поступает TCP соединение на ipv4:port0 на hostname
  • Сервер открывает исходящее соединение от имени ipv6_map[port0] на hostname
  • Данные проксируются ipv4:port0<->установленное_соединение_ipv6

Всё происходит в юзерспейсе. Каждому ipv4:portN соответствует свой ipv6N.

DELIRIUM ☆☆☆☆☆
() автор топика
Ответ на: комментарий от DELIRIUM

давно бы уже написал скрипт, который навешивает 64К адресов на один интерфейс, и проверил :)

anonymous
()
Ответ на: комментарий от true_admin

Там на входе ещё socks5 авторизация, но к проблеме это не относится. Зачем нужен - вопрос к заказчику, меня он не касается, задача: замапить кучу портов ipv4 на адреса ipv6.

DELIRIUM ☆☆☆☆☆
() автор топика
Ответ на: комментарий от DELIRIUM

Не, ничего не придумал. Я пытался что-то изобразить с anyip, iptables и NAT, но пока то что предложил Harald самое разумное.

Хотя, я твоего подхода тоже не понимаю. Ты бы попробовал поговорить с заказчиком. Очень часто бывают люди придумают НЁХ для тривиальной задачи и потом страдают с реализацией. Вполне возможно что клиенту вообще нужно не это. В результате, ты ему сделаешь, а у заказчика не заработает то что он хотел.

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

true_admin ★★★★★
()
Ответ на: комментарий от true_admin

В задаче сразу стоит условие, что портов пару десятков тысяч и адресов активных пару десятков тысяч, причём адреса меняются раз в N секунд (всего адресов 2^80).

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

DELIRIUM ☆☆☆☆☆
() автор топика
Последнее исправление: DELIRIUM (всего исправлений: 1)
Ответ на: комментарий от DELIRIUM

Ну так как соединение закончится, так сразу и убирай этот адрес с интерфейса

а, судя по гуглению в интернетах, рекомендуемые значения для net.ipv6.conf.all.max_addresses это 16, 32 и 64, по дефолту почти везде стоит 16

чтобы этот лимит не превысить. И будет у тебя количество одновременных исходящих соединений с этого интерфейса ограничено net.ipv6.conf.all.max_addresses

По идее можно ещё несколько интерфейсов сделать в виде алиасов и на каждый по несколько IPv6 цеплять.

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

Harald ★★★★★
()

Кстати говоря, в опенстеке с нейтроном floating ip реализован почти так. Neutron-l3-agent создаёт отдельный сетевой неймспейс, в котором два интерфейса:

  • qr-*, который смотрит в локалку для виртуалок и
  • qg-*, который смотрит во внешнюю сеть и на котором висит 100500 IP-адресов.

Но там пакеты летают не через юзерспейс, а полностью в ядре (iptables SNAT + DNAT).

Так что как минимум навешивание кучи адресов на один интерфейс используется в суровом продакшене без проблем. ИМХО и с биндом на все эти адреса проблем возникнуть не должно.

Deleted
()

В мире IPv6 интерфейсу присваивается не один адрес, а целая сеть из огромного количества адресов (/64, например). Назначать в качестве исходящего адреса любой произвольный адрес из этой сети вроде бы возможно без всяких извращений.

Sorcerer ★★★★★
()

то ли ночь, то ли ещё чего...

а вот адрес «remote_addr6» означенный клиент (addr4_client) как задаёт ?

к проксе он коннектиться по ipv4, выставляя её адрес как получателя. В зависимости от порта куда он кинулся вы подменяете/выставляете ipv6 отправителя для следующего плеча. А конечный адресат-то, он что один и тот-же всё время??

MKuznetsov ★★★★★
()
Ответ на: комментарий от MKuznetsov

Не, я на схеме не указал, это socks5, то есть адрес удалённого хоста задаётся как часть socks5 запроса.

DELIRIUM ☆☆☆☆☆
() автор топика
Ответ на: комментарий от xpahos

В NAT64 инициатором запроса всегда является ipv6 сторона же, у меня клиентами являются как раз ipv4. Или можно nat64 настроить в reverse режиме?

DELIRIUM ☆☆☆☆☆
() автор топика

16 это для всяческих игорь, так что тут более в железо весь воп упёрся..

anonymous
()

Есть подозрение что клиент хочет обойти проблему 64К клиентских соединений .... Тоесть когда ваш софт одновременно будет проксировать порядка 64К сессий по каждому порту (а то и более). Тут без кучи IP никак не обойдешся ...

zaz ★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.