Надо реализовать следующую схему:
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)