十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

家庭网络内容过滤实战:RouterOS三层拦截方案

家庭网络内容过滤实战:RouterOS三层拦截方案 家里多了个上小学的孩子之后我发现自己对“孩子上网安全”这件事越来越敏感。孩子搜索资料、上网课、看动画片都离不开浏览器但你不可能24小时守在旁边盯着屏幕。手机和平板自带的管控功能要么太弱、要么操作繁琐装一套第三方过滤App又只能管住一台设备治标不治本。后来我把家里的主路由换成了刷好RouterOS的MikroTik设备开始系统性地在网关层做内容拦截。这套方案最省心的地方在于不管孩子用平板、手机、电视还是电脑只要流量经过家里的路由器拦截都在入口生效不需要在每台设备上装任何软件也不怕孩子自己去卸载。这篇文章就梳理下我自己在用的这套“DNS黑名单 HTTPS域名过滤 上网时段控制”的完整做法不追求高深技术只保证照着操作就能一步步落地。适合谁看呢一是家里有学龄儿童或青少年、想给网络加一道闸的家长二是已经用RouterOS当主路由、想深度挖掘内容过滤能力的爱好者。命令和界面我都尽量写细Winbox和命令行都会覆盖到。1. 为什么把拦截做在路由器上最省心1.1 设备级过滤软件管不住孩子也照顾不到全家给每台设备装过滤App是多数家长最先想到的办法。电脑装一个、平板装一个、手机装一个忙活半小时才覆盖全。可问题很快就来了孩子用的设备可能不止家里这几台爷爷来住几天带来的旧平板、孩子同学串门时的手机你没法临时装一遍管控软件。就算装好了很多App是可以被卸载的孩子一旦摸到密码或者软磨硬泡要到权限这道防线基本就没了。我一开始用的就是这种方案坚持了不到两星期就放弃了太累。更现实的问题是设备级过滤只管得了装了App的那台设备家里电视、学习机这类联网设备全都覆盖不到。真正省心的做法必须在网络入口统一拦截也就是在路由器这里做文章。1.2 路由器做网关拦截的三个天然优势把拦截放在路由器上有几个特性是普通软件替代不了的。第一是覆盖面广。家里所有联网设备不管是什么操作系统、什么品牌只要IP地址由路由器分配、上网流量经过路由器就会被同一套规则管住。新增设备无需单独配置自动纳入防护范围。第二是难以绕过。孩子在浏览器层面可以装插件、改设置但他改不了路由器的配置。就算他把设备的DNS改成其他公共DNS只要路由器上的出站DNS保护规则配置到位外部解析请求照样被丢弃。这类操作的门槛远高于卸载一个App。第三是稳定可靠。RouterOS本身是运行在专用设备或小型主机上的操作系统7x24小时运行规则一旦写入就会持续生效不存在“忘了打开App”这类人为疏漏。当然路由器方案也有它的学习成本毕竟要在RouterOS里配置地址列表、防火墙规则和定时脚本比点点鼠标装个App门槛高一些。但从长期看这套投入换来的是整个家庭网络的自主可控我个人觉得很值。2. 动手前必须理清的三层拦截逻辑2.1 一次网页访问要经过哪些环节在做屏蔽配置之前先想清楚流量是怎么从孩子设备到目标网站的。一次普通的HTTPS访问大致有三个阶段DNS解析浏览器把域名比如 example.com发给DNS服务器换取对应的IP地址。TCP连接与TLS握手拿到IP后浏览器与服务器建立连接。如果是HTTPS还会在握手阶段交换证书信息客户端会发送一个SNI字段里面明文写着要访问的域名。内容传输连接建立完成后页面数据开始传输。针对这三个阶段可以分别做拦截但效果差异很大拦截阶段原理优点缺点DNS层把不良域名解析到无效地址配置最简单性能开销几乎为零挡不住加密DNSDoH子域名覆盖麻烦TCP/IP层按目标IP和端口拦截对IP直连有效一个IP挂多个域名时容易误伤已废弃场景多TLS SNI层在TLS握手时匹配域名精准、不依赖DNS需要RouterOS 7.x只对443端口生效2.2 三层过滤怎么组合最合适我自家网络最终采用的是三层组合方案各管一段互不冲突第一层DNS静态解析负责任务最重的粗过滤。把明确的不良域名直接解析到0.0.0.0访问直接失败。第二层TLS Host匹配负责加密流量下的精过滤。用域名模式和关键词匹配HTTPS握手阶段的SNI字段不依赖DNS是否被绕过是防止加密DNS绕过的最有效手段。第三层出站DNS保护负责封堵绕过路径。只允许内网设备向路由器自身发起DNS解析阻止发往任何外部IP的53端口请求。不少朋友一听到“HTTPS过滤”就以为是中间人解密、装根证书、检测内容那一套觉得太复杂就放弃了。其实RouterOS的tls-host功能完全不是这个思路。它只是在TLS握手的ClientHello阶段看一眼客户端明文发送的SNI字段匹配域名后决定放行还是丢弃整个过程不涉及解密、不看网页内容不会影响孩子正常访问加密网站。后面第5章会详细展开。3. 第一道防线用DNS静态解析把域名送进黑洞3.1 添加一条静态解析记录有多简单RouterOS的DNS模块支持静态记录简单说就是你可以手动指定“域名 - IP地址”的对应关系而且这个关系的优先级高于正常查询结果。我们把不良域名指向0.0.0.0内网设备访问这些域名时解析出的就是一个不存在的黑洞地址连接必然失败。先在Winbox里操作一遍。打开左侧菜单的IP - DNS先确认Servers栏填的是可用DNS服务器运营商默认或公共DNS都行。然后点上面标签页里的Static在列表窗口中点“”新建记录。Name填要屏蔽的完整域名比如example.comAddress填0.0.0.0Type默认A记录即可TTL参数可留空。点OK保存一条屏蔽规则就生效了。命令行方式更直接每行一条记录/ip dns static add nameexample.com address0.0.0.0 add namewww.example.com address0.0.0.0添加完成后在路由器命令提示符里执行/resolve example.com如果返回的地址是0.0.0.0说明静态规则成功拦截了解析请求。内网设备只要把DNS设置为路由器地址通常是192.168.x.1访问该域名时就会拿到黑洞IP网站打不开屏蔽成立。3.2 命令行批量操作的两种习惯用法如果家里屏蔽的域名数量不多一条条在Winbox里添加完全没问题。但如果你跟我一样屏蔽列表攒了上百条命令行批量操作就快得多。一种用法是把域名列表写成一个脚本文件放到RouterOS里批量执行。格式就是从上面那样一行一个命令保存成.rsc通过Winbox的Files窗口上传后在终端里导入/import dns-block-list.rsc另一种用法是临时把某个域名追加进黑名单用一行命令就行/ip dns static add namenewsite.com address0.0.0.0我还习惯把这种短命令存成RouterOS的脚本以后要加域名只需执行脚本名加参数。这个属于进阶玩法有兴趣可以自行研究基础阶段把静态记录添加熟练就够用了。3.3 改完配置不生效先查DNS缓存添加静态记录后最常见的抱怨是“我明明加了规则域名怎么还打得开”十有八九是DNS缓存导致的。RouterOS会缓存上游DNS的解析结果内网设备自己也有DNS缓存。静态记录是后加的覆盖不了设备上已经缓存好的旧IP。处理办法很简单/ip dns cache flush清掉路由器的缓存之后让孩子设备断网重连或者在电脑上执行ipconfig /flushdnsWindows、sudo dscacheutil -flushcachemacOS基本就能立即同步。要是设备端有浏览器缓存让浏览器完全刷新一次就好。这里还要提醒一个认知误区DNS静态屏蔽只覆盖走路由器DNS解析的流量。如果某个App内置了加密DNS功能也叫DoH解析请求直接发到外部加密服务器那路由器DNS这层就拦不住了。所以DNS方案适合做基础过滤真正要防住加密流量绕过还需要第5章的TLS Host方案。4. 第二道防线正则表达式批量屏蔽域名4.1 正则记录的基本写法一条条添加域名终归太累而且总有漏掉子域名的风险。RouterOS 7.x的DNS静态记录支持正则匹配可以把一大类域名一次性覆盖。在Winbox里添加静态记录时Name栏填正则表达式同时勾选下方Regexp选项即可。命令行写法/ip dns static add name.*\.badsite\.com address0.0.0.0 regexpyes add name.*\.(abc|def|ghi)\.(com|net|org)$ address0.0.0.0 regexpyes第一条的意思是把badsite.com以及它的所有子域名全部解析到0.0.0.0。第二条是按域名特征匹配一类站点凡是以abc、def、ghi中的任意一个作为二级域名并且顶级域名是com、net、org的全部拦下来。正则匹配最有用的场景是关键词级过滤。比如你不想让孩子访问域名里含特定关键词的网站可以写/ip dns static add name.*(xxx|gambling).* address0.0.0.0 regexpyes凡是域名里包含这些词的站点都会被DNS层挡在门外。这个思路和公共DNS的内容过滤类似但过滤词完全由自己控制想加想减随时调整。4.2 正则太宽会误伤这样写更稳妥正则库用得最多的地方就是误伤。我自己的第一次正则配置就因为嫌麻烦写得太宽结果把好几个完全无辜的网站也屏蔽了。当时我写的是.band.本意是屏蔽某个游戏社区的域名结果家里老人平时看的新闻网站域名里刚好也带着这四个字母直接打不开了。所以我后来总结出几条正则避坑原则分享给你关键词级过滤要聚焦选那些语义独特的词不要用过于普遍的组合。域名的点号要转义写成“\.”而不是“.”否则正则会匹配任意字符误伤概率激增。能加锚点的都加上。比如想匹配特定顶级域用“(.com|.net)$”结尾锚点可以避免“example.com.evil-site.org”这种后缀变体漏网。精确域名屏蔽别用正则直接写普通静态记录清晰又高效。正则规则和普通静态记录可以混用RouterOS会逐个去匹配。实际情况中我建议普通静态记录放前面管理精确域名正则记录放后面做兜底分类。5. 第三道防线TLS Host匹配拦截加密流量5.1 无需解密流量靠SNI就能识别域名DNS层的短板在于如果孩子设备上的浏览器开启了DoH加密DNS——现在Windows、Chrome、Edge这些主流系统基本都是默认或半默认开启——域名解析请求就不再经过路由器了。DNS静态屏蔽自然失效。这时候还能指望谁答案就是TLS Host。TLS Host是RouterOS 7.x引入的防火墙匹配条件。原理不复杂HTTPS连接在建立时客户端会向服务器发送一个ClientHello消息里面包含一个叫SNI的字段明文写着要访问的域名。RouterOS在流经防火墙的TLS握手中检查这个SNI字段就能在不解密流量的前提下准确知道“这个连接要去哪个域名”。有人会问既然要拦截HTTPS流量那是不是必须解密才能看到内容完全不是。用tls-host做域名匹配只需要在握手阶段识别域名不需要解密之后的任何数据。这就相当于快递柜上贴着一张收件人标签我们只看标签就能决定要不要签收不需要打开包裹检查里面是什么。因此采用tls-host过滤不会破坏HTTPS连接的安全性也不会造成兼容性问题。5.2 TLS Host规则的配置方法配置在防火墙Filter Rules里完成。命令行方式/ip firewall filter add chainforward tls-host*.badsite.com actiondrop commentBlock badsite HTTPS add chainforward tls-host*porn* actiondrop commentBlock keyword HTTPSWinbox操作路径是IP - Firewall - Filter Rules点“”新建规则。Chain选forward然后在Advanced标签页找到TLS Host栏填入要匹配的域名模式。Action选drop或者reject。顺序上务必把TLS Host拦截规则放在任何放行规则之前否则流量可能先被前面的放行规则命中根本走不到拦截规则。配置完成后用孩子的设备试着访问一个被屏蔽的HTTPS网站如果浏览器直接显示连接失败或者超时说明规则生效。Winbox里可以看到该规则Packets计数不断增长那就是有连接被命中。需要注意tls-host目前只对443端口HTTPS生效普通HTTP流量不受影响。如果你的目的是彻底屏蔽某个网站而该站点同时提供HTTP和HTTPS入口那HTTP部分仍然需要靠DNS静态解析来兜底。所以DNS层和TLS层从来不是二选一是互补关系。5.3 白名单与黑名单要配合使用正则和通配符用多了误伤是难免的。万一某个学习平台或网课的域名恰好命中了一条宽泛的关键词规则孩子的网课就上不成了。所以我在TLS Host的实际配置里一定会配一组白名单规则放在黑名单之前/ip firewall filter add chainforward tls-host*.school.edu.cn actionaccept commentWhitelist school add chainforward tls-host*.online-class.com actionaccept commentWhitelist class add chainforward tls-host*porn* actiondrop commentBlock keyword HTTPS白名单规则里写明确需要放行的域名让流量直接accept不再走到后面的黑名单规则。注意顺序白名单放在前面黑名单放在后面。否则黑名单先命中白名单就没意义了。这套白名单加黑名单的组合在DNS静态层同样适用。用地址列表Address List记录白名单IP然后在防火墙NAT或Filter规则里对白名单IP单独放行是RouterOS实现精细化内容控制的经典做法。不过对家庭场景来说先把TLS Host白名单配好就够用了。6. 防止孩子绕过封住外部DNS出口6.1 只允许路由器自己提供DNS解析前面所有的过滤方案都建立在一个前提上设备的DNS请求最终到达路由器由路由器来解析。如果孩子把设备DNS改成公共DNS或者使用了系统内置的DoHDNS层的拦截就会失去意义。所以必须加一道“封出站DNS”的规则把设备的DNS解析权限制在路由器自己手里。配置起来很简单在Filter Rules里新建两条规则把所有发往非路由器IP的53端口数据包丢弃/ip firewall filter add chainforward protocoludp dst-port53 actiondrop \ dst-address!192.168.1.1 commentBlock external DNS UDP add chainforward protocoltcp dst-port53 actiondrop \ dst-address!192.168.1.1 commentBlock external DNS TCP这里192.168.1.1要替换成你自己的路由器内网IP。两条规则的作用是内网设备向路由器自己发DNS请求可以正常通过但向其他任何IP发的53端口请求都会被丢弃解析失败。孩子手动把DNS改成8.8.8.8、114.114.114.114都没有用网路直接解析不出域名。6.2 忘记封TCP 53会留下小尾巴我第一次做这个配置就踩了个坑只加了UDP 53的封禁觉得DNS请求基本都是UDP。结果后来发现有些Windows设备在UDP解析失败后会自动尝试TCP 53回退偶尔就会出现“明明屏蔽了怎么还能打开”的情况。原因是某些递归DNS服务器同时支持TCP查询Windows和macOS在UDP查询失败后确实会走TCP方式再试一次。所以TCP 53的封禁同样不能漏。把两条都加上这个口子才算堵死。此外如果孩子用的是支持DoTRFC 7858端口853的设备可以把外网853端口也一并丢包/ip firewall filter add chainforward protocoltcp dst-port853 actiondrop \ commentBlock DoT external这样处理之后常规的DNS绕过手段基本都被堵住了。关于DoH加密DNS跑在443端口这个更刁钻的情况因为443端口承载着大量正常HTTPS流量没法做一刀切的封锁。针对DoH我的建议是结合设备管理层面控制比如在浏览器里关闭自动DoH功能同时配合设备使用时间控制来降低风险。毕竟孩子如果真想折腾技术上是可以找到更复杂的绕过方式的但家长控制的目标从来不是对抗黑客而是提高门槛、覆盖常见路径。对绝大多数家庭来说上面的配置已经足够。7. 锦上添花给孩子设备加个上网时段控制7.1 MAC地址列表加时间段规则的思路屏蔽网站只能解决“看什么”的问题但孩子动不动刷上两小时平板一样让人头疼。RouterOS自带的时间段匹配功能可以按MAC地址控制设备的上网时间这个做起来也不难。思路是先建一个孩子设备的MAC地址列表然后在防火墙里写一条时间段规则。时间段内禁止列表中的设备访问外网但不影响局域网内部通信。这样晚上睡觉时间孩子设备无法联网偷刷视频、半夜打游戏这些事基本就杜绝了。配置分两步。第一步在IP - Firewall - Address List里新建一个List取名children_devices把孩子的平板、手机、电脑网卡的MAC地址都加进去。第二步在Filter Rules里新建规则Source Address List选择children_devicesAction选择drop然后在Time栏里设置时间段/ip firewall filter add chainforward src-address-listchildren_devices \ actiondrop commentBlock children at night \ time22:00-07:00,sun,mon,tue,wed,thu,fri,sat这里的time参数格式是“起始时间-结束时间,星期”可以写多个星期几。示例中的time段表示每天晚上10点到次日早上7点一周七天都生效。如果只是上学日封禁就把后面的星期列表改成sun,mon,tue,wed,thu。周末单独配置一条更宽松的规则。注意事项如果孩子设备主要通过WiFi连接在Address List里记录的是WiFi网卡的MAC。有些设备开启了随机MAC功能需要先在设备端关闭或者用静态DHCP绑定固定IP再基于IP来控制。我建议直接用MAC列表但关闭设备的随机MAC实际验证过最稳妥。7.2 不同日期不同规则的做法不同家庭情况不一样比如上学日要求早睡周末可以放宽到11点。RouterOS的time参数本身支持多条规则叠加处理方式很直接把时间段拆成两条规则。上学日规则/ip firewall filter add chainforward src-address-listchildren_devices \ actiondrop commentBlock school nights \ time22:00-07:00,mon,tue,wed,thu,fri周末规则/ip firewall filter add chainforward src-address-listchildren_devices \ actiondrop commentBlock weekend bedtime \ time23:00-07:00,sat,sun这样配置之后一周七天的断网时间就错开了。想要更细的控制比如允许周末白天某些时段上网、其他时段禁止也可以拆成多条规则继续细化。RouterOS的灵活度足够核心思路就是“多建几条时间段规则各自定义时间范围”。8. 常见问题与排查技巧实录8.1 高频问题速查表问题可能原因解决办法屏蔽后设备仍然能打开某个网站设备浏览器开启DoHDNS层失效配置TLS Host规则做HTTPS拦截封禁外部53和853端口在浏览器设置里关闭DoH有些正常网站也打不开了正则或TLS Host关键词匹配误伤检查匹配模式改用转义点和结尾锚点添加白名单放行规则修改静态DNS记录后未生效DNS缓存执行 /ip dns cache flush清设备端DNS缓存被屏蔽的网站一直转圈无法快速失败0.0.0.0地址在某些系统上连接超时缓慢改为 actionreject 规则或使用127.0.0.1作为黑洞地址RouterOS v6找不到tls-host选项tls-host是v7.x功能升级RouterOS到7.x稳定版或改用L7协议过滤不推荐正常访问突然变慢防火墙规则太多规则命中顺序不合理精简规则数量白名单规则前置无关规则删除8.2 我踩过的三个典型坑第一个坑是正则写法太随意。我最开始图省事写了一个不带转义点也不带结尾锚点的关键词匹配结果一个域名里含有相同字母组合的新闻网站被误伤。后来把所有正则都改成严谨格式比如“\.badsite\.(com|net|org)$”才算稳定下来。第二个坑是忘记清理DNS缓存。改了一批规则之后测试时发现有的域名还是能打开花了好几分钟排查最后才意识到是路由器缓存和新加的静态记录冲突了。执行/ip dns cache flush后一切恢复正常。现在每次改完规则我都养成先flush一下缓存的习惯。第三个坑是规则顺序问题。刚开始把一条比较宽泛的放行规则放在了TLS Host拦截规则前面结果部分拦截规则形同虚设。后来把所有accept规则统一放在最前面、drop规则紧跟其后并且养成写每条规则都带comment注释的习惯这样后期维护时一眼就能看出该规则用途。8.3 靠防火墙计数定位问题遇到“规则好像没生效”的情况我建议先看防火墙规则的Packets统计。在Winbox的IP - Firewall - Filter Rules列表里每一行都有Packets和Bytes两列数字。如果某条规则处于启用状态、位置正确并且有流量经过Packets会持续增长。如果数字一直是0那就说明流量根本没走到这条规则上问题出在链选择、匹配条件或者前置规则上。比如你配了一条TLS Host drop规则但Packets始终为0那就应该检查规则是不是在forward链上设备流量是否走了NAT、路径是否正确前置规则是不是提前放行了流量把思路从“规则本身”转向“流量路径”往往能更快定位问题。我自己实际操作中的体会是这套RouterOS过滤方案跑起来之后80%的时间根本不用管它。偶尔需要调整一下黑名单比如听孩子说班上最近流行某款网页小游戏我花半分钟加一条规则就完了。真正省下的是天天跟孩子讲“别看那些乱七八糟的东西”的重复劳动。技术手段解决一部分问题剩下的还得靠沟通和习惯培养但至少路由器这层能自动把大部分不良内容挡在门外家长心里踏实很多。如果你刚开始折腾建议先做好DNS静态屏蔽跑稳几天再加TLS Host和端口保护。一口吃不成胖子路由器配置也一样循序渐进才能真正用起来。
返回列表