通过 PAC/WPAD 文件从代理中排除具有非标准端口的 URL

通过 PAC/WPAD 文件从代理中排除具有非标准端口的 URL

我正在运行 Squid 代理,并且想要排除通过非标准端口访问的某个网址,而不是在 ACL 中打开该端口squid.conf(似乎是一种特定的用例)。

在我的情况下,有问题的端口 TCP 2222 (DirectAdmin) 既通过 http:// 也通过 https://。我不确定在不打开端口本身的情况下是否真的可以做到这一点,但我确实找到了几篇关于使用 PAC/WPAD 绕过非标准端口 URL 的文章。我尝试了类似下面的规则集,它为 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

但是,当我在 Web 浏览器中收到“代理拒绝连接”等信息时,请求似乎仍通过代理发送。端口本身没有被阻止,我可以通过 telnet 连接到它,但 Sqiud ACL 不允许该端口。虽然这是我试图避免做的事情,而且 DIRECT 响应肯定意味着绕过?

这实际上是否可以通过具有非标准端口的 PAC/WPAD 来实现,或者针对这种特定情况是否有其他绕过并直接发送的方法?

答案1

原始配置

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";

您可能正在尝试访问例如.somedomain.co.uk但你的条件是例如.somedomain.com所以它会继续影响代理吗?

答案2

如果您想要更通用的功能,以允许所有需要非标准端口的请求直接发送,请尝试:

if (shExpMatch(url, "*://" + host + ":*"))
    return "DIRECT";

它并不完美(您可能希望进行修改,以便明确指定协议标准端口(例如 HTTP 的 :80 和 HTTPS 的 :443)的请求仍通过代理发送),但它应该可以捕获大多数请求。欢迎改进。

答案3

看起来它是缓存和错误的 isInNet 规则的组合,覆盖了我特定端口 if 语句中的 DIRECT 规则。

当按照正确的顺序执行时,发布的规则示例确实有效!

相关内容