很复杂的配置过程的样子,而且我比较喜欢手动配置,这样安全性和各种我都能很好控制.还有,发挥最高的处理器自身能力.
所有项目的地址:
https://github.com/shadowsocks/shadowsocks-libev
https://github.com/xtaci/kcptun
https://github.com/wangyu-/udp2raw-tunnel
起步配置要128M RAM OpenVZ,如果是KVM的话.可能需要更高一些,容纳内核开销等,当然如果愿意,开SWAP也可以.客户端,完全可以利用花生棒来解决,只要弱加密,应该是完全够用的.而且主要是,花生棒大概是最便宜的路由开发板了,只要58元.(要是可以移植到ESP32就更爽了,但是我不想浪费这个青春.)
另外,不直接走UDP的KCPTUN,还可以一定程度防止服务器被UDPFlood.(虽然有一些服务器只算出,不算进.),但是毕竟影响服务器质量.最后,再用花生棒自己的穿透能力,把数据流量穿透到花生棒自己的服务器,然后我再手机连接,还不用享受高倍率的KCPTUN放大.真是太爽了.
首先安装依赖包和拉取代码:
apt install -y gcc g++ git gettext build-essential autoconf libtool libpcre3-dev asciidoc xmlto libev-dev libc-ares-dev automake libmbedtls-dev libsodium-dev git clone https://github.com/shadowsocks/shadowsocks-libev.git cd shadowsocks-libev git submodule update --init --recursive
编译也很方便.(然后缺什么,补什么.)
./autogen.sh ./configure make make install
我直接传递参数就能用.
ss-server -s 0.0.0.0 -p 14657 -k xxx -m rc4-md5 -t 300
这时候可以测试下,但是因为没有加速服务器还远,速度肯定不太好.
第二步,编译KCPTUN.前置任务安装go语言(版本1.10或之后,不要从apt安装,因为apt里面的比较老.),并加入到环境变量.貌似还要依赖https://github.com/xtaci/smux.(放到GOPATH路径)
mkdir /opt/gocode -p export GOPATH=/opt/gocode export GOROOT=/root/go export PATH=/root/go/bin:$PATH git clone https://github.com/xtaci/kcptun go get -u github.com/xtaci/kcptun/server go get -u github.com/xtaci/kcptun/client cd kcptun ./build-release.sh
具体错误也不会太难.如果找不到软件包,就放到对应路径,继续就可以.(编译.自然比较慢,耐心重要的.)
kcptun同样支持无配置文件,直接传参数.而且还是静态编译的(这个在本机编译,放远程也是单文件.)
./server_linux_amd64 -t "127.0.0.1:14657" -l ":29900" --mode fast2 --key "xxx" --crypt "none"
看起来是这样的.
简单测试下,因为,运营商可能对UDP封锁,所以可能测试没多久就会挂掉.
"client_windows_amd64.exe" -l :9527 -r 35.231.111.220:29900 -key "xxx" -crypt none -mode fast2
但是,目标是稳定加快速.
直接下载并make,搞定了.没有依赖.
https://github.com/wangyu-/udp2raw-tunnel
得到的udp2raw就是目标.也是静态链接的.(但是作者没有strip).
但是udp2raw和kcptun一样,都希望在路由运行(因为不加密,所以没有什么负载.),但是SOCKS客户端本身,就不要了,因为花生棒这么点能力,还是省省吧.
下载http://archive.openwrt.org/barrier_breaker/14.07/ramips/mt7620a/OpenWrt-SDK-ramips-for-linux-x86_64-gcc-4.8-linaro_uClibc-0.9.33.2.tar.bz2 (不同平台自己找来看)
把工具解压,把Makefile第一行改成CROSS路径的前缀.比如我的是:/root/OpenWrt-SDK-ramips-for-linux-x86_64-gcc-4.8-linaro_uClibc-0.9.33.2/staging_dir/toolchain-mipsel_24kec+dsp_gcc-4.8-linaro_uClibc-0.9.33.2/bin/mipsel-openwrt-linux-uclibc-g++
然后用make cross,就得到目标了.
同样,udp2raw,也一样支持直接运行.
./udp2raw -s -l0.0.0.0:8855 -r 127.0.0.1:29900 -kxxx --raw-mode faketcp -a --cipher-mode none --auth-mode simple
混淆什么全依赖代理程序自身,其他都是不加密,随便来.
本地端
./udp2raw -c -r35.231.111.220:8855 -l0.0.0.0:5000 -kxxx --raw-mode faketcp -a --cipher-mode none --auth-mode simple
最后,服务器安全,让所有的非对外网络,都只监听127.0.0.1
ss-server -s 127.0.0.1 -p 14657 -k xxx -m rc4-md5 -t 300 ./server_linux_amd64 -t "127.0.0.1:14657" -l "127.0.0.1:29900" --mode fast2 --key "xxx" --crypt "none"
不过,还不够,最好是利用服务商提供的防火墙再拦截,比如GCP和Vultr都有相应的防火墙.选用冷门端口.(因为哪怕是iptables设置DROP,到达了你的网卡,服务商就得算你钱.)
既然源码都有了,有空也可以看看是否有什么后门.把对应的SOCKS端口(TCP)映射到花生壳的穿透服务器,那么我本地就可以连接到家里的翻墙服务.(上行也够用,流量我不是土豪也用不了那么多,因为中转过去的流量已经是完全解码的流量,所以并不多消耗,总比在手机装kcptun消耗爽.)
路很绕,但是效果很爽.也不用纠结美西机房坑不坑的问题.
服务器路径:Shadowsocks 服务端 => (由KCP承载) => KCPTUN 服务端 => (由UDP2RAW承载) => 外网
路由器路径:外网 => (由UDP2RAW解码) => UDP2RAW 客户端 => (由KCP解码) => KCPTUN客户端 => 暴露端口给内网机器
内网机器:Windows Shadowsocks 客户端 => 直接连接暴露的端口,当做是直连Shadowsocks 服务端
外网机器: 内网暴露端口 => 花生壳服务器 => 手机直拨 (如果是电脑,推荐使用多种方法,寻求最快的方法.)
为什么没用用路由器的转发功能做透明代理呢?很简单,路由器本身性能有限.如果目标平台是个ARM的板子,不妨性能高度压榨.
实际监听状态:
实际运行:
用另一个机器扫描该IP.
如果加上其他端口拒绝,那就谁也发现不了了.
iptables -I INPUT -p icmp -j DROP
配合我之前写的autodeny,轻松拦截扫描者.
对了,附上完整参考脚本(Debian 9),只编译第一部分.后面的都是单文件,基本等于绿色.
#!/bin/bash PASSWORD=123 # 客户端配置参考(前两个可以路由运行,但是最后一个最好不要,路由性能有限,会让你觉得网络卡炸的.) # # udp2raw -c -r35.231.111.220:40002 -l0.0.0.0:40003 -kxxx --raw-mode faketcp -a --cipher-mode none --auth-mode simple # kcp-client -l :9527 -r 10.0.0.1:40003 -key "xxx" -crypt none -mode fast3 # SS 客户端 => 混淆:aes-256-gcm,IP:127.0.0.1:9527,密码:刚才设置的密码. # 安装基本软件 apt update apt install -y gcc g++ git gettext build-essential autoconf libtool libpcre3-dev asciidoc xmlto libev-dev libc-ares-dev automake libmbedtls-dev libsodium-dev #下载代码 git clone https://github.com/shadowsocks/shadowsocks-libev.git cd shadowsocks-libev git submodule update --init --recursive #编译安装 ./autogen.sh ./configure make make install cd .. rm shadowsocks-libev -rf #下载KCPTUN wget https://github.com/xtaci/kcptun/releases/download/v20180316/kcptun-linux-amd64-20180316.tar.gz tar xf kcptun-linux-amd64-20180316.tar.gz mv server_linux_amd64 /usr/bin/kcp-server rm kcptun-linux-amd64-20180316.tar.gz rm client_linux_amd64 rm server_linux_amd64 #下载UDP2RAW wget https://github.com/wangyu-/udp2raw-tunnel/releases/download/20180225.0/udp2raw_binaries.tar.gz tar xf udp2raw_binaries.tar.gz mv udp2raw_amd64 /usr/bin/udp2raw rm udp2raw* -rf rm version.txt #安装到启动项 cat <<EOF >/etc/rc.local #!/bin/sh -e # # rc.local # # This script is executed at the end of each multiuser runlevel. # Make sure that the script will "exit 0" on success or any other # value on error. # # In order to enable or disable this script just change the execution # bits. # # By default this script does nothing. ss-server -s 127.0.0.1 -p 40000 -k ${PASSWORD} -m aes-256-gcm -t 300 >> /var/log/ss-server.log & kcp-server -t "127.0.0.1:40000" -l "127.0.0.1:40001" --mode fast3 --key "${PASSWORD}" --crypt "none" >> /var/log/kcp-server.log & udp2raw -s -l0.0.0.0:40002 -r 127.0.0.1:40001 -kxxx --raw-mode faketcp -a --cipher-mode none --auth-mode simple >> /var/log/udp2raw.log & exit 0 EOF chmod +x /etc/rc.local systemctl restart rc-local