Стоит задача настроить http proxy с рандомной выдачей IPv6 адресов каждому пользователю. Использовать будем 3proxy
Шаг 1. Подготавливаем сервер и обновляем ядро:
1 2 3 4 |
apt-get update apt-get install gcc++ git make screen mc |
После установки debian jessie8 установится с 3-м ядром, в котором нет требуемой опции bind().
Обновление ядра требуется для установки net.ipv6.ip_nonlocal_bind = 1 которую мы сделаем на следующем шаге.
Эта опция доступна начиная с ядра 4.3
Добавим бэкпорты в репозиторий
1 2 3 |
echo "deb http://mirror.yandex.ru/debian/ jessie-backports main non-free contrib" >> /etc/apt/sources.list |
И выполним команду
1 2 3 |
apt-get update |
Найдем требуемое ядро.
1 2 3 |
aptitude -t jessie-backports search linux-image |
Обновление ядра для IPv6 прокси
Установим 4.5 ядро
1 2 3 |
apt-get install linux-image-4.5.0-0.bpo.1-amd64 -y |
Перезагрузим сервер
1 2 3 |
reboot |
После перезагрузки проверяем, что ядро обновилось
1 2 3 |
uname -a |
Проверка версии ядра для настройки прокси IPv6
Шаг 2. Скачиваем и компилируем последнюю версию ndppd
ndppd это NDP Proxy Daemon. Более подробно об этом протоколе можно почитать в этой статье или же на странице ndppd
1 2 3 4 5 |
git clone https://github.com/DanielAdolfsson/ndppd.git cd ndppd make all && make install |
Создаем конфигурационный файл в любимом текстовом редакторе, например mcedt:
1 2 3 |
nano /root/ndppd/ndppd.conf |
Конфигурация
1 2 3 4 5 6 7 8 9 10 11 |
route-ttl 30000 proxy eth0 { router no timeout 500 ttl 30000 rule 2a08:14c0:100:200::/64 { static } } |
Запускаем:
1 2 3 |
ndppd -d -c /root/ndppd/ndppd.conf |
Шаг 3. На следующем этапе скачиваем и устанавливаем 3proxy
1 2 3 4 5 6 |
cd ~ git clone https://github.com/z3APA3A/3proxy.git cd 3proxy/ make -f Makefile.Linux |
Шаг 4. Создаем файл ip.list с нужным количеством ipv6 адресов сгенерированных в случайном порядке.
Для этого скачиваем скрипт генерации файла ip.list
Для сети с маской /48
1 2 3 |
wget http://blog.vpsville.ru/uploads/random-ipv6_48-address-generator.sh |
Для сети с маской /64
1 2 3 |
wget http://blog.vpsville.ru/uploads/random-ipv6_64-address-generator.sh |
В скрипте устанавливаем:
Количество ipv6 адресов которые нужно сгенерировать:
MAXCOUNT=1000
Префикс нашей сети
network=2a07:14c0:0:8006
Устанавливаем права на выполнение
1 2 3 |
chmod +x random-ipv6_64-address-generator.sh |
Генерируем список ipv6 адресов в файл ip.list
1 2 3 |
./random-ipv6_64-address-generator.sh > ip.list |
Шаг 5. Создаем конфигурационный файл 3proxy с помощью скрипта генерации конфигурационного файла 3proxy.
Прокси с одним пользователем и разные ipv6 адреса каждый на своем порте. Начиная с порта 30000 для каждого адреса из ip.list будет установлен свой порт.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
#!/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
1 2 3 4 5 |
chmod +x 3proxy.sh ./3proxy.sh > 3proxy.cfg /root/3proxy/src/3proxy /root/3proxy.cfg |
Шаг 8.Изменения в конфигурацию ядра, файл /etc/sysctl.conf
1 2 3 4 5 6 7 |
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 |
Применить изменения
1 2 3 |
sysctl -p |
Шаг 9. Настройка сети
Добавить адрес на eth0
ip -6 addr add 2a08:14c0:100:200::2/64 dev eth0
Добавить маршрут по умолчанию на etho
1 2 3 |
ip -6 route add default via 2a08:14c0:100:200::1 |
И прикрепить нашу сеть к lo
1 2 3 |
ip -6 route add local 2a08:14c0:100:200::/64 dev lo |
Все, прокси работает. Для проверки можно в браузере настроить работу с прокси
Адреса 185.118.66.204:30001-31000
Шаг 10. Добавление в автозагрузку
Файл /etc/rc.local приведите к виду
1 2 3 4 5 6 7 |
/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.cfg |
Узнать DUID
1 2 3 4 5 6 7 8 9 |
cd /usr/local/bin wget -q http://www.ipv6.mtu.edu/wide_mkduid.pl chmod 755 wide_mkduid.pl cd /var/lib/dhcpv6 wide_mkduid.pl -m `ifconfig eth0 |grep HWaddr |awk '{print $5}'` successfully created /var/lib/dhcpv6/dhcp6c_duid DUID is 00:03:00:06:08:00:27:0c:5f:2b |
Тестирование IPv6
How to configure the DHCPv6 client
We will use dhclient.
You’ll need to edit the following file /etc/dhcp/dhclient6.conf :
1 2 3 4 5 |
interface "eth0" { send dhcp6.client-id DUID; } |
You will have to adapt the interface name (eth0) and the DUID, available in your console.
Start your DHCPv6 client at boot
Once the client is configured, you’ll need to create a new SystemD service.
Create the following file, adapting the interface name (eth0) and the DUID /etc/systemd/system/dhclient.service:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
[Unit] Description=dhclient for sending DUID IPv6 Wants=network.target Before=network.target [Service] Type=forking ExecStart=/usr/sbin/dhclient -cf /etc/dhcp/dhclient6.conf -6 -P -v eth0 [Install] WantedBy=multi-user.target |
Then, enable it for every reboot: systemctl enable dhclient.service.
Configure the Network on Ubuntu 16 & Debian 8
The following commands have to be used as root or with sudo
Start by editing /etc/network/interfaces as follow:
1 2 3 4 5 |
iface eno1 inet6 static address IPV6ADDRESS netmask PREFIXLEN |
You’ll need to replace eno1 with the proper interface name.
With Debian & old versions of Ubuntu, it’s usually eth0.
Alternate configuration without SystemD
If you don’t use SystemD to start your services, you can configure your /etc/network/interfaces as follow:
1 2 3 4 5 6 7 |
iface eno1 inet6 static pre-up modprobe ipv6 pre-up dhclient -cf /etc/dhcp/dhclient6.conf -6 -P -d -v $IFACE address IPV6ADDRESS netmask PREFIXLEN |
Still adapting your interface name (eno1) to your needs, as well as the IPv6 address and the Netmask.
Configure the Network on CentOS 7
The following commands have to be used as root or with sudo
After configuring your dhclient and SystemD, you’ll need to edit /etc/sysconfig/network-scripts/ifcfg-eth0:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
# Generated by parse-kickstart UUID=xxxxx DNS1=62.210.16.6 BOOTPROTO=none DEVICE=eth0 ONBOOT=yes TYPE=Ethernet IPADDR=62.210.xx.xx PREFIX=24 GATEWAY=62.210.xx.1 DEFROUTE=yes IPV4_FAILURE_FATAL=no IPV6INIT=yes IPV6ADDR="IPV6ADDRESS/PREFIXLEN" IPV6_AUTOCONF=yes NAME="System eth0" |
Once done with the configuration, you can reboot your server to check that the service & the configuration are correctly applied at the boot!
You will need to allow in your firewall 546/UDP Incoming & 547/UDP Outgoing.
Test your configuration
Launch the dhclient with the following command:
1 2 3 |
dhclient -cf /etc/dhcp/dhclient6.conf -6 -P -v eth0 |
To check your IPv6 connectivity, you can use the PING command:
ping6 ipv6.google.com
Debug
If the configuration is not working for you, check your interface name with the following command:
1 2 3 |
ifconfig -a |
The examples are given for eth0/eno1, if your main interface have a different name, you’ll need to modify it in all of your configurations files.
Traffic limitation of your client
In certain cases, some DHCPv6 clients may unfortunately sends several requests per second (especially dchp6c).
This triggers blocking of your servers network port by our automatic protection, as it will be seen as a source of an UDP flood.
To avoid this problem, we invite you to limit the traffic sent from your dhclient6 directly in your firewall configuration.
Following an example for IPTABLES :
1 2 3 4 |
ip6tables -A OUTPUT -p udp --dport 547 -m limit --limit 10/min --limit-burst 5 -j ACCEPT ip6tables -A OUTPUT -p udp --dport 547 -j DROP |
In Rescue mode
To test the IPv6 on your server in rescue mode, reboot the server in rescue mode with the “Ubuntu 14 — Trusty” mode. The dhclient is already available on it.
Create the file which will contain your DUID with the help of the above documentation. You can find your DUID in your console.
1 2 3 |
nano /etc/dhcp/dhclient6.conf |
First, add the IPv6 address to your network interface:
/sbin/ifconfig <interface> inet6 add IPV6ADDRESS/PREFIXLENGH
After, start the dhclient:
1 2 3 |
dhclient -cf /etc/dhcp/dhclient6.conf -6 -P -v <interface> |
1 2 3 |
ping6 ipv6.google.com |