Назад | Перейти на главную страницу

Настройка прозрачного прокси-сервера Squid на машине отдельно от роутера

Как объясняется в заголовке, я пытаюсь настроить прозрачный прокси-сервер Squid на машине отдельно от маршрутизатора, а также отдельно от частной сети, которую я хочу фильтровать через прокси.

Контекст будет таким:

Кое-что важное: прокси-сервер отлично работает, если настроен вручную в браузере клиента и без прозрачного флага в файле squid.conf.

Проблемы начинают возникать, когда я пытаюсь сделать прокси прозрачным. Это то, что я уже пробовал: на машине маршрутизатора я применил следующее правило iptables:

$ iptables -t nat -I PREROUTING 1 -i eth2 -s private-ip -p tcp --dport 80 -j DNAT --to squid-ip: 3128

Сначала я подумал, что этого будет достаточно, поскольку он отлично работал при настройке вручную, и единственная разница теперь в том, что мне нужно перенаправить трафик на машину squid. Но все пошло не так, как я ожидал.

Выполнив несколько тестов с tcpdump на маршрутизаторе, я понял, что без прозрачного флага прокси-машина знает свой путь в Интернет и обратно к клиентской машине через маршрутизатор (privateIP> router> proxyServer> router> internet | и обратно | > маршрутизатор> прокси-сервер> маршрутизатор> частный IP).

Но с прозрачным флагом пакеты проходят только через маршрутизатор и прокси-сервер, а затем снова возвращаются на клиентский компьютер, полностью игнорируя файл squid.conf, блокирующий все, поэтому ни один пакет не покидает прокси-сервер для перехода в Интернет (privateIP> маршрутизатор> прокси-сервер> маршрутизатор> частный IP). Кажется, что прокси-сервер Squid не знает, что делать с входящим трафиком, поэтому он не может правильно обрабатывать петиции, которые настроены как прозрачные и не расположены на шлюзе.

Я думал, что мне нужно правило POSTROUTING для выполнения SNAT и изменения адреса источника, чтобы входящий интернет-трафик также проходил через прокси, но на самом деле ни один пакет не отправлялся в Интернет, поэтому теперь я застрял.

Возможно, есть что-то, что squid выполняет автоматически, когда он не в прозрачном режиме, что мне нужно настроить вручную, когда я установил его в прозрачный.

Любая помощь будет оценена.

Если есть прямой путь между прокси и клиентами или через другой маршрутизатор, вот что происходит

  1. Клиент отправляет пакет на google.com (источник: локальный компьютер, место назначения: google.com)
  2. Шлюз получает пакет и заменяет IP-адрес Google на IP-адрес прокси (источник: локальный ПК, место назначения: Squid)
  3. Сервер Squid получает пакет, и, поскольку это 1-й пакет трехстороннего установления связи TCP (SYN), он генерирует пакет SYN-ACK (источник: Squid, место назначения: локальный ПК)
  4. Сервер Squid отправляет вышеуказанный пакет прямо на ПК.
  5. Локальный ПК получает пакет SYN-ACK от сервера Squid, замечает, что он ни разу не просил поговорить с этим сервером, и немедленно отбрасывает пакет.

Шаги 1–5 повторяются несколько раз до тех пор, пока соединение не разорвется.

У меня эта установка (или близкая к ней) работает в настоящее время, но с некоторыми отличиями. Вместо CentOS я использую статический маршрут для перехвата трафика через порт 80 на мой шлюз pfSense и перенаправления его на другой сервер на базе pfSense, на котором запущен Squid. Разница с моей настройкой заключается в том, что когда pfSense Squid настроен на прозрачное проксирование, он прослушивает соединения на 80-м порту вместо обычного 3128. Вы можете запустить netstat и посмотреть, прослушивает ли ваш Squid порт 80, и попробовать перенаправить на это вместо этого.

Удачи.