Gnirehtet:让Android可以通过USB方式上网
项目简介
Gnirehtet是一个非常优秀的项目。该项目为Android设备提供了通过adb方式的反向代理。它允许Android设备通过USB使用所接入计算机的Internet网络,并且计算机和Android设备都不需要任何root权限。它的服务器可以运行在GNU/Linux、Windows和Mac OS上,客户端需要运行在Android Lollipop API 21 及以上。
Gnirehtet的当前版本(v2.4)支持通过IPv4传输TCP和UDP协议的数据,但不支持IPv6。
它是如何工作的
客户端(Client):android设备视为客户端。注册VPN服务,以拦截整个设备的网络流量。
服务器(Relay Server):计算机(Windows、GNU/Linux或Mac OS)视为服务器。也称作中继服务器。
客户端仅建立与服务器之间的TCP连接;并通过该TCP连接以字节数组的形式交换原生IPv4数据包;
客户端和服务器之间的TCP连接在开始反向端口重定向后由adb建立,反向端口重定向命令如下:
1  | adb reverse localabstract:gnirehtet tcp:31416  | 
这意味着服务器必须监听31416端口,并且客户端的所有的sockets连接都将由adb重定向到服务器的31416端口上。所以务必确保服务器的31416端口未被其他程序占用,务必确保服务器和客户端之间的USB连接是正常且稳定的。
服务器从连接的客户端上接收IPv4数据包并且根据数据包与对应的目标IP建立sockets连接,然后开始双向中继传输数据。
这就需要服务器在OSI model上以Level 3(客户端一边)和Level 5(外网一边)之间传输数据包;
为什么选择它
当Android设备的WIFI不够稳定时,或想获得更高的下载速度,或其他一些原因;
要求
Android设备需要启动adb debugging ;
Java 8的运行时环境,在
Debian-based发行版上,需要openjdk-8-jre;adb 1.0.36及以上,因为需要adb reverse支持;服务器的
31416端口未被占用且网络正常;
下载
根据需要下载对应的版本,建议下载最新版本:Last Release
Rust 版本
- Linux:  
gnirehtet-rust-linux64-XXX.zip - Windows: 
gnirehtet-rust-win64-XXX.zip - Mac OS: 
gnirehtet-rust-macos64-XXX.zip 
Linux和Mac OS zip文件解压后包含以下文件:
gnirehtet.apk:安装在客户端上。gnirehtet:安装在服务器上。
Windows zip文件解压后包含以下文件:
gnirehtet.apk:安装在客户端上。gnirehtet.exe:安装在Windows服务器上。gnirehtet-run.cmd:快速启动gnirehtet的批处理文件。
Java 版本
- 全平台: 
gnirehtet-java-XXX.zip 
解压后包含以下文件:
gnirehtet.apk:安装在客户端上。gnirehtet.jar:部署在服务器上gnirehtet:部署在服务器上gnirehtet.cmd:部署在Windows服务器上gnirehtet-run.cmd:快速启动gnirehtet的批处理文件。
运行
在服务器上启动服务,该服务不提供用户界面,以控制台终端的形式呈现:
1  | ./gnirehtet relay  | 
在Ubuntu上使Gnirehtet不占用命令行终端在后台运行:
1  | sudo nohup ./gnirehtet relay &  | 
在客户端上安装APK:
1  | adb install -r gnirehtet.apk  | 
设置反向端口重定向并启动APP,该APP不提供用户界面,以Android Service的方式运行在系统后台:
1  | adb reverse localabstract:gnirehtet tcp:31416  | 
停止客户端:
1  | adb shell am start -a com.genymobile.gnirehtet.STOP -n com.genymobile.gnirehtet/.GnirehtetActivity  | 
停止服务器:
1  | 在gnirehtet的命令行终端上按下Ctrl + C组合键  |