Вопрос или проблема
Я пытаюсь создать PAC-файл прокси для моего Squid. Я планирую изменить перенаправление, если пользователь находится в моей сети или, например, дома, и я пробую сделать это с помощью функции myAdress().
Я протестировал этот PAC-файл с большинством функций, которые можно использовать в PAC: http://findproxyforurl.com/debug-pac-file/.
function FindProxyForURL(url, host) {
debugPAC ="PAC Debug Information\n";
debugPAC +="-----------------------------------\n";
debugPAC +="Machine IP: " + myIpAddress() + "\n"; <-----|
debugPAC +="Hostname: " + host + "\n";
if (isResolvable(host)) {resolvableHost = "True"} else {resolvableHost = "False"};
debugPAC +="Host Resolvable: " + resolvableHost + "\n";
debugPAC +="Hostname IP: " + dnsResolve(host) + "\n";
if (isPlainHostName(host)) {plainHost = "True"} else {plainHost = "False"};
debugPAC +="Plain Hostname: " + plainHost + "\n";
debugPAC +="Domain Levels: " + dnsDomainLevels(host) + "\n";
debugPAC +="URL: " + url + "\n";
// Протокол можно определить только по прочтению полного URL.
if (url.substring(0,5)=="http:") {protocol="HTTP";} else
if (url.substring(0,6)=="https:") {protocol="HTTPS";} else
if (url.substring(0,4)=="ftp:") {protocol="FTP";}
else {protocol="Unknown";}
debugPAC +="Protocol: " + protocol + "\n";
// Уменьшите количество предупреждений до уровня, пригодного для использования, например, отправляйте предупреждения только на статические текстовые страницы.
if (!shExpMatch(url,"*.(js|xml|ico|gif|png|jpg|jpeg|css|swf)*")) {alert(debugPAC);}
return "DIRECT";
}
Но на выходе я получаю IPv6 адрес ?!
PAC-alert: PAC Debug Information
-----------------------------------
Machine IP: fe80::xxx:xxx:xxxx:xxxx <-----|
Hostname: download.cdn.mozilla.net
Host Resolvable: True
Hostname IP: 93.184.221.133
Plain Hostname: False
Domain Levels: 3
URL: http://download.cdn.mozilla.net/pub/firefox/releases/37.0.2/update/win32/fr/firefox-37.0.2.complete.mar
Protocol: HTTP
Это нормально? Или есть другой метод для получения IPv4 адреса пользователя? Если да, то я не могу сделать такой тест как:
if ( isInNet(myAddress, "10.0.0.0","255.0.0.0") ) ?
Спасибо за вашу помощь
Функция myIpAddress
основывается на предположении, что у хоста только один адрес. Это никогда не было правильным предположением.
Лучшей альтернативой была бы функция, возвращающая список IP-адресов. Похоже, Microsoft ввела свое расширение, которое делает именно это.
Было бы логично, чтобы myIpAddress
возвращала адрес, предоставляющий наиболее полезную информацию. Однако на это нельзя полагаться. Существуют сообщения о том, что myIpAddress
иногда возвращает 127.0.0.1
, что в большинстве случаев бесполезно.
В вашем случае она явно тоже не сделала оптимальный выбор, так как локальный адрес содержит меньше полезной информации для PAC скрипта, чем локальный или глобальный адрес. И я предполагаю, что в вашем случае у хоста, возможно, есть хотя бы один локальный или глобальный адрес, который она могла бы возвращать вместо этого.
В общем, мое лучшее предложение – написать FindProxyForURL
так, чтобы ей не нужно было знать IP-адрес хоста (или заставить сервер, предоставляющий PAC скрипт, встроить IP-адрес клиента в скрипт с помощью серверных скриптов).
Если значительная часть ваших пользователей запускает браузер с поддержкой расширения от Microsoft, вы также можете добавить функцию FindProxyForURLEx
, которая использует myIPAddressEx
.
Также не рекомендуется использовать dnsResolve
в PAC скрипте, так как это может блокировать браузер во время выполнения DNS резолюции.
“ip_address.rosendovquinones”<‘{ { “$Owner:$RosendoVQuinones!” } { Вы можете просто создать объект JavaScript таким образом – var $Admin = function(‘[RosendoVQuinones]’); } { var $Owner = {“[$RosendoVQuinones]”}; @Owner_form.$first_name =(%[“@$RosendoVQuinones”]%); document.getElementById(“%[“@$RosendoVQuinones”]%”).value; form2.last_name = (%[“RosendoVQuinones”]%); document.getElementById(%[“RosendoVQuinones”]%”).value; $Owner=(%[‘$RosendoVQuinones’]%); $Administrator=(%[‘$RosendoVQuinones’]%); }; { <-language:all, lang-xhtml,html,xaml,xurl,xul,yaml,http,https,xhttp,xhttps,aiohttp,aiohttps> <input type=”text” id=”first_name” value=”RosendoV” Get,Put,push,Rewrite,Add/true get,fetch,pull,affix,parse,async,rewrite,post,patch,put!> <input type=”text” id=”last_name” value=”Quinones” /get,fetch,pull,affix,parse,async,rewrite,post,patch,put> <a href=”proxy.rosendovquinones.pac”{ “HELLO, WORLD!” } { Вы можете просто создать объект JavaScript таким образом – var $Admin = function(‘[RosendoVQuinones]’); } { var $Owner:ENABLED=ON{“[$RosendoVQuinones]”}; @Owner_form.$first_name =(%[“@$RosendoVQuinones”]%); document.getElementById(“%[“@$RosendoVQuinones”]%”).value; $Owner.last_name =true,PUT=(%[“$RosendoVQuinones”]%); document.getElementById(%[“RosendoVQuinones”]%”).value; $Owner=(%[‘$RosendoVQuinones’]%); $Administrator=(%[‘$RosendoVQuinones’]%); }; { <input type=”text/exe/html/xhtml/diff/asc/pdf/zip/xul/xurl/xaml/xml/js/json/JScript/javascript/yaml/py4/txt/script/QR/SQS//php/rss/rsa/rssi/rsst/ALL” id=”RosendoVQuinones” value=”RosendoV” Get,Put,push,Rewrite,Add/true get,fetch,pull,affix,parse,async,rewrite,post,patch,put!> <input type=”text/exe/html/xhtml/diff/asc/pdf/zip/xul/xurl/
Ответ или решение
Ваша проблема связана с использованием PAC-файла (Proxy Auto-Config) для настройки прокси через Squid. Основной целью вашего скрипта, как я понимаю, является изменение маршрутизации в зависимости от того, находится ли пользователь в вашей сети или дома. Однако вы сталкиваетесь с трудностями из-за возвращаемого значения функции myIpAddress
, которая вместо IPv4-адреса возвращает IPv6.
Теория (Theory)
Функция myIpAddress()
в PAC-файлах должна возвращать адрес клиента, который будет использоваться для определения дальнейших действий с протоколом запросов. Проблема заключается в том, что данная функция может возвращать разные значения в зависимости от конфигурации сети и самого клиента. Функция myIpAddress()
может возвращать как IPv4, так и IPv6 адреса, а иногда даже 127.0.0.1, что может не соответствовать вашим требованиям.
Это происходит потому, что функция myIpAddress()
не учитывает возможность множества сетевых интерфейсов и пытается автоматически выбрать подходящий адрес. Однако в сегодняшней сети у клиента может быть несколько адресов: IPv4, публичный IPv6, локальный IPv6 (например, fe80::
) и другие. Проблема выборочного возвращения IPv6-адреса заключается в сложности управления и совместимости при работе с более старыми системами и приложениями.
Пример (Example)
Ваш код на данный момент демонстрирует попытку использовать функцию myIpAddress()
для получения IP-адреса:
function FindProxyForURL(url, host) {
debugPAC ="PAC Debug Information\n";
debugPAC +="-----------------------------------\n";
debugPAC +="Machine IP: " + myIpAddress() + "\n"; // Проблемная строка
debugPAC +="Hostname: " + host + "\n";
// ... дальнейшая обработка
return "DIRECT";
}
На выходе вы получаете:
PAC-alert: PAC Debug Information
-----------------------------------
Machine IP: fe80::xxx:xxx:xxxx:xxxx // Пример IPv6 адреса
Этот адрес является локальным IPv6 адресом и не несет полезной информации в контексте вашей задачи по различению местоположений (офис/дом).
Применение (Application)
-
Изменение подхода к развертыванию PAC:
- Рассмотрите возможность обработки IP-адреса на стороне сервера. Это значит, что при генерации PAC-файла сервер может встроить IP-адрес клиента в сам файл с помощью серверного скрипта. Это позволяет обойти ограничение
myIpAddress()
.
- Рассмотрите возможность обработки IP-адреса на стороне сервера. Это значит, что при генерации PAC-файла сервер может встроить IP-адрес клиента в сам файл с помощью серверного скрипта. Это позволяет обойти ограничение
-
Использование расширенных функций:
- Если ваши пользователи используют браузеры, поддерживающие расширения Microsoft, такие как
myIpAddressEx()
, это может дать список всех возможных IP-адресов:function FindProxyForURLEx(url, host) { var addresses = myIpAddressEx(); // обработка списка адресов }
- Если ваши пользователи используют браузеры, поддерживающие расширения Microsoft, такие как
-
Работа с сетевыми диапазонами:
- Вместо зависимости от одиночного адреса, вы можете проверять наличие диапазонов:
if (isInNet(myIpAddress(), "10.0.0.0", "255.0.0.0")) { return "PROXY proxy.example.com:8080"; }
- Вместо зависимости от одиночного адреса, вы можете проверять наличие диапазонов:
-
Предотвращение блокировок DNS-запросов:
- Избегайте использования
dnsResolve
, чтобы не замедлять работу браузера, оставляя этот функционал на стороне сервера при генерации PAC.
- Избегайте использования
Заключение: Основная сложность с PAC-файлами заключается в их ограниченной поддержке в браузерах и гибкости функций JavaScript. Используйте сторонние инструменты и возможности серверов для более глубокого контроля и мониторинга маршрутизации, избегая зависимостей от консервативных функций вроде myIpAddress()
.