Реализация глобального прокси с 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 можно использовать для прозрачного перенаправления всего трафика через прокси, эффективно реализуя глобальный прокси.

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

РЕДАКТИРОВАТЬ: я должен уточнить, что я не администратор, и я не пытаюсь настроить прокси. Прокси-сервер уже настроен, и для того, чтобы компьютеры могли подключаться к интеренту, необходимо включить автоматическую настройку прокси-сервера и указать его выше в файле pac. Прямые соединения заблокированы.

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

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";)
  • Использование цепочек прокси для любых оставшихся программ, которые не учитывают переменные среды и не имеют встроенной поддержки прокси.

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

Я бы начал с настройки правильной прокси-системы, используя squid, За ubuntu производные, есть squid пакет в репозитории, который легко устанавливается с помощью apt или же synaptic, После установки начните с редактирования /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, но это крайне не рекомендуется. Если вы действительно хотите реализовать эту функциональность, здесь есть хорошее руководство.

Другие вопросы по тегам