S5W2C:一个安卓Socks5服务端

最近自己写了一个安卓app,用于创建一个Socks5服务器,通过WiFi接收局域网客户端的请求,再通过sim卡流量转发出去。比起直接手机开热点,这种方式可以避免走全局浪费流量,同时也能保留局域网的访问。

可能的使用场景

  1. 办公室或学校等环境的网络有限制,有些网站没法访问,利用这个app可以让其他设备通过手机流量访问这些网站;
  2. 手机上有一张境外卡,并且能在内地上谷歌等网站(例如港澳那边就有不少这种卡),这样在内地的时候就可以利用这个app把手机当成tz,让其他设备上谷歌。

Socks5代理流程

  1. 客户端与服务端握手,服务端向客户端发送认证方式;
  2. 客户端向服务端发送连接信息,包括目标服务器的地址、端口(如果是UDP,则地址端口处为客户端发送UDP的地址与端口,也可以为0),服务端向客户端发送响应,连接成功;
  3. 服务端向目标发送请求,然后向客户端发送响应内容。

(目前实现了Connect命令(TCP连接)以及UDP连接,Bind还未实现,IPv6的目标地址也还不支持,以后有空继续)

同时使用WiFi和Cellular

在安卓里,当WiFi和Cellular(sim卡流量)同时开启的时候,默认都是走WiFi,除非WiFi没法访问互联网。要让app主动使用Cellular,就需要通过ConnectivityManager和NetworkRequest来获取到对应的Network,然后就可以用这个Network的SocketFactory来创建一个Socket,相当于把这个Socket绑定到了sim卡上。

后台运行服务

默认情况下,服务(service)在手机锁屏不久后,就会中断,要让它在锁屏之后还能继续运行,就需要使用foreground service的方式来打开服务。

后续工作

  1. 利用tun2socks来代理手机本机app(其实用V2rayNG来作为一个Socks5客户端也可以,不过后面我也会想办法自己实现一个)
  2. Socks5代理还是有一些bug,有时候客户端会请求失败,目前还不知道要怎么处理,只能慢慢排查

参考

  1. https://www.cnblogs.com/cc11001100/p/9949729.html
  2. https://en.wikipedia.org/wiki/SOCKS#SOCKS5
  3. https://www.v2ex.com/t/933502
  4. https://developer.android.com/reference/android/net/Network
  5. https://yundeesoft.com/7474.html
  6. https://datatracker.ietf.org/doc/html/rfc1928
  7. https://www.jianshu.com/p/cf88c619ee5c

发表评论

您的电子邮箱地址不会被公开。 必填项已用 * 标注