长沙理工大学:校园网解除共享限制

为了 保障校园网的营运利润 维护校园网络安全学校在规定上是不允许校园网再设置路由器进行后续共享的而实际上也在防火墙进行了相关验证对检测出的有共享嫌疑的账号会给予临时封禁

所谓的临时封禁也就是屏蔽所有网络流量并对HTTP报文构造一个虚假的301跳转将用户的浏览器跳转到http://1.1.1.3/remind/proxy_remind.htm?tm=8这个网址但是可能由于配置上的失误这个网址也是并不能正确显示的URL我们可以推断出应该是一个用户友好的一个检测到共享行为的提示页面此外这个URL是已知的出现在深信服防火墙上面过的可以假设学校使用的就是深信服的设备

这一规定的出发点可以理解但是对于广大学子的日常生活确实造成了诸多不便尤其是计算机相关专业的同学由于专业学习的需要多设备组建局域网乃至虚拟机多开等都是非常常见的需求但这些行为同时也是构成了事实上的共享会被封火墙检测并封禁极大的阻碍了有此类需求的相关专业同学的学习

鉴于学校也不可能为我们这些专业的同学开绿灯那么我们只能自行动手从技术上解决矛盾了

通过一段时间的观察可以得到我校校园网前端的计费系统采用城市热点的Dr.COM的计费系统这是一套非常常见的计费系统BRAS终端是锐捷的设备采用POE方式连接锐捷的AP似乎没有参与认证

我将校园网分为三大类接入方式无线办公区有线学生公寓有线

前两者都是DHCP+Portal验证网页表单提交账号即可完成验证学生公寓区域的有线设备有两种认证方法要么使用学校提供的Dr.COM6.0.0D客户端登陆要么直接在系统中PPPoE拨号账号信息就是校园网账号本身两个方式应该本质上是同一个都是PPPoE

因此路由的接入方式便确定了宿舍的有线直接PPPoE认证就可以正常上网了对于Portal的要麻烦一些若无法连接外网则判断Portal能否访问能访问的话提交一个构造好的POST包登录即可

但是共享检测的问题还没有解决此时虽然已经可以通过路由上网了但是还是没法共享

查询相关资料检测共享主要有两个思路一个是通过流量的特征来识别另一个是深度包内容检测

前者比较好理解就是寻找经过NAT后的流量有什么不同的地方比如经过NAT后的包TTL会加一后者则是通过分析流量的内容从逻辑上证明有共享行为比如同一个账户既连接了小米的服务器又连接了苹果的服务器那么一定程度上就可以认为存在小米与苹果设备的共享这种检测一方面要有足够强大的数据库对于流量要有准确识别标记的能力另一方面这种方式也存在相当的误杀率实施时要有足够精明的策略这种检测往往是由防火墙企业统一进行维护不断下发数据来维持的

针对前者我们需要在NAT设备上修改相关特征使其看起来正常后者如果是简单的策略针对性处理即可如果是成体系的数据库对流量进行统计那基本没辙基本只有所有流量加密穿透出去这一条路可走

经过一段时间摸索发现如下规律

  • 两台小米手机不同型号可以正常同时上网
  • Mi 6+MiPad 2Windows 10系统在较短时间内会被封禁网络
  • 封禁时手机QQ的消息可以正常接收但群聊中的图片无法显示不知道是什么问题可能是QQ推送用的长连接是在阻断前建立的防火墙没有阻断
  • 初步判断平板使用HTTPS协议上网时不会被检测一旦连接HTTP协议的网站就会触发
  • 被封禁后重新登录校园网就可以解除
  • 浏览器时常提示等待 1.1.1.3 …疑似HTTP劫持插入了js或者Flash不排除利用jsFlash拿到更多设备信息的可能

可以初步确定应该就是通过HTTP报文中的UA来进行识别的太复杂的规则学校是不敢部署的即使是0.01%的误杀率都意味着每天都可能有人去投诉

那我们就可以得到初步方案了尽可能处理掉明显的包特征同时针对HTTP内容替换为统一的UA

下面的实施方案都基于OpenWRT的路由器由于部分处理需要特定的内核模块支持需要有适配的源码

包特征处理

设备发出的数据包有一个默认的TTL且不同系统也有不同Windows128安卓与iOS默认为64

在路由上修改数据包的TTL为同一个值即可

Ref: TTL modification for outgoing traffic with OpenWRT

注意筛选规则用了ipopt模块ipopt在编译时不会默认勾选记得在内核的防火墙模块处勾选ipopt

iptables -t mangle -I POSTROUTING -o br-lan -j TTL --ttl-set 65

TCPSYN包会泄露主机的时间戳不同的主机时间造成时间戳不同

有两个方案一个是劫持各设备的NTP服务到路由统一时间但手机与基站通信时可能会同步基站时间所以影响准确度另一个是直接删掉SYN包中的时间戳但暂无成熟的实现先暂时使用前者

Openwrt系统设置设置正确的NTP服务器后勾选作为 NTP 服务器提供服务并保存

设置以下防火墙规则劫持NTP到路由192.168.1.1

iptables -t nat -N ntp_force_local
iptables -t nat -I PREROUTING -p udp --dport 123 -j ntp_force_local
iptables -t nat -A ntp_force_local -d 0.0.0.0/8 -j RETURN
iptables -t nat -A ntp_force_local -d 127.0.0.0/8 -j RETURN
iptables -t nat -A ntp_force_local -d 192.168.0.0/16 -j RETURN
iptables -t nat -A ntp_force_local -s 192.168.0.0/16 -j DNAT --to-destination 192.168.1.1

IPID检测各设备的起始值不同并随着包数量的上升而上升若有多个设备长时间使用后会呈现出多条上升序列

因需要的检测时间较长通常为数天所以定时重新拨号即可打断检测过程

也可以修改IPID为随机值但网上的现有方法似乎过于古老无法使用

设置如下crontab即可在每天凌晨三点重新拨号

0 3 * * * ( ifdown wan; sleep 5; ifup wan )

以上规则来自网友分享

侵入流量屏蔽

深信服侵入式检测Android 和 iOS 不要一起连
如果不给连手机的话手机也不要连手机和电脑通过 UA 检测
电脑和电脑检测通过 HTTP 劫持检测屏蔽 TTL 为 127189 的包就好把防火墙加入路由器

iptables -I FORWARD -p tcp -m tcp –sport 80 -m u32 –u32 5&0xFF=0x7F -j DROP
iptables -I FORWARD -p tcp -m tcp –sport 8000 -m u32 –u32 5&0xFF=0x7F -j DROP
iptables -I FORWARD -p tcp -m tcp –sport 8080 -m u32 –u32 5&0xFF=0x7F -j DROP
iptables -I FORWARD -p tcp -m tcp –sport 80 -m u32 –u32 5&0xFF=0x80 -j DROP
iptables -I FORWARD -p tcp -m tcp –sport 8000 -m u32 –u32 5&0xFF=0x80 -j DROP
iptables -I FORWARD -p tcp -m tcp –sport 8080 -m u32 –u32 5&0xFF=0x80 -j DROP

这一条规则来自V2EX的网友


Openwrt防火墙的流量规则设置如下规则

源区域WAN源地址1.1.1.3目标区域设备动作拒绝

源区域WAN源地址1.1.1.1目标区域设备动作拒绝


iptables -I FORWARD -p tcp --sport 80 --tcp-flags ACK ACK -m string --algo bm --string " src=\"http://1.1.1." -j DROP
iptables -I FORWARD -p tcp --sport 80 --tcp-flags ACK ACK -m string --algo bm --string " value=\"http://18.20.18." -j DROP

此规则来自校友的博客

HTTP UA处理

网上有很多利用Proxy来实现的教程这里不推荐主要是太影响速度

现有其他大学的前辈开发出的内核级处理插件CHN-beta/xmurp-ua @GitHub直接使用该插件即可

断线重启

若发现意外被封禁自动重启拨号

#!/bin/sh
DATE=`date +%Y-%m-%d-%H:%M:%S`
tries=0
while [[ $tries -lt 3 ]]
do
        if /bin/ping -c 1 8.8.8.8 >/dev/null
        then
                echo --- exit ---
                exit 0
        fi
        tries=$((tries+1))
        sleep 2
done

echo $DATE network restart >>my_watchdog.log
#/etc/init.d/network restart
ifdown wan
sleep 2
ifup wan

将其保存到路由的/home目录并设置如下crontab15秒运行一次

* * * * * ( sleep 15 ; sh /root/my_watchdog.sh )
* * * * * ( sleep 30 ; sh /root/my_watchdog.sh )
* * * * * ( sleep 45 ; sh /root/my_watchdog.sh )
* * * * * sh /root/my_watchdog.sh

DNS处理

这么操作完后外网可以正常使用但是学校的内网资源反而全部没法正常访问了发现是路由无法解析出正确的IP地址

暂时没弄清楚原因直接人工提供预解析的地址列表给Dnsmasq算了

xk.csust.edu.cn [10.255.252.1]
pt.csust.edu.cn [10.255.65.85]
yktfw.csust.edu.cn [10.255.197.207]
htp.csust.edu.cn [10.255.193.63]
my.csust.edu.cn [10.255.193.63]
www.csust.edu.cn [10.255.196.28]
oss.csust.edu.cn [10.255.195.22]
glis.csust.edu.cn [210.43.188.8]
bw.csust.edu.cn [10.255.194.29]
cwcx.csust.edu.cn [10.22.14.252]
lx.csust.edu.cn [10.255.193.63]
jwc.csust.edu.cn [210.43.177.10]
xg1.csust.edu.cn [10.255.193.63]
yktwd.csust.edu.cn [10.255.197.218]
cxwx.csust.edu.cn [10.255.198.50]
opac.csust.edu.cn [10.255.198.50]
nginx.csust.edu.cn [10.255.198.50]
app.csust.edu.cn [10.255.196.35]
acm.csust.edu.cn [10.64.70.166]