Настройка IPv6 прокси на базе ndppd+3proxy в Debian

Стоит задача настроить http proxy с рандомной выдачей IPv6 адресов каждому пользователю.

Шаг 1. Подготавливаем сервер и обновляем ядро:

apt-get update

 

apt-get install gcc++ git make screen mc wget


После установки debian jessie8 установится с 3-м ядром, в котором нет требуемой опции bind(). 
Обновление ядра требуется для установки net.ipv6.ip_nonlocal_bind = 1 которую мы сделаем на следующем шаге.
Эта опция доступна начиная с ядра 4.3

Добавим бэкпорты в репозиторий

echo "deb http://ftp.debian.org/debian jessie-backports main" >> /etc/apt/sources.list

И выполним команду

apt-get update

Установим требуемое ядро. 

apt-get -t jessie-backports --yes --force-yes install linux-image-amd64

Перезагрузим сервер

reboot

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

uname -a

Проверка версии ядра для настройки прокси IPv6

Шаг 2. Скачиваем ndppd
ndppd это NDP Proxy Daemon. Более подробно об этом протоколе можно почитать в этой статье или же на странице ndppd

cd ~
git clone https://anonscm.debian.org/cgit/collab-maint/ndppd.git
cd ~/ndppd
make all && make install

Создаем конфигурационный файл в любимом текстовом редакторе, например mcedt:

nano /root/ndppd/ndppd.conf

Конфигурация

route-ttl 30000
proxy eth0 {
   router no
   timeout 500  
   ttl 30000
   rule 2a08:14c0:100:200::/64 {
      static
   }
}

Запускаем:

ndppd -d -c /root/ndppd/ndppd.conf

Шаг 3. На следующем этапе скачиваем и устанавливаем 3proxy

cd ~
git clone https://github.com/z3APA3A/3proxy.git
cd 3proxy/
make -f Makefile.Linux

Шаг 4. Создаем файл ip.list с нужным количеством ipv6 адресов сгенерированных в случайном порядке.

Для этого скачиваем скрипт генерации файла ip.list

Для сети с маской /48

wget http://blog.vpsville.ru/uploads/random-ipv6_48-address-generator.sh

Для сети с маской /64

wget http://blog.vpsville.ru/uploads/random-ipv6_64-address-generator.sh

В скрипте устанавливаем:
Количество ipv6 адресов которые нужно сгенерировать:

MAXCOUNT=1000

Префикс нашей сети

network=2a08:14c0:100:200

Устанавливаем права на выполнение

chmod +x random-ipv6_64-address-generator.sh

Генерируем список ipv6 адресов в файл ip.list

./random-ipv6_64-address-generator.sh > ip.list

Шаг 5. Создаем конфигурационный файл 3proxy.sh с помощью скрипта генерации конфигурационного файла 3proxy.

Прокси с одним пользователем и разные ipv6 адреса каждый на своем порте. Начиная с порта 30000 для каждого адреса из ip.list будет установлен свой порт.

Создаём конфигурационный файл

mcedit 3proxy.sh 

Вставляем в открывшийся редактор приведенный ниже скрипт и меняем ipv4 адрес на адрес Вашего сервера.
Вставка из буфера осуществляется комбинацией shift+insert

#!/bin/bash
echo daemon
echo maxconn 100
echo nscache 65536
echo timeouts 1 5 30 60 180 1800 15 60
echo setgid 65535
echo setuid 65535
echo flush
echo auth strong
echo users admin:CL:pass
echo allow admin
port=30000
count=1
for i in `cat ip.list`; do
    echo "proxy -6 -n -a -p$port -i185.118.66.204 -e$i"
    ((port+=1))
    ((count+=1))
    if [ $count -eq 10001 ]; then
        exit
    fi
done

Сохраняем конфигурационный файл и запускаем 3proxy

chmod +x 3proxy.sh
./3proxy.sh > 3proxy.cfg
/root/3proxy/src/3proxy /root/3proxy/3proxy.cfg

Шаг 6.Изменения в конфигурацию ядра, файл /etc/sysctl.conf
Откроем файл /etc/sysctl.conf

mcedit /etc/sysctl.conf

Добавим строки в самый конец файла

net.ipv6.conf.eth0.proxy_ndp=1
net.ipv6.conf.all.proxy_ndp=1
net.ipv6.conf.default.forwarding=1
net.ipv6.conf.all.forwarding=1
net.ipv6.ip_nonlocal_bind = 1

Сохраняем, закрываем файл.

Применить изменения

sysctl -p

Шаг 7. Настройка сети

Добавить адрес на eth0

ip -6 addr add 2a08:14c0:100:200::2/64 dev eth0

Добавить маршрут по умолчанию на etho


ip -6 route add default via 2a08:14c0:100:200::1

И прикрепить нашу сеть к lo

ip -6 route add local 2a08:14c0:100:200::/64 dev lo

Все, прокси работает. Для проверки можно в браузере настроить работу с прокси
Адреса 185.118.66.204:30001-31000

Шаг 8. Добавление в автозагрузку
Файл /etc/rc.local приведите к виду


#!/bin/bash
ulimit -n 600000
ulimit -u 600000
/sbin/ip -6 addr add 2a08:14c0:100:200::2/64 dev eth0
/sbin/ip -6 route add default via 2a08:14c0:100:200::1
/sbin/ip -6 route add local 2a08:14c0:100:200::/64 dev lo
/root/ndppd/ndppd -d -c /root/ndppd/ndppd.conf
/root/3proxy/src/3proxy /root/3proxy/3proxy.cfg
exit 0

Дополнительно. Шаг 9. Тюнинг ядра
Если вы планируете запускать большое число потоков, обязательно ознакомьтесь с инструкцией по тонкой настройке ядра. Потребуется сервер с большим объемом памяти для запуска большого числа потоков из-за встроенных ограничений в ядро и модификация параметров vm.max_map_count и kernel.pid_max