小计 -- 通过socat 及 ssh port forwarding 实现udp的ssh 端口转发并实现outline 客户端可以正常使用ShadowSock 服务端KeXue上网

最近,有同事想在自己的安卓手机上安装shadowsock软件,发现找不到相应的shadowsock apk安装包。要安装得通过google商店来安装,而google商店,不KeiXue上网,也是没办法安装的,变成死循环了。后来发现,google的outline的apk包是可以下载到的,而且合理配置outline,也可以使用公司已有的SS代理服务器。但是这个代理有个要求,就是shadowsock的tcp和udp端口都是开着的。使用shadowsock客户端可以只用TCP,但要使用outline客户端,就需要有UDP转发支持。ssh 端口转发,是否可以支持udp呢?

公司KeXue上网的架构图

我们线上的代理服务器,使用了ucloud的UDPN高速通道。在国内和香港各开通了一台云主机,然后在这两台云主机之间,启用了ucloud的UDPN高速通道。这个高速通道基本没有丢包,2M起卖,费用在1300元/月。在合理限速后,基本上可以满足整个公司KeXue上网的需求。客户端连接国内的代理服务器,国内和香港的服务器之间使用了ssh 端口转发,默认只支持TCP。
先给一下公司KeXue上网的架构图:

如何让ssh port forwarding 支持UDP?

要使用outline客户端,就需要有UDP转发支持。ssh port forwarding只支持TCP,没办法支持UDP,需要有其它软件支持,才能实现 ,它就是socat。借助socat,可以很方便的让ssh port forwarding来支持udp转发。
下面是使用socat实现 ssh port forwarding UDP的方法:

先建立两个ssh tcp forwarding,请把proxy_server_in_china_ip和ss_server_in_hk_ip换成你的IP或域名

#10001端口是给 SS TCP连接用的
ssh -o ServerAliveInterval=60 -o TCPKeepAlive=yes -f -N -L proxy_server_in_china_ip:10001:localhost:10001 root@ss_server_in_hk_ip

#30001端口是给SS UDP连接用的
ssh -o ServerAliveInterval=60 -o TCPKeepAlive=yes -f -N -L proxy_server_in_china_ip:30001:localhost:30001 root@ss_server_in_hk_ip

###在proxy_server_in_china_ip服务器上,使用socat监听UDP 10001端口,并把UDP 10001端口的数据转发到TCP 30001上
nohup socat -t 15 udp4-listen:10001,reuseaddr,fork tcp:proxy_server_in_china_ip:30001 2>&1 &

###ssh到ss_server_in_hk_ip服务器上,使用socat把ssh port forwarding 过来的tcp 30001端口的数据转发到本机的UDP 10001端口上(也就是SS的10001 UDP端口)
ssh ss_server_in_hk_ip “nohup socat -t 15 tcp4-listen:30001,reuseaddr,fork udp:0.0.0.0:10001 2>&1 &”

这样,就通过socat + ssh port forwarding 实现了SS 10001 UDP的端口转发了。如果你对ssh port forwarding使用有疑惑,可以查看我之前的有关ssh forwarding的相关文章

下面介绍一下,如何设置outline客户端让它可以使用再有的shadowsocks服务器。

为什么要使用outline客户端不直接用shadowsocks客户端?
  • 因为它是免费的
  • 因为它可以在android 和 IOS上使用,也就是手机都可以用
  • 因为它有现成的android apk包
  • 因为shadowsocks在手机上的安装包下不到
    outline的下载地址
    outline 下载地址如下
    如何设置outline 客户端?
    当我安装完outline客户端后,发现它只可以使用一个ss://开头的access-key(访问密钥), 这个访问密钥怎么配置呢?
    配置方法如下:
  1. 把你的shadowsock的加密方式和密码一起生成base64码
    # 比如你的加密方式是 rc4-md5 密码是 A1234567,那么生成base64码的命令如下:
    echo -n rc4-md5:A1234567 | base64
    cmM0LW1kNTpBMTIzNDU2Nw==
    
  2. 把上面生成的base64码用@连接你的SS服务器IP或域名再用:连接端口号,就是你的access-key
    # 请把proxy_server_in_china_ip改成你的IP或域名,把10001改成你的SS服务器的端口,完整的access-key如下:
    ss://cmM0LW1kNTpBMTIzNDU2Nw==@proxy_server_in_china_ip:10001
    
  3. 然后,把上面的内容贴到你的outline access-key中,就可以了。

最后,测试一下你的outline是否可以正常连接到SS服务器上。

如果报错 UDP端口没有打开,可能是你的socat + ssh udp端口转发配置有问题。
如果是连上了,会提示“代理已经连接”,并在手机上生成一个钥匙一样的图标。

坚持原创技术分享,您的支持将鼓励我继续创作!