Прокси-сервер — это серверное приложения, которое функционирует как шлюз между конечным пользователем и интернет-ресурсом. Через прокси-сервер конечный пользователь может контролировать и отслеживать свой веб-трафик для самых разных целей, включая конфиденциальность, безопасность и кэширование. Например, прокси-сервер можно использовать для выполнения веб-запросов с другого IP-адреса. Также он поможет вам понять, как обслуживается сеть в разных юрисдикциях, или обойти некоторые методы отслеживания или регулирования веб-трафика.
Squid — это популярный HTTP-прокси с открытым исходным кодом. В этом руководстве вы научитесь устанавливать и настраивать Squid на удаленный сервер.
Требования
Для выполнения этого руководства вам потребуется:
- Настроенный удаленный сервер, а также пользователь с привилегиями sudo. Мы используем Ubuntu 20.04, но подойдет и другой дистрибутив Linux.
- В этом руководстве мы используем условный домен your_domain, который вы должны заменить своим собственным доменом или IP-адресом.
1: Установка прокси-сервера Squid
Помимо маршрутизации исходящего трафика отдельного пользователя, у Squid есть много вариантов применения. В контексте крупномасштабных развертываний его можно использовать в качестве механизма распределенного кэширования, балансировщика нагрузки или другого компонента стека маршрутизации. Однако многие методы горизонтального масштабирования серверного трафика, которые обычно включали бы прокси-сервер, отошли на второй план – их место заняли платформы контейнеризации, такие как Kubernetes. В то же время использование прокси-серверов для перенаправления веб-запросов отдельного пользователя становится все более популярным средством защиты конфиденциальности. Об этом следует помнить при работе с открытыми прокси-серверами, которые могут обслуживать десятки функций с более низким приоритетом. Варианты использования прокси со временем изменились, но фундаментальная технология осталась прежней.
Начнем со следующих команд (они обновят списки пакетов и установят Squid Proxy):
sudo apt update
sudo apt install squid
Squid автоматически настроит сервис и запустится после установки. Вы можете проверить работу сервиса с помощью команды:
systemctl status squid.service
Вы получите:
squid.service - Squid Web Proxy Server Loaded: loaded (/lib/systemd/system/squid.service; enabled; vendor preset: enabled) Active: active (running) since Wed 2021-12-15 21:45:15 UTC; 2min 11s ago
По умолчанию Squid не позволяет клиентам вне пределов этого сервера подключаться к нему. Чтобы включить эту возможность, вам нужно внести некоторые изменения в его конфигурации – этот файл хранится в /etc/squid/squid.conf. Откройте его в nano или в другом текстовом редакторе:
sudo nano /etc/squid/squid.conf
Имейте в виду, конфигурационный файл Squid по умолчанию очень, очень длинный и содержит огромное количество опций, которые были закомментированы (то есть временно отключены с помощью символа # в начале строки). Скорее всего, вам нужно будет выполнить поиск по файлу и найти строки, которые нужно отредактировать. Чтобы сделать это в nano, нажмите Ctrl+W, введите поисковый запрос, нажмите Enter, а затем нажмите Alt+W несколько раз (это позволяет перемещаться между результатами поиска, если это необходимо).
Найдите строку http_access deny all. Вы должны увидеть блок текста, объясняющий правила доступа Squid по умолчанию:
. . . # # INSERT YOUR OWN RULE(S) HERE TO ALLOW ACCESS FROM YOUR CLIENTS # include /etc/squid/conf.d/* # Example rule allowing access from your local networks. # Adapt localnet in the ACL section to list your (internal) IP networks # from where browsing should be allowed #http_access allow localnet http_access allow localhost # And finally deny all other access to this proxy http_access deny all . . .
Из этого вы можете понять текущее поведение сервера — localhost разрешен, а другие подключения нет. Обратите внимание, эти правила обрабатываются последовательно, поэтому рекомендуется оставить правило deny all в конце этого блока конфигурации. Вы можете изменить это правило на allow all, если хотите разрешить всем подключаться к вашему прокси-серверу (вероятно, вы не захотите этого делать). Вместо этого перед http_access allow localhost лучше добавить строку, которая включает ваш собственный IP-адрес:
# # INSERT YOUR OWN RULE(S) HERE TO ALLOW ACCESS FROM YOUR CLIENTS # include /etc/squid/conf.d/* # Example rule allowing access from your local networks. acl localnet src your_ip_address # Adapt localnet in the ACL section to list your (internal) IP networks # from where browsing should be allowed #http_access allow localnet http_access allow localhost
Рассмотрим ее подробнее:
- acl – это сокращение Access Control List, общий термин для политик разрешений.
- localnet в данном случае — это имя вашего списка ACL.
- src — это место, откуда должен исходить запрос из этого ACL, то есть ваш IP-адрес.
Если вы не знаете свой локальный IP-адрес, проще всего обратиться к сайту What’s my IP, который подскажет вам, откуда вы к нему обращались. После внесения этого изменения сохраните и закройте файл. Если вы используете nano, нажмите Ctrl+X, а затем Y и Enter.
На этом этапе вы можете перезапустить сервер Squid и подключиться к нему, но сначала рекомендуем получше защитить его.
2: Защита прокси-сервера Squid
Большинство прокси-серверов и клиентских приложений, которые подключаются к прокси-серверам (например, веб-браузеры), поддерживают несколько методов аутентификации. Они могут использовать общие ключи или отдельные серверы аутентификации, но чаще всего применяются обычные учетные данные (имя пользователя и пароль). Squid позволяет создавать пары логин-пароль, используя встроенную функцию Linux. Этот дополнительный шаг ограничит доступ к вашему прокси по IP-адресу. Для этого нужно создать файл /etc/squid/passwords и указать в нем конфигурацию Squid.
Во-первых, установите некоторые утилиты из проекта Apache, чтобы иметь доступ к генератору паролей, который нравится серверу Squid.
sudo apt install apache2-utils
Этот пакет предоставляет команду htpasswd, которую вы можете использовать для создания пароля нового пользователя Squid. Имена пользователей Squid никоим образом не будут пересекаться с именами системных пользователей, поэтому вы можете использовать то же имя, что и у вашего системного пользователя. Вам также будет предложено добавить пароль.
sudo htpasswd -c /etc/squid/passwords your_squid_username
Эта команда сохранит имя пользователя вместе с хэшем в файле /etc/squid/passwords, который будет использоваться Squid в качестве источника аутентификации. После этого вы можете просмотреть файл, чтобы узнать, как он выглядит:
sudo cat /etc/squid/passwords
Вы получите такой вывод:
8host:$apr1$Dgl.Mtnd$vdqLYjBGdtoWA47w4q1Td.
Убедившись, что имя пользователя и пароль сохранены, вы можете обновить конфигурацию Squid, чтобы сервер мог использовать новый файл /etc/squid/passwords. С помощью nano или другого текстового редактора снова откройте файл конфигурации Squid:
sudo nano /etc/squid/squid.conf
Добавьте следующие выделенные строки:
… # # INSERT YOUR OWN RULE(S) HERE TO ALLOW ACCESS FROM YOUR CLIENTS # include /etc/squid/conf.d/* auth_param basic program /usr/lib/squid3/basic_ncsa_auth /etc/squid/passwords auth_param basic realm proxy acl authenticated proxy_auth REQUIRED # Example rule allowing access from your local networks. acl localnet src your_ip_address # Adapt localnet in the ACL section to list your (internal) IP networks # from where browsing should be allowed #http_access allow localnet http_access allow localhost http_access allow authenticated # And finally deny all other access to this proxy http_access deny all
Через эти дополнительные директивы Squid проверит новый файл паролей на наличие хэшей, которые можно проанализировать с помощью механизма basic_ncsa_auth, и потребует аутентификацию для доступа к вашему прокси. Читайте документацию Squid для получения дополнительной информации об этом или других методах аутентификации. После этого перезапустите Squid, процедура может занять некоторое время.
sudo systemctl restart squid.service
И не забудьте открыть порт 3128 в брандмауэре, если вы используете ufw:
sudo ufw allow 3128
3: Подключение через Squid
Чтобы продемонстрировать работу сервера Squid, мы будем использовать программу командной строки под названием curl – она часто используется для выполнения различных типов веб-запросов. В общем, если вы хотите проверить, сработает ли данное соединение в браузере, всегда тестируйте его с помощью curl. Для этого использовать curl нужно на локальном компьютере — данная команда установлена по умолчанию во всех современных средах Windows, Mac и Linux, поэтому вы можете открыть любую локальную оболочку для ее запуска:
curl -v -x http://your_squid_username:your_squid_password@your_server_ip:3128 http://www.google.com/
Аргумент -x передает прокси-сервер для curl. В этом случае мы используем протокол http://, указываем имя пользователя и пароль для этого сервера, а затем подключаемся к заведомо работающему веб-сайту, такому как google.com. Если команда выполнена успешно, вы должны увидеть следующий вывод:
* Trying 138.197.103.77... * TCP_NODELAY set * Connected to 138.197.103.77 (138.197.103.77) port 3128 (#0) * Proxy auth using Basic with user '8host' > GET http://www.google.com/ HTTP/1.1
Получить доступ к веб-сайтам https:// с помощью прокси-сервера Squid можно также без внесения каких-либо дополнительных изменений в конфигурацию. Команда использует отдельную директиву прокси под названием CONNECT для сохранения SSL-соединения между клиентом и сервером:
curl -v -x http://your_squid_username:your_squid_password@your_server_ip:3128 https://www.google.com/
Вы должны получить такой результат:
* Trying 138.197.103.77... * TCP_NODELAY set * Connected to 138.197.103.77 (138.197.103.77) port 3128 (#0) * allocate connect buffer! * Establish HTTP proxy tunnel to www.google.com:443 * Proxy auth using Basic with user '8host' > CONNECT www.google.com:443 HTTP/1.1 > Host: www.google.com:443 > Proxy-Authorization: Basic c2FtbXk6c2FtbXk= > User-Agent: curl/7.55.1 > Proxy-Connection: Keep-Alive > < HTTP/1.1 200 Connection established < * Proxy replied OK to CONNECT request * CONNECT phase completed!
Учетные данные, которые вы использовали для curl, теперь должны работать везде, где вы захотите использовать новый прокси-сервер.
Заключение
В этом руководстве вы узнали, как развернуть популярную конечную точку API с открытым исходным кодом для проксирования трафика практически без дополнительных настроек. Многие приложения имеют встроенную поддержку прокси-сервера (часто на уровне ОС).
Также вы можете развернуть сервеDante, прокси-сервер SOCKS, который может работать параллельно со Squid для проксирования различных типов веб-трафика.
Одним из наиболее распространенных вариантов использования прокси-серверов является проксирование трафика в разные регионы и обратно. Потому вам может быть полезно знать, как использовать Ansible для автоматизации развертывания серверов, – возможно, вы захотите продублировать эту конфигурацию в других центрах обработки данных.
Читайте также: Автоматизация начальной настройки сервера с помощью Ansible в Ubuntu 18.04