我正在运行 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 规则。
当按照正确的顺序执行时,发布的规则示例确实有效!