Перенаправление http запросов на разные IP (squid)
Перенаправление http запросов на разные IP (squid)
Добрый день!
Имеется сервер с Ubuntu 20.04, у сервера 3 белых IP. На сервере запущен сервис, отправляющий http запросы на определённый сайт, условно "example.com".
Задача: перенаправлять http разные запросы от сервиса на "example.com" от разных IP нашего сервера в зависимости от настроенных правил. В качестве прокси-сервера выбран Squid (хотя это не принципиально).
Пробовал настроить опцию tcp_outgoing_address, но так и не понял, как нужно (и можно ли вообще) это сделать.
В опциях своих http запросов (на стороне сервиса) я могу указать дополнительно :username, :proxyhost и :proxyport. Задумка в том, чтобы Squid делал перераспределение в зависимости от содержимого этих опций.
Прошу подсказать, можно ли так сделать, и, если да, то на что обратить внимание, с чего начать? Уже несколько дней не получается разобраться...
Имеется сервер с Ubuntu 20.04, у сервера 3 белых IP. На сервере запущен сервис, отправляющий http запросы на определённый сайт, условно "example.com".
Задача: перенаправлять http разные запросы от сервиса на "example.com" от разных IP нашего сервера в зависимости от настроенных правил. В качестве прокси-сервера выбран Squid (хотя это не принципиально).
Пробовал настроить опцию tcp_outgoing_address, но так и не понял, как нужно (и можно ли вообще) это сделать.
В опциях своих http запросов (на стороне сервиса) я могу указать дополнительно :username, :proxyhost и :proxyport. Задумка в том, чтобы Squid делал перераспределение в зависимости от содержимого этих опций.
Прошу подсказать, можно ли так сделать, и, если да, то на что обратить внимание, с чего начать? Уже несколько дней не получается разобраться...
- Алексей Максимов
- Администратор сайта
- Сообщения: 572
- Зарегистрирован: 14 сен 2012 06:50
- Откуда: г.Сыктывкар
- Контактная информация:
Re: Перенаправление http запросов на разные IP (squid)
Здравствуйте, x-nikolas.
Не до конца понимаю смысла задачи. Если "сервис" на то же сервере, что и белые IP, то при чём тут squid ?
Не до конца понимаю смысла задачи. Если "сервис" на то же сервере, что и белые IP, то при чём тут squid ?
Re: Перенаправление http запросов на разные IP (squid)
Смысл задачи в том, что сайт, на который обращается сервис, отвечает быстро только на первый запрос (с данного IP), после чего включает таймер, и все последующие запросы ожидают ответа по 3 секунды, что недопустимо долго. А задумка в том, чтобы Squid перенаправлял запросы сервиса на разные IP нашего сервера, по очереди. А сервер, на который мы обращаемся, будет видеть запросы от разных IP и будет отвечать без задержек.Алексей Максимов писал(а): ↑01 апр 2021 10:13 Не до конца понимаю смысла задачи. Если "сервис" на то же сервере, что и белые IP, то при чём тут squid ?
То, что я мог не верно выбрать инструмент (Squid) - это очень вероятно. В этом и есть мой вопрос: если выбрал верно - то как настроить? А если не верно - может кто-то сориентирует, что нужно применить вместо squid?
- Алексей Максимов
- Администратор сайта
- Сообщения: 572
- Зарегистрирован: 14 сен 2012 06:50
- Откуда: г.Сыктывкар
- Контактная информация:
Re: Перенаправление http запросов на разные IP (squid)
А эти три белых IP - это разные подсети/провайдеры или это IP из одной подсети и адрес шлюза провайдерского везде один и тот же?
Re: Перенаправление http запросов на разные IP (squid)
Привожу содержимое etc/network/interfaces для двух IP:Алексей Максимов писал(а): ↑01 апр 2021 11:19 А эти три белых IP - это разные подсети/провайдеры или это IP из одной подсети и адрес шлюза провайдерского везде один и тот же?
(xxx.yyy.zzz - соответственно везде одинаковые)
auto eth0
iface eth0 inet static
address xxx.yyy.zzz.73
netmask 255.255.255.0
broadcast xxx.yyy.zzz.255
network xxx.yyy.zzz.0
gateway xxx.yyy.zzz.1
auto eth0:1
iface eth0:1 inet static
address xxx.yyy.zzz.191
netmask 255.255.255.0
broadcast xxx.yyy.zzz.255
network xxx.yyy.zzz.0
post-up ip route add xxx.yyy.zzz.0/24 dev eth0:1 src xxx.yyy.zzz.191 table eth0:1_if
post-up ip route add default via xxx.yyy.zzz.1 table eth0:1_if
post-up ip rule add from xxx.yyy.zzz.191 table eth0:1_if
post-down ip rule del from xxx.yyy.zzz.191 table eth0:1_if
Re: Перенаправление http запросов на разные IP (squid)
если есть возможность запускать утилиту под разными пользователями, то добавьте правила для разных пользователей использовать разную таблицу маршрутизации
ip rule add uidrange 1001-1001 table eth0:1_if
ip rule add uidrange 1002-1002 table eth0:2_if
поддержка uidrange появилась в ядрах 4.10
ip rule add uidrange 1001-1001 table eth0:1_if
ip rule add uidrange 1002-1002 table eth0:2_if
поддержка uidrange появилась в ядрах 4.10
- Алексей Максимов
- Администратор сайта
- Сообщения: 572
- Зарегистрирован: 14 сен 2012 06:50
- Откуда: г.Сыктывкар
- Контактная информация:
Re: Перенаправление http запросов на разные IP (squid)
Ещё можно попробовать так (перенаправляем запросы на разные IP в зависимости от имени пользователя, который аутентифицировался в squid):
Код: Выделить всё
acl login1 proxy_auth username1
acl login2 proxy_auth username2
acl login3 proxy_auth username3
...
tcp_outgoing_address xxx.yyy.zzz.101 login1
tcp_outgoing_address xxx.yyy.zzz.102 login2
tcp_outgoing_address xxx.yyy.zzz.102 login3
Re: Перенаправление http запросов на разные IP (squid)
Всем спасибо! Буду пробовать.
Re: Перенаправление http запросов на разные IP (squid)
Свою задачу я в итоге решил при помощи Squid. Может кому пригодится:
# Чтобы не попасть в списки бесплатных прокси, разрешаем http_access только с localhost:
http_access allow localhost
http_access deny all
# Squid по умолчанию слушает порт 3128. Добавляем к нему ещё один (данный пример для двух белых IP):
http_port 3128
http_port 3129
# Создаём два списка контроля доступа с номерами портов в качестве элементов:
acl req1 myport 3128
acl req2 myport 3129
# Перенаправляем с каждого порта на разный IP.
tcp_outgoing_address xxx.yyy.zzz.nnn req1
tcp_outgoing_address xxx.yyy.zzz.mmm req2
Для описанных выше целей решение рабочее.
Хотелось, конечно, организовать работу через один порт 3128 и перенаправлять запросы по имени пользователя и паролю, что сходу что-то не вышло. Делал примерно так:
auth_param basic program /usr/lib/squid/basic_ncsa_auth /etc/squid/passwd
auth_param basic children 5
auth_param basic realm Squid proxy-caching web server
auth_param basic credentialsttl 2 hours
(задал два юзера и два пароля)
acl login1 proxy_auth user1
acl login2 proxy_auth user2
tcp_outgoing_address xxx.yyy.zzz.nnn login1
tcp_outgoing_address xxx.yyy.zzz.mmm login1
В итоге - просто любые запросы проходили насквозь. И с паролем, и без пароля...
# Чтобы не попасть в списки бесплатных прокси, разрешаем http_access только с localhost:
http_access allow localhost
http_access deny all
# Squid по умолчанию слушает порт 3128. Добавляем к нему ещё один (данный пример для двух белых IP):
http_port 3128
http_port 3129
# Создаём два списка контроля доступа с номерами портов в качестве элементов:
acl req1 myport 3128
acl req2 myport 3129
# Перенаправляем с каждого порта на разный IP.
tcp_outgoing_address xxx.yyy.zzz.nnn req1
tcp_outgoing_address xxx.yyy.zzz.mmm req2
Для описанных выше целей решение рабочее.
Хотелось, конечно, организовать работу через один порт 3128 и перенаправлять запросы по имени пользователя и паролю, что сходу что-то не вышло. Делал примерно так:
auth_param basic program /usr/lib/squid/basic_ncsa_auth /etc/squid/passwd
auth_param basic children 5
auth_param basic realm Squid proxy-caching web server
auth_param basic credentialsttl 2 hours
(задал два юзера и два пароля)
acl login1 proxy_auth user1
acl login2 proxy_auth user2
tcp_outgoing_address xxx.yyy.zzz.nnn login1
tcp_outgoing_address xxx.yyy.zzz.mmm login1
В итоге - просто любые запросы проходили насквозь. И с паролем, и без пароля...
- Алексей Максимов
- Администратор сайта
- Сообщения: 572
- Зарегистрирован: 14 сен 2012 06:50
- Откуда: г.Сыктывкар
- Контактная информация:
Re: Перенаправление http запросов на разные IP (squid)
Запросы без аутентификации проходили по той причине, что не описаны правила http_access.
Сначала нужно объявить обязательную аутентификацию для нужного нам ACL с помощью proxy_auth REQUIRED, а затем с помощью правил http_access разрешить только прошедших аутентификацию.
Первый же пример из документации по аутентификации в squid это наглядно демонстрирует:
Сначала нужно объявить обязательную аутентификацию для нужного нам ACL с помощью proxy_auth REQUIRED, а затем с помощью правил http_access разрешить только прошедших аутентификацию.
Первый же пример из документации по аутентификации в squid это наглядно демонстрирует:
Код: Выделить всё
acl foo proxy_auth REQUIRED
http_access allow foo
http_access deny all