我被要求在早上 8:00 到下午 3:00 之间禁止几乎所有用户访问 Facebook,但他们还是绕过了当前定义的规则来访问社交网络。这消耗了大量的低带宽,我们甚至无法工作。我决定设计一个正则表达式(regex)来解析这些 URL 并阻止它们。我不想屏蔽所有 Facebook 网址,只想屏蔽替代网址。替代 Facebook 网址大多包含以下字词产品或者iPhone。接下来是我们的代理服务器注册的备用 Facebook URL:
m.iphone.touch.prod.facebook.com
m.iphone.haid.prod.facebook.com:443
m.ct.prod.facebook.com
m.vi-vn.prod.facebook.com
设计的正则表达式:/((?=.*\biphone\b)|(?=.*\bprod\b)).*\.facebook\.com(\:|\d|)/
我测试了这个正则表达式https://regex101.com/和https://www.regextester.com. 正则表达式是匹配为了:
m.iphone.touch.prod.facebook.com
m.iphone.haid.prod.facebook.com:443
m.ct.prod.facebook.com
m.vi-vn.prod.facebook.com
并且是不匹配为了:
www.facebook.com
m.facebook.com
mqtt.facebook.com (for purple-facebook)
graph.facebook.com
connect.facebook.com
3-edge-chat.facebook.com
到目前为止,这就是我想要的,阻止替代 URL 并允许常规 Facebook URL。我的正则表达式看起来很适合在 Squid 中使用。
下一步是修改文件 /etc/squid3/squid.conf,添加一个指向包含正则表达式的文件的新 acl:
acl facebook dstdom_regex "/etc/squid3/acl/facebook" //The file contains the regex
http_access deny pass facebook
当我跑步时squid3 -k 解析检查配置文件时我收到错误:
2017/09/22 11:12:26| Processing: acl facebook dstdom_regex "/etc/squid3/acl/facebook"
2017/09/22 11:12:26| squid.conf line 78: acl facebook dstdom_regex "/etc/squid3/acl/facebook"
2017/09/22 11:12:26| aclParseRegexList: Invalid regular expression '((?=.*\biphone\b)|(?=.*\bprod\b)).*\.facebook\.com(\:|\d|)': Invalid preceding regular expression
2017/09/22 12:39:33| Warning: empty ACL: acl facebook dstdom_regex "/etc/squid3/acl/facebook"
显然,squid3 解析器将我的 acl 标记为错误的,但我已经在线测试过了,使用起来很好。它还说 acl 是空的。这是什么意思?该 acl 声明的名称为Facebook。我对此很困惑。
答案1
问题出在我使用的正则表达式上。将正则表达式改为这个:\b(iphone|prod)\b.*\.facebook\.com
现在 squid 正在停止 URL。运行后,squid3 -k parse
squid 说没有问题,如果用户尝试访问其他 Facebook 链接,例如:test.prod.facebook.com,代理会拒绝连接。