Я использую прокси-сервер Squid и хочу исключить определенный веб-адрес, доступ к которому осуществляется через нестандартный порт, из прокси-сервера, а не открывать порт в ACL внутри squid.conf
(кажется, это конкретный случай использования).
В моем случае рассматриваемый порт TCP 2222 (DirectAdmin) через http: // и https: //. Я не был уверен, можно ли обойтись без открытия самого порта, но я нашел несколько статей об обходе URL-адресов с нестандартными портами с помощью PAC / WPAD. Я пробовал набор правил, подобный приведенному ниже, который устанавливает подстановочный знак для TLD и определенные правила для нестандартного URL-адреса порта.
if (shExpMatch(host, "*.somedomain.com") ||
shExpMatch(url, "http://example.somedomain.com:2222/*") ||
shExpMatch(url, "https://example.somedomain.com:2222/*"))
return "DIRECT";
С помощью pactester
, Я получаю правильный ответ DIRECT в результате проверки правил
pactester -p /path/to/wpad.dat -u http://example.somedomain.com
DIRECT
pactester -p /path/to/wpad.dat -u http://example.somedomain.com:2222
DIRECT
pactester -p /path/to/wpad.dat -u https://example.somedomain.com:2222
DIRECT
Однако, похоже, запрос все еще отправляется через прокси-сервер, поскольку я получаю сообщение «Прокси-сервер отклоняет соединения» и т. Д. В веб-браузере. Сам порт не заблокирован, я могу подключиться к нему по telnet, но в Sqiud ACL порт не разрешен. Хотя это то, чего я стараюсь избегать, и, конечно же, ПРЯМОЙ ответ означает обход?
Можно ли этого достичь с помощью PAC / WPAD с нестандартными портами или их альтернативным способом обхода и отправки напрямую для этого конкретного случая?
Если вы хотите что-то более общее, чтобы все запросы, требующие нестандартного порта, шли напрямую, попробуйте:
if (shExpMatch(url, "*://" + host + ":*"))
return "DIRECT";
Это не идеально (и вы можете захотеть изменить так, чтобы запросы, явно указывающие стандартный порт для протокола, например: 80 для HTTP и: 443 для HTTPS, по-прежнему проходили через прокси), но он должен перехватывать большинство запросов. Доработки приветствуются.
Похоже, это была комбинация кеширования и плохого правила isInNet, переопределяющего правило DIRECT в моем конкретном операторе if для порта.
Опубликованный пример правила действительно работает, если выполняется в правильном порядке!
Оригинальный конфиг
if (shExpMatch(host, "*.somedomain.co.uk") ||
shExpMatch(url, "http://example.somedomain.com:2222/*") ||
shExpMatch(url, "https://example.somedomain.com:2222/*"))
return "DIRECT";
Вы уверены, что этого не должно быть
if (shExpMatch(host, "*.somedomain.co.uk") ||
shExpMatch(url, "http://example.somedomain.co.uk:2222/*") ||
shExpMatch(url, "https://example.somedomain.co.uk:2222/*"))
return "DIRECT";
Возможно, вы пытаетесь посетить example.somedomain.co.uk но ваше состояние написано для example.somedomain.com и так продолжает бить прокси?