关于校园网认证机制的研究

必读

仅用于技术交流分享,请勿传播此文信息!!!
仅用于技术交流分享,请勿传播此文信息!!!
仅用于技术交流分享,请勿传播此文信息!!!

原理探究

首先,校园网是如何实现认证之后才能使用的呢?

许多高校使用的校园网登录机制都是利用网关拦截数据包,当用户接入校园网且未登录时,进行上网操作发出的数据包就会被网关所拦截.在我们连接到某个需要Web认证的热点后,我们已经获得了一个内网IP。

在未认证时,如果我们访问HTTP网站,就会路由解析器会劫持我们的http请求然后把我们重定向到一个登录认证界面。

但是机智的群众发现,用于域名解析(DNS)的UDP53端口发出的数据包就不会被拦截。据说,部分其他UDP端口如67、68、69也都开放,我没有测试,感兴趣的同学可以试试。

我们可以做一个简单的测试,连接校园网但是不登录认证,然后命令行运行 nslookup baidu.com,若返回正确的ip地址,则说明你所在的网络中网关并没有对UDP53端口进行拦截。

图片

可以看到川大校园网也是放行了53端口的UDP包。

所以反向思考,只要我们能将我们的流量封装成UDP包,然后走53端口,就能伪装成进行DNS查询的流量突破网关对数据包的拦截,实现免登录上网√<(^-^)>。

解决方法

根据上述的分析,我们可以得知:免认证使用校园网的核心是:将正常流量封装成53端口的UDP流量

所以不管使用什么方法,只要能实现这个目的,都是有效的方法。

总体流程:本机封装成udp走53端口,网关发现是53udp所以放行,服务器监听53并解封,代理访问真正的内容再封装了传回来,本机再解封,实现正常上网。

下面我介绍一些思路。

1. V2ray

V2ray作为知名科学上网工具,可以对流量进行封装,这里我们使用这一特点。优点是简单,一键脚本好配,缺点是,自己玩可以,这玩意挂路由器上连100M估计都跑不到。

安装:

bash <(curl -s -L https://git.io/v2ray.sh)

选择mKCP协议,伪装成udp流量如微信视频聊天的流量,端口选53端口(或上面说的其他开放的udp端口),其他的均可以默认。

其他步骤略。

2. OpenVPN

安装见GitHub,原理同V2ray,自定义端口(选择Custom 然后输入67),协议(UDP协议),即可,略过不表。

3. Gost

和其他各种VPN不同,有一个更加简单、高效的软件gost,这个软件可以建立安全隧道,使用指定的传输协议来包装实际的数据,比如可以用tcp/websocket加上tls来包装wireguard的udp流量,我们今天则是要反过来使用udp协议来包装socks5或者v2ray等软件的数据流量,并在53号端口进行监听。

Gost server端

#前往https://github.com/ginuerzh/gost/releases寻找适合你的系统的版本
wget https://github.com/ginuerzh/gost/releases/download/v2.11.1/gost-linux-amd64-2.11.1.gz
gunzip gost-linux-amd64-2.11.1.gz
chmod +x gost-linux-amd64-2.11.1
mv gost-linux-amd64-2.11.1 /bin/gost

之后即可输入gost来使用程序,建议在screen或者tmux里面运行程序或者使用&和nohup来让gost在后台运行,这样你退出ssh后gost才不会退出。
gost -L socks5+quic://:53或者gost -L socks5+quic://admin:password@:53
如果用的不是socks代理而是其他的软件可以使用
gost -L relay+quic://:53/127.0.0.1:1000
注意到,这里的传输协议我们使用的是QUIC,该协议是基于UDP的,除此之外其他基于UDP的传输协议也可用,如kcp。

Gost client端

客户端也要前往gost的release页面下载对应版本的gost,我的系统是windows,我下载了gost之后还把文件夹加入到了环境变量中,这样在任何地方都可以使用gost了,不然还要指明路径。

如果使用的是socks5代理,那么直接执行
gost-windows-amd64.exe -L :8082 -F socks5+quic://你的服务器ip:53或者gost-windows-amd64.exe -L :8083 -F socks5+quic://admin:password@ip:53

如果用的是其他的软件,如V2则执行
gost-windows-amd64.exe -L tcp://:8082 -F relay+quic://你的服务器ip:53
并修改v2中的ip和端口为你本地的设置即可。

浏览器使用代理

使用switchy omega,协议选之前配的socks5,端口选之前配的8082即可。

配合Openwrt实现全局免认证联网

原理:首先用给路由器配上gost,在端口port1上开一个udp+socks5的通道,然后用redsocks将端口port2的TCP连接导向port1走socks5,最后配置路由器路由表,将所有流量都导向port2即可。

具体步骤如下:

前往releses下载MIPS指令集版本的gost,如gost-linux-mips-softfloat-2.11.1.gz,传到路由器上,并用gunzip解压,接着我使用了上文提到的通过隧道传输socks5的方式。./gost-linux-mips-softfloat -L :8083 -F socks5+quic://admin:password@ip:53,这样本地的8083端口就运行了一个socks5代理了,接着我们需要把所有的流量都走socks5传输,这里我们还需要一个名为Redsocks的软件。

This tool allows you to redirect any TCP connection to SOCKS or HTTPS proxy using your firewall, so redirection may be system-wide or network-wide.

Redsocks可以让我们使用防火墙将TCP连接导向socks5。opkg install redsocks即可安装(redsocks2也类似)。

然后新建一个配置文件 red.conf

base {
log_debug = off;
log_info = off;
daemon = on;
redirector= iptables;
}

redsocks {
local_ip = 192.168.1.1;  #这里填本地ip
local_port = 1081;
ip = 127.0.0.1; 
port = 8083;
type = socks5;
}

保存之后使用redsocks -c ./redsocks.conf运行,成功运行是没有提示的,用lsof -i:1081可以看到端口已经占用。

接着我们需要前往 openwrt的网络->防火墙->自定义规则设置将所有的流量都导向1081端口(记得关闭openwrt上其他的代理软件,避免冲突)。

!!!注意,请一定注意第二块中的不重定向的ip范围!!!要是设置错了就连不上路由器管理界面了!!!不过实在误操作导致连不上的话,重启路由器也能解决。(别问我为什么知道的)

iptables -t nat -N REDSOCKS
iptables -t nat -A PREROUTING -i br-lan -p tcp -j REDSOCKS
iptables -t nat -A PREROUTING -i br-lan -p udp -j REDSOCKS

# Do not redirect traffic to the followign address ranges
iptables -t nat -A REDSOCKS -d 127.0.0.0/8 -j RETURN
iptables -t nat -A REDSOCKS -d 192.168.0.0/16 -j RETURN
iptables -t nat -A REDSOCKS -d 10.8.0.0/16 -j RETURN
iptables -t nat -A REDSOCKS -d 224.0.0.0/4 -j RETURN
iptables -t nat -A REDSOCKS -d 240.0.0.0/4 -j RETURN
iptables -t nat -A REDSOCKS -d 10.0.0.0/24 -j RETURN
# Redirect all kinds of traffic

iptables -t nat -A REDSOCKS -p tcp -j REDIRECT --to-ports 1081
iptables -t nat -A REDSOCKS -p udp -j REDIRECT --to-ports 1081

之后便可以看到路由器中的gost有了输出,然后发现确实可以上网了。

WireGuard

作为目前效率最高(应该是)的隧道方案,WG能在路由器等瘦终端设备上轻松提供千兆级别加密网络隧道。

WG 服务端

默认你使用最新的Debian/Ubuntu Stable Release。推荐使用wg-quick来实现服务端的自动部署。

安装WG:

sudo apt-get install wireguard

配置wireguard:新建一个wg接口的配置文件

nano /etc/wireguard/wg_53.conf

内容填为:

[Interface]
ListenPort = 53
PrivateKey = xxxx

[Peer]
PublicKey = xxxx
AllowedIPs = 10.200.100.1/32

这里有两组key,分别对应服务端与客户端。

生成priv key可以通过:wg genkey

生成pub key可以通过:wg pubkey,粘贴刚刚生成的priv key,回车,然后CTRL+D输入一个EOF

需要生成两组[Interface]下的priv key填第一组的priv key,Peer下的pub key填第二组的pub key。(这里就是在做key exchange)

这份服务端的配置文件的行为:

  • 开了个wg实例,并监听服务器的53端口
  • 配了私钥
  • 定义了一个peer,peer的IP为10.200.100.1,并自动加了路由表(由wg-quick),且生成了peer的密钥对

启用这个wg配置:

sudo systemctl enable wg-quick@wg_53; sudo systemctl start wg-quick@wg_53

使用wg show查看是否启用成功,使用ip a查看对应tun接口是否生成。

WG客户端

展示如何在OpenWRT上配置。

ssh到openwrt上,执行:

opkg update
opkg install wireguard luci-app-wireguard

关于openwrt换源,请自行学习。科大&清华都有

关于lede用户,自行寻找软件源支持。

重启路由器,再登录webui,应该能在status里看到wg的一栏:

image

点进network → interfaces

image

protocol选择wireguard,创建。

这里的privkey填之前生成的第二组的私钥,不要generate。

点到peers那个tab,添加服务器为peer:

pubkey填生成的第一组的pubkey,description随意,allowed IPs填0.0.0.0/0放行所有IP。先不要勾那个route allowed ip。host填服务器地址或域名,端口53。保存。save and apply。然后restart那个interface。

验证WG通联

在openwrt的ssh里ip a找到生成的tun interface,记住名字,然后ping -I 那个名字 1.2.3.4随便生成几个包。这个ping不会有返回的。

点到之前status页,看看:

这个最后握手如果有数据,则说明WG连通里,再继续下一步。

WG无状态,判断连通性只能靠制造一些流量来观察

TODO

2 个赞