Прокси сервер с привязкой исходящего соединения к IP-адресу входящего соединения.

     Еще один узелок на память.

     Задача. Есть пул IP адресов на удаленном сервере, необходимо настроить прокси-сервер так что бы запрос уходил с того IP на который он поступил.

Мне известны три варианта - tinyproxy, 3proxy и squid.

      В tinyproxy это реализуется всего одним параметром BindSame. Просто раскомментируем строку "BindSame yes" в конфигурационном файле tinyproxy.conf и рестартуем сам tinyproxy.  Этот параметр свяжет исходящее соединение с IP-адресом входящего соединения. 
      Однако этот вариант мне не подошел. При использовании 800 IP и таком же количестве запросов в секунду производительность tinyproxy оставляет желать лучшего.

     3proxy. Здесь все просто - в конфиге прописываем
    
    proxy -n -a -pPORT -iIIP -eOIP, где PORT - входящий порт, IIP - входящий адрес, а OIP - исходящий адрес

      Рассмотрим вариант с squid. Реализация немного сложней:
Добавляем свои правила в конфигурационный файл squid.conf - 
после строки "# INSERT YOUR OWN RULE(S) HERE TO ALLOW ACCESS FROM YOUR CLIENTS" добавляем 
include /etc/squid3/myip.conf
Содержимое myip.conf :

#Перечисляем IP и сети которым разрешен доступ 
acl inner_network src  10.0.0.1
...
acl inner_network src 10.1.0.0/24

#Привязка входящего IP к исходящему
acl ip1 myip 10.5.0.1                
tcp_outgoing_address 10.5.0.1 ip1
...
acl ip100 myip 10.5.0.100
tcp_outgoing_address 10.5.0.100 ip100

И небольшой скрипт который поможет создать файл myip.conf:

#!/bin/bash
#файл со списком IP-адресов, каждый адрес с новой строки
filename=all-ip.txt
declare -a a
a=( `cat "$filename" | tr '\n' ' '`)        
for ((i=1; i<=${#a[*]}; i++)); do           
printf 'acl ip'$i' myip '${a[$i]}'\n' >> myip.conf 
printf 'tcp_outgoing_address '${a[$i]}' ip'$i'\n' >>myip.conf
done

После тестирования производительности я остался удовлетворен результатом.