必读
仅用于技术交流分享,请勿传播此文信息!!!
仅用于技术交流分享,请勿传播此文信息!!!
仅用于技术交流分享,请勿传播此文信息!!!
原理探究
首先,校园网是如何实现认证之后才能使用的呢?
许多高校使用的校园网登录机制都是利用网关拦截数据包,当用户接入校园网且未登录时,进行上网操作发出的数据包就会被网关所拦截.在我们连接到某个需要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的一栏:
点进network → interfaces
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