Вопрос или проблема
Итак, что я пытаюсь сделать, это запустить прокси Squid на одной машине вместе с подключением к VPN. Я хочу, чтобы весь трафик, проходящий через прокси Squid, шёл через VPN для исходящих соединений. То есть: настольный ПК -> (прокси Squid -> VPN)
Цель заключается в том, чтобы позволить моему настольному ПК выбирать туннелирование через VPN. Так, чтобы сообщения мгновенной связи и подобные им, которые не нуждаются в работе через VPN, могли проходить через мой обычный трафик. Обычно я использовал бы SSH-прокси, но в настоящее время вынужден использовать VPN, чтобы получить доступ в офис, и прокси Squid показался мне самым простым вариантом для того, что мне нужно.
EDIT> Понял, что забыл указать, с какой проблемой я сталкиваюсь. Я настроил Squid и подтвердил, что он работает, но как только я подключаюсь к VPN, все запросы к Squid принимаются, но Squid не может сделать запрос через VPN. В результате клиент просто сидит без дела.
Я делаю что-то похожее. Я делаю это с помощью двух частей:
$ cat bin/openproxy
#!/bin/bash
ssh -C -o ServerAliveInterval=150 -L 3128:proxy:3128 gateway.company.com
Затем в Firefox я использую FoxyProxy, чтобы использовать localhost:3128 в качестве прокси для машин в *.company.com.
Это работает почти для всего, что мне нужно.
Это то, что вы пытаетесь сделать?
Ну, требуется дополнительная информация:
-
войдите в вашу машину squid/vpn. Включите vpn. Можете ли вы достичь какого-либо внешнего адреса? Можете ли вы достичь конечной точки vpn и сети конечной точки vpn?
-
Какой это тип vpn (openvpn/pptp и т.д.)?
-
Как выглядит таблица маршрутизации до и после включения vpn? В Linux вы можете вывести таблицу маршрутизации с помощью
/sbin/route -n
илиip route show
Похоже, это проблема с маршрутизацией. Когда вы подключаетесь к VPN, шлюз по умолчанию может не изменяться автоматически.
Это может быть немного сложнее, чем изначальный вопрос, но я пытаюсь сделать то же самое с Squid, где у меня уже настроен VPN-туннель для трафика Transmission, а трафик администратора для http-интерфейса, который управляет Transmission, реверсивно проксируется через Nginx, чтобы он был доступен для хостов в той же локальной сети. Это подход «раздельного туннеля», потому что я хочу, чтобы только некоторые приложения использовали туннель, а другие — нет, поэтому у меня есть правила iptables, а также маршруты, чтобы облегчить это, перенаправляя трафик от пользователя Transmission и маршрутизируя этот трафик на tun1, виртуальный сетевой интерфейс VPN, но когда VPN отключен, никакой трафик не отправляется в качестве меры предосторожности.
Я хочу применить тот же принцип к прокси Squid на этом же хосте, но в этом случае добавить пользователя, от имени которого работает Squid (прокси), чтобы он вел себя аналогичным образом. Я полагаю, что могу реверсивно проксировать трафик от веб-браузеров, который будет отправлять прокси-трафик на Squid, который, среди прочего, отправит трафик через VPN-туннель. Я не совсем уверен, как это будет работать, но у меня есть несколько возможных подходов.
Для получения дополнительной информации о том, что я пытаюсь сделать, загляните в мой пост на Reddit. Я обновлю этот ответ (поскольку он фактически оставляет вас с большим количеством вопросов, чем ответов на данный момент), чтобы это действительно было полезно для кого-то, кто пытается сделать то же самое!
Ответ или решение
Настройка трафика Squid, туннелируемого через VPN
Краткая информация о проблеме: у вас есть Squid Proxy, запущенный на одной машине, рядом с VPN-соединением. Вы хотите, чтобы весь трафик, проходящий через Squid Proxy, использовал VPN для исходящего маршрута с вашей рабочей станции, позволяя при этом другим приложениям (например, мгновенным сообщениям) использовать обычные маршруты. Однако, после подключения к VPN, ваш Squid Proxy принимает запросы, но не может отправлять их через VPN.
1. Основные понятия и настройки
Для достижения вашей цели вам нужно выполнить несколько ключевых шагов:
- Настройка VPN.
- Настройка Squid Proxy.
- Настройка маршрутизации трафика.
2. Проверка подключения и маршрутизации
Первоначально необходимо проверить, можете ли вы подключиться к внешним адресам после назначения VPN. Используйте следующие команды для проверки маршрутизации:
/sbin/route -n
или
ip route show
Это необходимо для того, чтобы понять, как изменяется таблица маршрутизации после подключения к VPN. Часто при соединении с VPN может не изменяться шлюз по умолчанию, что может блокировать трафик Squid Proxy.
3. Проблема маршрутизации
Если вы столкнулись с проблемой, когда Squid не может отправлять трафик через VPN, это скорее всего связано с настройками маршрутизации. Проверьте следующее:
- Существует ли маршрут, направляющий трафик к целевым адресам через интерфейс VPN?
- Обратите внимание на оригинальный маршрут до и после подключения к VPN.
Пример команды для настройки маршрутов
Возможно, вам нужно будет вручную добавить маршрут для Squid Proxy для выхода через интерфейс VPN. Используйте команду вида:
ip route add <цель> via <адрес VPN>
4. Использование IPTables для управления трафиком
Для того чтобы достичь цели "разделения туннеля", когда некоторые приложения используют VPN, а другие – обычный трафик, рекомендуется использовать правила IPTables. Например, чтобы направлять трафик от определенного пользователя Squid через VPN, вы можете установить правила следующего вида:
iptables -t mangle -A OUTPUT -p tcp --dport 80 -m owner --uid-owner proxy -j MARK --set-mark 1
ip rule add fwmark 1 table 100
ip route add default via <адрес VPN> dev <интерфейс VPN> table 100
5. Альтернативные решения и полезные инструменты
В вашем случае, чтобы облегчить управление состоянием VPN и вопросы маршрутизации, вы можете рассмотреть использование скриптов для автоматизации. Например, создайте исполняемый файл для подключения к прокси через SSH:
#!/bin/bash
ssh -C -o ServerAliveInterval=150 -L 3128:proxy:3128 gateway.company.com
Эта команда будет поддерживать соединение с вашим прокси-сервером, используя SSH туннелирование.
Заключение
Для достижения корректной работы вашего Squid Proxy в сочетании с VPN важно учитывать настройки маршрутизации и, при необходимости, управлять правилами IPTables. Убедитесь, что вы можете пинговать целевые адреса и проверьте, какие правила маршрутизации включены в момент подключения к VPN. Дополнительная автоматизация через скрипты может значительно упростить процесс.