很久没更新MikroTik的技术文章了,这次更新一个封禁网站以及特定软件服务的方法,HTTP与HTTPS两种协议均可以正常封禁并重定向,稍后放出方法。
此方法需要配合一台HTTP服务器(理论上可以使用MikroTik自带的HTTP服务器),推荐使用Windows Server 2012及以上版本安装IIS 10.0(其他的也可以,IIS操作比较简单)
前置配置:IIS服务器的IP地址为100.64.1.5
DNS服务器:218.4.4.4,223.6.6.6,8.8.8.8
MikroTik端的配置开启DNS缓存以及设置路由器端的DNS服务器
/ip dns
set allow-remote-requests=yes cache-size=4096KiB servers=218.4.4.4,223.6.6.6,8.8.8.8
#开启DNS53端口挟持(注意这个非常重要)
/ip firewall nat
add action=redirect chain=dstnat comment=dns_UDP/MAIN_NET dst-port=53 protocol=udp to-ports=53
add action=redirect chain=dstnat comment=dns_TCP/MAIN_NET dst-port=53 protocol=tcp to-ports=53
#配置硬件加速(如果不是专用硬件区别不大)
/ip firewall filter
add action=fasttrack-connection chain=forward dst-port=53 hw-offload=yes protocol=tcp
add action=fasttrack-connection chain=forward dst-port=53 hw-offload=yes protocol=udp
下面一步比较重要,需要封禁DoT服务,很多软件内置了DoT(Domain over TLS)不封禁可能会出现部分软件正常工作无法控制协议。
/ip firewall filter
add action=drop chain=forward dst-port=853 protocol=tcp
add action=drop chain=forward dst-port=853 protocol=udp
到这里没有完,这里需要讲一下具体实现的原理,MikroTik里面有一个静态DNS,这个静态DNS可以是domain静态DNS也可以是regexp(正则表达式)静态DNS,说到这里大概都能想到一种原理就是用的SNI(Server Name Indication),TLS下的Relay Hello数据包,这里就带过一下不讲;DNS请求的53端口,数据包没有加密过,可以读取DNS数据包内请求的Domain,正则表达式是直接读取请求的Domain是否包含设置的regexp的字段,如果存在那就直接DNS Static解析到100.64.1.5这台服务器上,由这台服务器返回网页被封禁的页面。
下面来着重讲一下如何获取regexp的值;
例如:我需要封禁2345,到百度搜索一下2345这个公司所有的网站
你会发现他所有的域名都携带xxx.2345.xxx,那么这个公司的大部分服务就是2345这个为重点字段那我在MikroTik上配置Static DNS的条目
/ip dns static
add address=100.64.1.5 regexp=2345 ttl=5s
上面的ttl为生效时间,ttl=5s就是5秒后自动生效下面转到Windows Server的IIS上操作,安装IIS我就不演示了,因为默认安装的IIS就可以运行我需要的服务,不需要安装扩展的CGI
下面我给一段封禁网页的HTML代码,并附上下载通道
<head><title>网站已禁止访问</title></head>
<img src=".\img\pic1.jpg" alt="给你个图片看看" />
<p>这个网站被我吃了,现在不允许打开</p>
创建一个站点,这里设置你的目录并设置一个连接的用户,不然文件IIS服务器没有权限去访问。
下面需要配置这个站点的IP地址以及端口,因为上面需要重定向到这个服务器上,不然是无法显示网站被禁止的页面,主机名不要填写,留空即可。
使用keymanager签发一个证书,然后导出成pfx格式,这个证书只是为了开启IIS监听443端口,没有实际使用的用途,然后到Windows Server上直接安装这个证书
打开IIS的编辑绑定的设置页面
现在这个IIS的443端口被开启监听了,下一步操作就是设置这个站点的404页面,由于大部分请求网页肯定都是带URL请求的网页,如果在IIS上的话那肯定会报错404,要解决这个方法那就直接把404页面解决了就行,怎么解决呢,那就把上面的那个HTML文件设置成404页面啊
现在这个网站实际上是可以工作了,下面测试一下MikroTik的DNS挟持是不是正常工作,我这里试着请求一下2345的网站(使用nslookup)
#不指定DNS服务器默认请求
ping www.2345.com
#指定DNS服务器定向请求
nslookup www.2345.com 223.5.5.5
查看结果
因为ipv6优先级比较高,因为没有配置ipv6的防火墙配置,所以实际上ipv6没限制,这里不能直接不指定DNS服务器nslookup,但是解决方法也很简单,这种方法原封不动在路由器ipv6 firewall上相同方法配置一下即可,区别相差不大。
现在打开网页测试一下是不是被封禁了
测试一下带URL的网页
这个SSL证书显示不安全是因为这个证书是自签发证书,而且证书没有绑定任何域名;
解释一下这个HTTPS拦截的原理,以及显示错误页的服务器为什么要设置HTTPS监听;第一点,现在多数网页都是用的HTTPS,如果被挟持到本地的服务器上必须要求本地服务器支持HTTPS协议以及对应的端口,IIS配置HTTPS主要就是开HTTPS的服务端口;第二点,HTTPS请求后对于服务器来讲是使用2345的域名直接去访问这个服务器上的资源,不需要解析HTTPS协议即可,也不需要使用SNI(实现比较复杂,也可以实现)
Windows11支持DoH(Domain over HTTPS),想要封禁就直接在DNS Static里面填入DoH服务器的域名(因为DoH服务器也需要经过DNS请求获取到DoH服务器的IP地址),不能直接封禁,因为DoH使用的是443端口,封禁会造成其他网站无法正常访问
常用的DoH服务器地址 点我跳转
评论