Реализация глобального прокси с помощью iptables

Реализация глобального прокси с помощью iptables

Я использую Linux-компьютер (Lubuntu 12.04) в среде Windows, где для настройки доступа в Интернет используется PAC-файл.

Файл proxy.pac:

function FindProxyForURL(url, host){
  var proxy_yes = "PROXY xxx.xxx.xxx.xxx:8000";
  var proxy_no = "DIRECT";
  if (shExpMatch(url, "*//yyy.*")) { return proxy_no; }
  if (shExpMatch(url, "*//zzz.zzz.*")) { return proxy_no; }
  if (shExpMatch(url, "*foo.com*")) { return proxy_no; }
  //Proxy anything else
  return proxy_yes;
}

Насколько мне известно, в Lubuntu нет глобальной системы прокси.

Вместо того чтобы возиться с переменными оболочки, такими как HTTP_PROXY, которые учитывают только некоторые программы (например, не Chromium), я подумал, что iptables можно использовать для прозрачного перенаправления всего трафика через прокси-сервер, эффективно реализуя глобальный прокси-сервер.

Возможно ли это, и если да, то как это сделать?

EDIT: Я должен уточнить, что я не администратор и не пытаюсь настроить прокси. Прокси уже настроен, и для подключения машин к интернету требуется включить автоматическую настройку прокси и указать на файл pac выше. Прямые соединения блокируются.

Вместо того чтобы настраивать каждое приложение по отдельности, я надеялся использовать iptables для автоматической маршрутизации трафика через прокси-сервер.

решение1

Признаюсь, я никогда не пользовался Lubuntu, но подозреваю, что это просто Ubuntuпроизводная, работающая на виртуальной машине. Полагаться на javascript для выполнения проксирования — очень глупое занятие, поскольку его легко обойти или полностью проигнорировать во многих случаях... что в конечном итоге сводит на нет преимущества использования прокси изначально.

Я бы начал с настройки правильной прокси-системы, используяsquid. Для производных в репозитории ubuntuесть пакет, который легко устанавливается с помощью или . После установки начните с редактирования и добавьте или измените следующие настройки на те, которые вы считаете подходящими:squidaptsynaptic/etc/squid/squid.conf

httpd_accel_host virtual
httpd_accel_port 80
httpd_accel_with_proxy on
httpd_accel_uses_host_header on
acl lan src 192.168.1.1 192.168.2.0/24
http_access allow localhost
http_access allow lan

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

iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 80 -j DNAT --to 192.168.1.1:3128
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 3128

Конечно, вы захотите поместить это в какой-то скрипт запуска, чтобы правила применялись каждый раз при загрузке маршрутизатора. Кроме того, имейте в виду, что это не повлияет на httpsтрафик, так как httpsнамеренно разработано так, чтобы НЕ позволять трафику быть проксированным (или перехваченным/расшифрованным/и т. д. кем-то посередине). Если вы хотите отфильтровать трафик (на сомнительные сайты), вы также можете броситьSquidGuardв микс.

Можно проксировать https-трафик, но это крайне не рекомендуется. Если вы действительно хотите реализовать эту функциональность, есть хорошее руководствоздесь.

решение2

Вот что я в итоге сделал:

  • Установка переменных среды ALL_PROXY, HTTP_PROXY, HTTPS_PROXY, FTP_PROXYи NO_PROXYв /etc/environment.
  • Настройка http, https и ftp прокси для apt в /etc/apt/apt.conf.d/80proxy(используя синтаксис Acquire::http::proxy "http://xxx.xxx.xxx.xxx:8000";)
  • С использованиемproxychainsдля всех оставшихся программ, которые не учитывают переменные среды и не имеют встроенной поддержки прокси.

Связанный контент