如何用iptables阻止Ubuntu设备播放YouTube视频(避免封禁Google服务)
看来你遇到的核心问题是用Google整个AS段封禁导致误杀所有服务,而且孩子能绕开hosts拦截,下面给你几个基于iptables/现代防火墙的可靠方案,每个都能精准拦截YouTube又不影响其他Google服务:
可行的解决思路
1. 基于SNI匹配的精准拦截(推荐)
YouTube的HTTPS连接会在SNI(Server Name Indication)字段里携带域名信息(比如youtube.com、youtu.be),我们可以利用内核模块直接匹配这个字段来拦截请求,完全不涉及IP范围的误封。
iptables实现方式:
首先确保安装额外内核模块(Ubuntu 20.04默认可能没加载):
apt install linux-modules-extra-$(uname -r) modprobe xt_ssl
然后添加规则:
# 新建专门的拦截链 iptables -N YOUTUBE_BLOCK ip6tables -N YOUTUBE_BLOCK # 匹配YouTube相关域名的HTTPS流量并丢弃 iptables -A YOUTUBE_BLOCK -p tcp --dport 443 -m ssl --ssl-sni *.youtube.com -j DROP iptables -A YOUTUBE_BLOCK -p tcp --dport 443 -m ssl --ssl-sni *.youtu.be -j DROP iptables -A YOUTUBE_BLOCK -p tcp --dport 443 -m ssl --ssl-sni *.googlevideo.com -j DROP ip6tables -A YOUTUBE_BLOCK -p tcp --dport 443 -m ssl --ssl-sni *.youtube.com -j DROP ip6tables -A YOUTUBE_BLOCK -p tcp --dport 443 -m ssl --ssl-sni *.youtu.be -j DROP ip6tables -A YOUTUBE_BLOCK -p tcp --dport 443 -m ssl --ssl-sni *.googlevideo.com -j DROP # 将拦截链挂到OUTPUT链(拦截本机发起的请求) iptables -A OUTPUT -j YOUTUBE_BLOCK ip6tables -A OUTPUT -j YOUTUBE_BLOCK
更现代的nftables实现:
Ubuntu 20.04默认支持nftables,配置更简洁易维护:
# 创建表和链 nft add table inet youtube_filter nft add chain inet youtube_filter output { type filter hook output priority 0 \; } # 添加SNI匹配规则 nft add rule inet youtube_filter output tcp dport 443 tls sni ~ "^.*\.youtube\.com$" drop nft add rule inet youtube_filter output tcp dport 443 tls sni ~ "^.*\.youtu\.be$" drop nft add rule inet youtube_filter output tcp dport 443 tls sni ~ "^.*\.googlevideo\.com$" drop # 保存配置确保重启生效 nft list ruleset > /etc/nftables.conf
2. DNS+ipset动态拦截
既然孩子能绕hosts,我们可以用dnsmasq配合ipset,自动把YouTube相关域名解析到的IP加入封禁集合,完美适配Google的动态IP分配。
步骤:
- 安装依赖:
apt install dnsmasq ipset
- 创建ipset集合:
ipset create youtube_ips hash:ip family inet ipset create youtube_ips6 hash:ip family inet6
- 修改dnsmasq配置(
/etc/dnsmasq.conf):
# 将YouTube相关域名的解析IP自动加入ipset ipset=/youtube.com/youtu.be/googlevideo.com/youtube_ips ipset=/youtube.com/youtu.be/googlevideo.com/youtube_ips6 # 可选:搭配家长控制DNS双重保障 server=208.67.222.123
- 添加iptables规则封禁集合内的IP:
iptables -A OUTPUT -m set --match-set youtube_ips dst -j DROP ip6tables -A OUTPUT -m set --match-set youtube_ips6 dst -j DROP
- 重启dnsmasq:
systemctl restart dnsmasq
3. 应用层代理过滤(带日志监控)
用Squid代理做应用层拦截,不仅能精准封禁YouTube,还能记录孩子的上网行为,同时用iptables强制所有流量走代理,防止绕开。
步骤:
- 安装Squid:
apt install squid
- 修改Squid配置(
/etc/squid/squid.conf),添加ACL规则:
# 定义YouTube相关域名 acl youtube_domains dstdomain .youtube.com .youtu.be .googlevideo.com # 拒绝访问这些域名 http_access deny youtube_domains # 允许其他正常访问 http_access allow all
- 重启Squid:
systemctl restart squid
- 用iptables强制HTTPS流量走Squid(监听默认3128端口):
iptables -t nat -A OUTPUT -p tcp --dport 443 -j REDIRECT --to-port 3128 ip6tables -t nat -A OUTPUT -p tcp --dport 443 -j REDIRECT --to-port 3128
为什么你当前的方案不可行?
你通过AS15169获取的是Google整个自治系统的所有IP段,这些IP同时服务YouTube、搜索、Gmail、Drive等所有Google服务,封禁后必然误杀其他服务。而IP白名单的方式本质不可靠:Google的IP是动态分配的,同一个IP可能对应多个服务,且新IP会持续加入,永远无法补全白名单。
内容的提问来源于stack exchange,提问作者MaxAuray




