You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何用iptables阻止Ubuntu设备播放YouTube视频(避免封禁Google服务)

看来你遇到的核心问题是用Google整个AS段封禁导致误杀所有服务,而且孩子能绕开hosts拦截,下面给你几个基于iptables/现代防火墙的可靠方案,每个都能精准拦截YouTube又不影响其他Google服务:

可行的解决思路

1. 基于SNI匹配的精准拦截(推荐)

YouTube的HTTPS连接会在SNI(Server Name Indication)字段里携带域名信息(比如youtube.comyoutu.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分配。

步骤:

  1. 安装依赖:
apt install dnsmasq ipset
  1. 创建ipset集合:
ipset create youtube_ips hash:ip family inet
ipset create youtube_ips6 hash:ip family inet6
  1. 修改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
  1. 添加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
  1. 重启dnsmasq:
systemctl restart dnsmasq

3. 应用层代理过滤(带日志监控)

用Squid代理做应用层拦截,不仅能精准封禁YouTube,还能记录孩子的上网行为,同时用iptables强制所有流量走代理,防止绕开。

步骤:

  1. 安装Squid:
apt install squid
  1. 修改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
  1. 重启Squid:
systemctl restart squid
  1. 用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

火山引擎 最新活动