Явное указание исходящего IP в Squid

02.11.2009 23:38 / Артём Волк / 1496 просмотров / ...

Коллега обратился с просьбой — в рамках реализуемого им проекта была необходимость осуществлять HTTP-запросы с помощью curl из PHP-скриптов используя разные исходящие IP (отличная возможность для парсера :)). Скрипты исполнялись на VDS'е, на виртуальном сетевом интерфейсе которого было зарегистрированно несколько IP-адресов.

Первое, что выяснилось: без применения прокси-сервера это реализовать нельзя, выбор исходящего интерфейса осуществляется на уровне операционной системы. Для решения проблемы было решено использовать прокси-сервер Squid. Оригинал решения был случайно найден в кеше поисковика на странице чьего-то заброшенного блога. Вместо <ip1>, <ip2> и <ip3> нужно подставить IP-адреса.

Фрагмент конфигурационного файла Squid'a:

# Порт, на котором будет работать прокси-сервер
http_port 81

# ACL'и для IP
acl ip1 myip <ip1>
acl ip2 myip <ip2>
acl ip3 myip <ip3>

# Указываем какой IP использовать для какого ACL
tcp_outgoing_address <ip1> ip1
tcp_outgoing_address <ip2> ip2
tcp_outgoing_address <ip3> ip3

# Выключаем кеширование
cache deny all

# ВНИМАНИЕ! Нужно не забыть настроить ограничение доступа к прокси-серверу
http_access allow all

# Полностью выключаем кеширование
cache_dir null /tmp

# Выключаем лишние заголовки
header_access Via deny all
forwarded_for off

В результате, если прописать в качестве адреса прокси сервера <ip1>:81, запросы будут уходить с <ip1>, если использовать <ip2>:81, то исходящим будет <ip2> и т.д.

Обновление: У библиотеки CURL обнаружилась интересная опция, которая, возможно, сделает ненужной использование прокси-сервера:

CURLOPT_INTERFACE

The name of the outgoing network interface to use. This can be an interface name, an IP address or a host name.

Обновление от 26.04.2010: Ещё один интересный способ указания исходящего IP.