Явное указание исходящего IP в Squid
Коллега обратился с просьбой — в рамках реализуемого им проекта была необходимость осуществлять 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.
