如何阻止 443 网站或允许

如何阻止 443 网站或允许

我知道这是 serverfault 上经常被问到的一个问题,尽管如此,我还是没有得到一个简洁的答案(或者没有读得足够多:D)我也知道你们中的一些人可能认为这是一种反管理做法(可能确实是)但重点是必须要这样做......

目前我正在应用一个与 squid 相结合的 iptables 阻止策略,但是这不起作用,因为我们需要访问某些 google 网站或 skype 服务,而这些都是通过 https 访问的,而且交换它们的 ip 地址真的很难跟踪......

我的一个朋友向我推荐了 Astaro,但我还没有看到它,您能推荐一个可以按端口站点进行过滤/域名的工具吗?

编辑问题

有没有办法通过域名阻止 HTTPS 网站或最好的方法是什么?Astaro 似乎是一种替代方案,但它看起来就像一个普通的旧式 Web 代理。

答案1

诀窍是将 Squid 与经过身份验证的用户一起使用。如果您运行的是透明代理,则无法代理 SSL 流量。Squid 可以同时双向运行(在不同端口上):

http_port <ip>:3128 transparent
http_port <ip>:8080

显然,您必须添加一些规则来允许和拒绝经过身份验证的用户浏览允许或禁止的内容。不过,如果防火墙阻止了 HTTPS,则透明访问网络的用户将被禁止访问 HTTPS。

另一种方法(更肮脏的方法)是从文件中获取允许的站点,获取其 DNS 记录,然后更新/删除规则,例如:

设置这样的规则:

iptables -N SSL_FORWARD
iptables -A FORWARD -s <NET> -p tcp --dport 443 -j SSL_FORWARD
iptables -A FORWARD -s <NET> -p tcp --dport -j DROP

这将创建一个新的链 SSL_FORWARD,并将来自您的网络并发往端口 443 的数据包发送到此新链进行评估。如果数据包与此链中的任何规则都不匹配,则将被丢弃。

然后定期执行这个小脚本:

# Flush SSL_FORWARD chain
iptables -F SSL_FORWARD

# Iterate through each line of this file, and then get
# it DNS records
for domain in `cat /path/to/allowed.domains`; do

  for line in `dig ${domain} +short` ; do
    [ -z "`echo ${line} | grep '^[0-9.]*$'`" ] && continue
    iptables -A SSL_FORWARD -s <NET> -d ${line} -p tcp --dport 443 -j ACCEPT
  done

done

答案2

我的情况类似。我使用 bash 脚本来转换域名列表,例如:

www.youtube.com
www.vimeo.com
www.facebook.com

进入 IP 地址列表。然后,我将 IP 地址列表输入ipset

ipset -N Blacklist iphash
for ip in ${iplist[@]}; do
    ipset -A Blacklist $ip
done

最后,我将 IPset 应用于 iptables:

iptables -A FORWARD -p tcp --dport 443 -m set --match-set Blacklist dst -j DROP

好处:每天早上cron 作业将域列表重新解析为 IP 列表并更新该Blacklist集合,我根本不需要触及 iptables 规则。更新脚本使用-F代替-N作为其第一行。

相关内容