Arukas容器使用ge.tt替代Endpoint域名
ge.tt 与 Endpoint
前面写了一篇介绍日本 Arukas 樱花容器及使用其 Endpoint 域名的文章,目前我在 Arukas 上面跑了一个 Shadowsocks 容器用于路由器自动爬墙。不过还是发现如果 Arukas 容器的开放端口里开启了 UDP 端口(给 OpenWRT 路由器上的 ss-tunnel
用于转发解析被封锁的域名),这种情况下 Arukas 的 Endpoint 地址就基本没办法正常访问了。文章中我写的 OpenWRT 下自动获取 Arukas 容器 Shadowsocks 配置的脚本也经常出错,用起来还是不太方便。
刚好之前为了给其他人分享文件,我还写了一篇介绍 ge.tt 文件分享 API 的文章,就想到既然 Endpoint 地址访问容易出错,那可以在 Arukas Shadowsocks 容器里使用 ge.tt 的 Python CLI 将容器的当前地址和外部端口配置文件上传到指定的 ge.tt 分享地址,这样 OpenWRT 系统里也能很方便地通过分享地址更新配置文件了。
Arukas 容器修改
这里的 Arukas 容器系统我使用的还是最新 baseimage 系统,增加了 shadowsocks-libev
服务器程序,并将 gett-cli
工具集成到 baseimage 系统,然后将 /etc/my_init.d/01_start_ss_ssh.sh
启动脚本修改为:
#!/bin/bash # Enable SSH rm -f /etc/service/sshd/down /etc/my_init.d/00_regen_ssh_host_keys.sh touch /etc/service/sshd/down # Setup SSH key if [ "x$SSH_AUTHORIZED_KEYS" = "x" ]; then /usr/sbin/enable_insecure_key else mkdir ~/.ssh echo "$SSH_AUTHORIZED_KEYS" | sed 's/\\n/\n/g' > ~/.ssh/authorized_keys chmod 400 ~/.ssh/authorized_keys fi # Start web server env | grep -E '^MARATHON_HOST=|MARATHON_PORT_' > /home/wwwroot/default/marathon.conf if [ "x$MARATHON_HOST" != "x" ]; then getent hosts $MARATHON_HOST | awk '{print "MARATHON_HOST_IP="$1; exit;}' >> /home/wwwroot/default/marathon.conf fi start-stop-daemon -S -b -n tmp-httpd -d /home/wwwroot/default -x /usr/bin/python3 -- -m http.server 80 # Start ShadowSocks env | grep '^SHADOWSOCKS_CFGS_' | awk -F '=' '{print $1;}' | while read T_NAME; do SS_NAME="${T_NAME:17}" echo "${!T_NAME}" > /etc/shadowsocks-libev/${SS_NAME}.json start-stop-daemon -n ss-$SS_NAME -x /usr/bin/ss-server -b -S -- -c /etc/shadowsocks-libev/${SS_NAME}.json -u --fast-open done if [ "x$GETT_TOKEN" != "x" ]; then if [ "x$HOME" = "x" ]; then export HOME="/root" fi echo -n "$GETT_TOKEN" > ~/.gett-token if [ "x$GETT_SHARE_NAME" != "x" ]; then python3 /usr/local/gett/uploader.py -l http://ge.tt/$GETT_SHARE_NAME | awk '{if (substr($5,1,13)=="http://ge.tt/") {print $5;}}' | xargs python3 /usr/local/gett/uploader.py --delete python3 /usr/local/gett/uploader.py -s http://ge.tt/$GETT_SHARE_NAME /home/wwwroot/default/marathon.conf fi fi exec /usr/sbin/sshd -D -e -u 0
这里增加了两个 ge.tt 文件分享服务相关的环境变量,通过 Docker 容器的 ENV 环境变量指定:
GETT_TOKEN
在某台设备上使用gett-cli
工具登录成功之后就能看到~/.gett-token
文件中的 Refresh Token 内容;GETT_SHARE_NAME
预先创建好固定的 ge.tt 分享名(例如:8D95lij2
),可以在 ge.tt 网页中上传文件创建,也可以用gett-cli
工具创建。
如果容器的 ENV 列表里有这两个环境变量,启动脚本会自动将 Arukas 容器的当前地址和外部端口配置文件 marathon.conf
上传到指定的 ge.tt 分享地址。
使用 Shadowsocks 容器
容器的 CMD
指令值以及其它 SSH 公钥和 Shadowsocks 服务器 JSON 配置文件环境变量与 Arukas 容器文章中介绍的相同,可以根据需要自行配置。
我修改后的 Arukas 上支持 ge.tt 并适用于 baseimage 系统的 Shadowsocks 服务器安装包可以从这里下载:
https://zohead.com/downloads/arukas-baseimage-xenial-ss.tar.gz
另外我还制作了一个 ShadowsocksR 服务器安装包,有需要的朋友可以下载测试看看,由于 baseimage 系统已经自带了 Python 3 环境,因此 ShadowsocksR 服务器安装包体积也要小一些:
https://zohead.com/downloads/arukas-baseimage-xenial-ssr.tar.gz
对于容器 ENV 列表中以 SHADOWSOCKS_CFGS_
开头的变量,启动脚本会自动在 /etc/shadowsocks-libev
目录(对于 ShadowsocksR 是 /etc/shadowsocks
目录)下生成 Shadowsocks 或 ShadowsocksR 服务器配置文件,配置文件内容就是该 JSON 格式变量的值。
例如我的 Arukas 容器配置中的 ShadowsocksR 环境变量:
SHADOWSOCKS_CFGS_xxx = { "server":"0.0.0.0", "server_port":8113, "local_port":1080, "password":"ssr-pass", "timeout":30, "method":"aes-128-ctr", "protocol" : "auth_aes128_md5", "obfs" : "http_simple" }
当然对于 ShadowsocksR 容器也需要相应地将 CMD
启动指令改为:
/sbin/my_init -- sh -c 'curl -o /arukas-baseimage-xenial-ssr.tar.gz https://zohead.com/downloads/arukas-baseimage-xenial-ssr.tar.gz && tar -C / -xzf /arukas-baseimage-xenial-ssr.tar.gz && /etc/my_init.d/01_start_ss_ssh.sh'
OpenWRT 自动更新配置脚本
为了能支持从 ge.tt 分享地址下载更新 Shadowsocks 配置,我对 OpenWRT 路由器上的 arukas-ss.sh
脚本也做了修改:
#!/bin/sh ARUKAS_ENDPOINT="" GETT_SHRNAME="" [ $# -ge 2 ] || exit 1 [ -f /tmp/.marathon.conf ] && mv /tmp/.marathon.conf /tmp/.marathon.conf.bak IND=0 while [ $IND -lt 5 ]; do let IND++ [ -f /tmp/.marathon.conf ] && rm -f /tmp/.marathon.conf if [ "x$GETT_SHRNAME" != "x" ]; then T_FILEID=`curl -s -k -f http://api.ge.tt/1/shares/$GETT_SHRNAME | sed -e 's/^.*"fileid"[^:]*:[^"]*"//' -e 's/".*$//'` if [ "x$T_FILEID" != "x" ]; then curl -s -k -f -o /tmp/.marathon.conf -L -e "http://ge.tt/$GETT_SHRNAME" "http://api.ge.tt/1/files/$GETT_SHRNAME/$T_FILEID/blob?download" [ $? -eq 0 ] && break fi fi curl -s -k -f -o /tmp/.marathon.conf https://$ARUKAS_ENDPOINT.arukascloud.io/marathon.conf [ $? -eq 0 ] && break sleep 1 done [ -s /tmp/.marathon.conf ] || exit 1 echo "Fetch server config after $IND tries." if [ -f /tmp/.marathon.conf.bak ]; then cmp -s /tmp/.marathon.conf /tmp/.marathon.conf.bak if [ $? -eq 0 ]; then rm -f /tmp/.marathon.conf exit 0 fi fi . /tmp/.marathon.conf 2>/dev/null if [ "x$MARATHON_HOST" = "x" ]; then rm -f /tmp/.marathon.conf exit 1 fi while [ $# -gt 1 ]; do CMD="echo \${MARATHON_PORT_$2}" SS_PORT=`eval $CMD` if [ -f $1 -a "x$SS_PORT" != "x" ]; then if [ "x$MARATHON_HOST_IP" != "x" ]; then MARATHON_HOST="$MARATHON_HOST_IP" fi sed -i -e 's/"server"[^:]*:[^,]*,/"server" : "'$MARATHON_HOST'",/' -e 's/"server_port"[^:]*:[^,]*,/"server_port" : "'$SS_PORT'",/' $1 fi shift shift done if [ "x$RESTART_SHADOWSOCKS" != "xno" ]; then /etc/init.d/shadowsocks restart fi
使用之前请先根据需要修改脚本最上面的 ARUKAS_ENDPOINT
和 GETT_SHRNAME
变量(一般指定其中一个即可),分别为 Arukas 容器的 Endpoint 名和 ge.tt 分享名,脚本会分别尝试通过 ge.tt 分享地址和 Arukas Endpoint 地址下载容器的 marathon.conf
配置文件。
为了使用简单性考虑,修改后的 arukas-ss.sh
脚本是直接通过 /etc/init.d/shadowsocks
服务脚本重启 OpenWRT 上的 Shadowsocks 客户端程序。该脚本的使用方法也请参考我之前写的介绍 Arukas 容器及 Endpoint 的文章。
最后祝大家心中无墙,玩的开心 ^_^。
YOURFANS:
2017年05月07日 星期日 11:36下午
真是太棒了!
路过人间:
2017年06月17日 星期六 06:03下午
博主辛苦了!感谢您的无私奉献! 我这纯小白照搬都部署成功了.好开心.
奇怪的是看youtube速度:快的时候居然有60000+,慢的时候几十到几百K不等.
我的系统似乎有点小问题.. .复制网页上带有颜色、脚本、背景之类的文字,偶尔会多出空格.
可能因此SSR某个参数错误部署导致不稳定. 还请博主大大闲暇时, 回复一个纯文本的SSR环境变量.
Uranus Zhou:
2017年06月18日 星期日 03:48下午
youtube 速度要看你是什么宽带了,我这南京电信和移动挺快,广电根本放不了。
SSR 参数双击页面中代码那一段就可以编辑,这样就可以直接复制了。
路过人间:
2017年06月18日 星期日 10:51下午
我注意到您的SSR参数里:
“protocol” : “auth_aes128_md5″, “obfs” : “http_simple”
这两个参数冒号两头有空格,而前面的参数冒号两头没有.
Arukas上也奇怪,加不加空格都能部署成功. 只是不清楚最终混淆参数有没生效.
本人水平有限,putty试了很多次登陆容器老是出错. 无法查看生成的json. 让您见笑了!
Uranus Zhou:
2017年06月18日 星期日 11:05下午
json参数有没有空格是没关系的,客户端不使用混淆不能连接那就是成功了;
远程登录需要设置一个 SSH_AUTHORIZED_KEYS 变量(变量值就是 SSH 公钥,需要自己生成),没设置的话就是 baseimage-docker 提供的默认公钥,客户端必须使用私钥登录。
路过人间:
2018年03月03日 星期六 08:58下午
师父,师父。Arukas是复活了吗?
Uranus Zhou:
2018年03月03日 星期六 11:30下午
看起来快了,coming soon 状态,只是免费配额比较低,内存才 128MB。