基于Ngrok端口转发实现storjshare和siacoin farming(上)
WHY?
在我们进行Siacoin、storj和burst的Hosting(或者叫HDD farming)时,都会遇到需要端口转发的问题,原因要么缺乏公网ip,要么所谓公网ip还是个大局域网,解决方法有:
- 让电信等服务商调整为真实的公网ip,进行路由器的端口转发,然后申请一个域名,实时绑定公网ip到DNS,比如No-ip;
- 进行内网穿透。
准备
服务器和域名,阿里云需要在安全组策略开放端口4000-4002和9981-9982,VULTR主机商相对便宜,可以使用支付宝,按小时计费并且可以摧毁服务器以更换ip,支持快照,可以很快完成服务器更换;软件需求:putty和SecureFXPortable。
ngrok
什么是ngrok?ngrok通过安全隧道暴露本地服务器(如你自己的电脑或内网服务器,处于NAT环境和防火墙内)至公共网络。网上教程很多(比如Sunny ngrok教程,并不能成功,他应该是使用的github上面一个项目,叫做Lanproxy,https://github.com/ffay/lanproxy),大多没有附带依赖包,对于没有linux经验的朋友基本难以实现,但此处给出的都是具有依赖包,按顺序安装能够实现,CENTOS6、7,Ubuntu16.04、17.10和树莓派Jessie,服务端和客户端都已经测试,没有问题。
- 添加域名解析,需要设置ngrok服务的域名和子域名都要添加解析,例如设置后面的ngrok.yourdomain.com,那么ngrok和*.ngrok的解析均需要添加A记录:
1
2
|
*.ngrok.yourdomain.com A 全网默认 600 x.x.x.x
ngrok.yourdomain.com A 全网默认 600 x.x.x.x
|
- 根据自己主机平台下载对应的go安装包,使用putty登录后:
1
2
3
|
wget https://storage.googleapis.com/golang/go1.8.3.linux–amd64.tar.gz
tar zxvf go1.8.3.linux–amd64.tar.gz
sudo mv go /usr/local/
|
- 配置go环境变量:
1
2
3
4
5
6
7
8
9
10
11
|
cat > /etc/profile.d/go.sh << EOF
#!/bin/bash
export GOROOT=/usr/local/go
export GOBIN=\$GOROOT/bin
export PATH=\$PATH:\$GOBIN
#(option) export GOPATH=\$HOME/go
EOF
source /etc/profile
go version
|
- 下载ngrok源代码:
1
2
3
|
wget https://coding.net/u/sfantree/p/self_use_OSS/git/raw/master/source/ngrok.tar.gz
tar zxvf ngrok.tar.gz
cd ngrok
|
- 这里说明一下自定义密钥的原因,文档中说明ngrok only makes TLS-encrypted connections,客户端的合法连接依靠证书体系来确定,可以认为服务端和客户端的二进制文件是一一对应的,不过服务端在运行时可以指定证书(server.crt)和私钥(server.key),如果不指定将会使用编译时的证书和私钥(位于assets/server),而rootCA.pem(根证书)编译进客户端是不能与我们的域名完成匹配的,所以我们继续有(下面代码,只用把ngrok.yourdomain.com替换成你自己的域名就可以了):
1
2
3
4
5
6
7
8
9
10
11
|
mkdir ssl
export NGROK_DOMAIN=“ngrok.yourdomain.com”
openssl genrsa –out ssl/base.key 2048
openssl req –new –x509 –nodes –key ssl/base.key –days 10000 –subj “/CN=$NGROK_DOMAIN” –out ssl/rootCA.pem
openssl genrsa –out ssl/server.key 2048
openssl req –new –key ssl/server.key –subj “/CN=$NGROK_DOMAIN” –out ssl/server.csr
openssl x509 –req –in ssl/server.csr –CA ssl/rootCA.pem –CAkey ssl/base.key –CAcreateserial –days 10000 –out ssl/server.crt
/bin/cp ssl/rootCA.pem assets/client/tls/ngrokroot.crt
/bin/cp ssl/server.crt assets/server/tls/snakeoil.crt
/bin/cp ssl/server.key assets/server/tls/snakeoil.key
|
- 此处该进行编译了,直接编译会报错,我们先执行一下,看看报什么错:
1
2
3
4
5
6
7
8
9
|
$ make release–server GOOS=linux GOARCH=386
GOOS=“” GOARCH=“” go get github.com/jteeuwen/go–bindata/go–bindata
bin/go–bindata –nomemcopy –pkg=assets –tags=release \
–debug=false \
–o=src/ngrok/client/assets/assets_release.go \
assets/client/...
make: bin/go–bindata: Command not found
make: *** [client–assets] Error 127
|
- 上述问题是由于进行无法交叉编译,需要去掉$GOBIN的变量声明,解决方法如下:
1
2
3
4
|
export GOPATH=`pwd`
mkdir bin
cp $GOBIN/go–bindata bin
unset GOBIN
|
- 好了,开始进行服务端编译:
1
2
3
4
|
#64位linux server
make release–server GOOS=linux GOARCH=amd64
#32位linux server
make release–server GOOS=linux GOARCH=386
|
- 编译客户端:
1
2
3
4
5
6
7
8
|
#linux
make release–client GOOS=linux GOARCH=amd64
#OS X
make release–client GOOS=darwin GOARCH=amd64
#win
make release–client GOOS=windows GOARCH=386
#armv6l
make release–client GOOS=linux GOARCH=arm
|
- 全部编译完成,再在服务器内输入(端口可以根据需要任意修改,但是tunnelAddr 17543端口,客户端和服务端要保持一致):
1
2
3
4
|
#让ngrokd可以运行
chmod +x bin/ngrokd
#在服务器上运行ngrokd
nohup bin/ngrokd –domain “ngrok.yourdomain.com” –tlsKey=ssl/server.key –tlsCrt=ssl/server.crt –log “/dev/null” –httpAddr=“:8080” –httpsAddr=“:4443” –tunnelAddr “:17543” &
|
- 在使用SecureFXPortable登陆我们的主机,在文件夹ngrok/bin中,可以下载到对应用于运行storjshare和siacoin的服务器、树莓派或电脑的ngrok,下载后,在我们运行storjshare和siacoin的机器上,ngrok所在文件夹,还需要一个ngrok.conf文件,storjshare默认端口4000-4002,siacoin是9981-9982(不要开放9980,如果开放端口9980,其他节点可以偷取你的siacoin):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
server_addr: “ngrok.yourdomain.com:17543”
trust_host_root_certs: false
tunnels:
ssh0:
remote_port: 4000
proto:
tcp: 4000
ssh1:
remote_port: 4001
proto:
tcp: 4001
ssh2:
remote_port: 4002
proto:
tcp: 4002
ssh3:
remote_port: 9981
proto:
tcp: 9981
ssh4:
remote_port: 9982
proto:
tcp: 9982
|
- windows下使用.bat启动ngrok(ngrok.exe -config=ngrok.conf start-all),使用软件SecureFXPortable传输到非windows系统一定使用二进制方式传输ngrok程序,linux命令为(注意ngrok路径对不对):
1
2
|
chmod +x ngrok
./ngrok –config=ngrok.conf start–all
|
- 正常情况,应该呈现:
1
2
3
4
5
6
7
8
9
10
11
12
|
ngrok (Ctrl+C to quit)
Tunnel Status online
Version 1.7/1.7
Forwarding tcp://ngrok.yourdomain.com:4000 -> 127.0.0.1:4000
Forwarding tcp://ngrok.yourdomain.com:4001 -> 127.0.0.1:4001
Forwarding tcp://ngrok.yourdomain.com:4002 -> 127.0.0.1:4002
Forwarding tcp://ngrok.yourdomain.com:9981 -> 127.0.0.1:9981
Forwarding tcp://ngrok.yourdomain.com:9982 -> 127.0.0.1:9982
Web Interface 127.0.0.1:4040
Conn 0
Avg Conn Time 0.00ms
|
转载请注明出处,源自密币之家
基于Ngrok端口转发实现storjshare farming和siacoin farming(下)
前序
- 比较siacoin(sc)和storjshare(storj),密币之家曾经认为,具有自有区块链的sc会远胜于使用ERC20的storj,然而目前看来,这一切变得更微妙;
SC优点:
①对于存储空间需求方是几乎没有什么费用的,相当便宜的单价,需求方可以很容易在sc自有区块链找到持续时间26周、50sc/TB或者更便宜的合约;
SC致命弱点:
①对于存储空间需求方来说,最头疼的是同步日益扩大的钱包区块链数据,目前已经超过8个GB,这是个弊病,需求方本是属于自有存储空间很少,还让需求方首先同步几个GB的数据,并且这会越来越大;
②此外,对于存储空间提供商,不仅需要付出购买机器的成本、网费和2000sc的抵押金(collateral),提供商目前还不能获得任何来自合约的净收益;
③同时密币之家也注意到,storj在discord上的社区用户活跃度日益减少,sc团队将大量时间用于矿机预售,并且传言说好赠送给购买矿机的用户的T-shirt也没有发货,整个矿机官网除了一种神秘感之外没有任何技术公开,密币之家发现其重大的一次更新仅仅是在原有矿机图片上Photoshop上去一些散热孔;
④sc钱包由于仅仅支持64位系统,对32位系统或ARM架构的IoT设备的支持力度不够;
⑤损耗,sc的区块链日益不断出现新的区块,自然会不断的周期性读取和写入数据,移动硬盘不到半年基本会罢工,机械硬盘不是红盘,损耗也会很大,这一点可以通过长期I/O读写日志数据来获得证实;
⑥关于SC在线存储空间提供商也近乎半年多没有任何增长,数据是通过Siahub进行统计,用户可以自行观察,当你的存储提供平台正常上线后,siahub都会显示你所提供的空间信息;
⑦最后,没有集成内网穿透功能,没有公网ip的用户在sc钱包host界面会显示(红叉)”host is unreachable“或者(黄叉)”host is inactive”
⑧sc正在被很多交易所下架,例如http://www.cryptopia.co.nz,也有很多交易所不再考虑上架sc,例如okex.com。
storj优点:
①对于存储空间需求方来说,较为便宜的单价,不需要任何区块链同步(依赖以太坊Ethereum的区块链),使用方便;
②可以使用API进行OSS和FTP存储,有心的用户还可以到Github上寻找一下,社区的一个用户开发了的存储空间需求方具有UI的程序,storj社区极为活跃,技术不断进步,目前提供商的版本也越来越流畅,加入Bridge之后,连接更加稳定;
③storjshare是没有抵押金的,选择硬盘即用,即使你所分享的数据被你丢失(类似于采样定理,只要保持网络节点的一定比例数据冗余率,所有数据都是可恢复的),存储空间需求用户也不会因此丢失数据,你也不会被扣费,快速再次上线即可;
④没有周期性读写硬盘,损耗相对sc减少非常多,即使频繁接收合约数据,一旦完成该合约数据同步,你的平台马上都会进入休眠;
⑤storjshare正被很多交易所上架,起初只有bittrex参与,后来Poloniex也上架了,更值得注意的是,okex.com最近也将storj上架了。
storj蹩脚:
①很遗憾地是,也因为没有自有区块链进行合约费用算法控制,对于存储空间提供商合约费用支付是通过社区每月中旬集体由storj团队手工发送(打工资?),但团队保证后期会引入mini fee payout算法机制,通过storjshare进行自动实时付费,这一功能将在后期storjshare版本中看到;
②和sc一样,不具有内网穿透功能,bridge的生效必须是你曾经与外网发生了链接,对于没有公网ip用户都会显示Tunnel。 - 现在给出storj如何进行HDD farming硬盘出租(或许国内第一篇),并不是像百度“storj”出来内容中“简书”上的一个用户所说,storj只针对部分用户开放,而现在storj是对每个人开放的,大家都可以进行参与存储空间分享。
- By the way, Siacoin farming,在linux 64位和windows 64位系统中很容易实现,在官网获取具有GUI的钱包之后,完成钱包区块链同步,存入2000个sc,即刻开始分享存储空间或者存储内容到区块链,在IoT设备中,如树莓派,社区的一个用户基于GENtoo 64位linux写入了siacoin钱包,并命名为siaberry,大家有兴趣可以烧录到树莓派,实践一下,siacoin的介绍就到此,资料内容均可在上文找到。
步骤一、Check!
一定在进行下面步骤之前,保证用于storj的平台,已经进行内网穿透或者(拥有公网ip)路由端口转发,二者一定需要做一个,这非常重要,相关内容请看上篇。
步骤二、系统
(最廉价)方案 1. 树莓派系统:
storj支持很多系统与架构,甚至IoT设备,如对于树莓派,官方给出了详细的手把手教程,硬件选择也很简单,树莓派+装在硬盘盒子内的机械硬盘(推荐),或者是,树莓派+移动硬盘,长期读写的应用场景不适合使用移动硬盘,鉴于成本考虑,不建议使用SSD,没有必要像官方那样组装硬盘,直接使用硬盘盒子,请自行京东,下面以两块硬盘为例(再次重申,确保你已经进行了内网穿透或者拥有公网ip的用户进行了路由端口转发);
- 创建硬盘挂载目录和设置访问权限,不能使用root用户,storjshare只能由非root用户使用,例如我们假如使用demo,demo用户拥有sudo权限
1
2
3
4
5
6
7
|
sudo mkdir /mnt/s1
sudo mkdir /mnt/s2
sudo mkdir /mnt/s
sudo chmod 757 /mnt/s1
sudo chmod 757 /mnt/s2
sudo chmod 757 /mnt/s
sudo chown demo:demo /mnt/s
|
- fdisk对两块硬盘分区之后(略),再进行格式化,命令如下
1
2
|
mkfs.ext4 /dev/sda1
mkfs.ext4 /dev/sdb1
|
- 安装用于聚合存储空间为一个挂载点的mergerfs
1
2
3
4
|
apt install fuse
wget https://github.com/trapexit/mergerfs/releases/download/2.20.0/mergerfs_2.20.0.debian–wheezy_armhf.deb
dpkg –i mergerfs_2.20.0.debian–wheezy_armhf.deb
rm mergerfs_2.20.0.debian–wheezy_armhf.deb
|
- 使用sudo blkid命令查看机械硬盘UUID号后,修改fstab,使得硬盘能开机自动挂载,注意修改UUID为你自己的号码,以及注意fsname是合并存储空间的挂载点目录
1
2
3
|
UUID=“d1dd875b-95af-4816-8385-7fghcb6s63a6” /mnt/s1 ext4 defaults 0 1
UUID=“f6bc94e0-999b-4dd7-ae85-ad68z9fr6765” /mnt/s2 ext4 defaults 0 1
/mnt/s1:/mnt/s2 /mnt/s fuse.mergerfs defaults,allow_other,use_ino,fsname=s 0 0
|
- 重启后,输入命令df -h能看到如下合并的空间就是正常的了
1
2
3
4
|
文件系统 容量 已用 可用 已用% 挂载点
s 5.4T 6G 5.1T 1% /mnt/s
/dev/sda1 2.7T 75M 2.6T 1% /mnt/s2
/dev/sdb1 2.7T 6G 2.6T 1% /mnt/s1
|
- 使用demo用户输入以下命令
1
|
wget –qO– https://raw.githubusercontent.com/creationix/nvm/v0.33.3/install.sh | bash
|
- 上个命令完成后,退出这个命令输入终端Terminal,然后再开启一个新的命令输入终端Terminal,还是使用demo登入,输入以下命令
1
|
nvm install —lts
|
- 上个命令完成后,退出这个命令输入终端Terminal,然后再开启一个新的命令输入终端Terminal,还是使用demo登入,输入以下命令
1
2
3
|
sudo apt–get update && sudo apt–get dist–upgrade
sudo apt–get install git python build–essential –y
npm install —global storjshare–daemon
|
- npm install命令可能会运行很久,喝一杯咖啡,然后看到结果中有很多黄色ip地址加@的节点信息就证明已经安装成功,下面我们需要使用你自己的storj地址,okex.com上或者myetherwallet可以获得,不能使用其他没有上架storj的交易所或者不支持ERC20的以太坊地址
1
|
storjshare create —storj=填写你自己的storj地址 —storage=/mnt/s
|
- 会得到以下的结果
1
|
storjshare start —config /home/demo/.config/storjshare/configs/47cc82204e418626993257eb4c19c6031eb5e569.js
|
- 上句命令也是启动命令,但是我们需要先等等,修改一下配置文件再启动,47cc82204e418626993257eb4c19c6031eb5e569即是你的节点号码nodeID,我们先看看配置文件,别被吓到,其实大部分是解释内容,实际填写很简单
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
|
{
// Set the STORJ/ERC20 address for receiving contract payments
“paymentAddress”: “这里应该已经显示为你之前填写的地址了”,
// Subscribes to the given contract topics
// See https://storj.github.io/core/tutorial–contract–topics.html
“opcodeSubscriptions”: [
“0f01020202”,
“0f02020202”,
“0f03020202”
],
// An array of bridges to connect and accept contracts,
// send exchange reports and discover network seeds.
“bridges”: [
{
“extendedKey”: “这里是Bridge的通讯密钥请不要公开或修改”
}
],
// Known preferred seeds in form of a storj URI
// Example: “storj://[ip.or.hostname]:[port]/[nodeid]”
“seedList”: [],
// Interface to bind RPC server, use 0.0.0.0 for all interfaces or if you
// have a public address, use that, else leave 127.0.0.1 and Storj Share
// will try to determine your address
“rpcAddress”: “这里填写你内网穿透所用的域名或者动态绑定你公网ip的域名,例如ngrok.yourdomain.com”,
// Port to bind for RPC server, make sure this is forwarded if behind a
// 下面填写你用于storj的端口 storj默认4000 但是可以任意修改为不常被占用的端口
// 如果是内网穿透 请与你的tcp端口保持一致 如果是公网ip进行的路由端口转发 请与转发的端口保持一致
“rpcPort”: 4000,
// Enables NAT traversal strategies, first UPnP, then reverse HTTP tunnel
// if that fails. Disable if you are public or using dynamic DNS
// 已经是内网穿透或者公网ip转发端口的用户请在下面填写true 如果填了false 会在port位置显示为uNuP
// uNuP可以进行基本的hosting 但是链接并不稳定 网络节点会视你为低优先级 不会把大量存储合约转给你
// 没有公网ip或者没有内网穿透用户填写false 但这其实并没有实际意义
// 没有公网ip或者没有内网穿透用户均会显示tunnel 其他网络节点不会给予你数据 即你不会获得存储合约
“doNotTraverseNat”: true,
// Maximum number of tunnels to provide to the network
// 已经是内网穿透或者公网ip转发端口的用户请在下面填写0
// 没有公网ip或者没有内网穿透用户请在下面填写3
“maxTunnels”: 0,
// Maximum number of concurrent connections to allow
“maxConnections”: 150,
// If providing tunnels, the starting and ending port range to open for
// them
“tunnelGatewayRange”: {
“min”: 4001,
“max”: 4003
},
// Number of times to retry joining the network and the wait time between
“joinRetry”: {
“times”: 3,
“interval”: 5000
},
// Temporarily stop sending OFFER messages if more than this number of shard
// transfers are active
“offerBackoffLimit”: 4,
// ECDSA private key for your network identity, your Node ID is derived from
// this and it is used to sign and verify messages
“networkPrivateKey”: “此处是你的网络节点私钥请不要公开或修改”,
// Determines how much detail is shown in the log:
// 4 – DEBUG | 3 – INFO | 2 – WARN | 1 – ERROR | 0 – SILENT
“loggerVerbosity”: 3,
// Path to write the log file to disk, leave empty to default to:
// $HOME/.config/storjshare/logs/[nodeid].log
“loggerOutputFile”: “你的日志输出地址”,
// Directory path to store contracts and shards
“storagePath”: “你所分享存储空间的目录位置”,
// Amount of space to lease to the network, as human readable string
// 你想要分享存储空间大小 单位是B, KB, MB, GB, TB
“storageAllocation”: “4TB”
}
|
- 更改一下目录权限,正式进行storjshare运行时这个目录/home/demo/.config/storjshare里面会有三个文件,分别是configs、shares和logs
1
|
sudo chmod 757 /home/demo/.config/storjshare
|
- 启动storjshare
1
2
|
storjshare daemon
storjshare start —config /home/demo/.config/storjshare/configs/44ce82204e6346766993257ea4c19c1031eb5e569.js
|
- 常见问题是当输入storjshare start时提示daemon没有启动,但当再次启动daemon又说daemon已经运行,此时通常是由于运行storjshare的用户没有目录权限或者daemon没有存储目录/mnt/s的读写权限造成的,其他问题可以查看日志,正常情况下,你已经可以观看当前状态,命令为storjshare status,下图是二十多个小时后的状态
- storjshare的常用控制命令有如下,更多命令可以使用help命令发现
1
2
3
4
5
6
7
8
9
10
11
12
|
#创建新的节点命令
storjshare create —storj=接收storj的地址 —storage=/mnt/s
#启动所创建的节点的命令
storjshare daemon
storjshare start —config /home/demo/.config/storjshare/configs/44ce82204e6346766993257ea4c19c1031eb5e569.json
#重新启动所创建的节点的命令
storjshare restart —nodeid 44ce82204e6346766993257ea4c19c1031eb5e569
#当前状态
storjshare status
|
(最具扩展性) 方案 2. Linux64位系统:
密币之家通过多次实践和尝试后,使用了该种方案,树莓派虽然很优秀,但是性能上还是有所欠缺,特别是要进行搭建多项服务时,资源局限性更会凸显
密币之家安装的linux系统为64位ubuntu 16.04LTS版本,上述步骤,完全可以适用,除了挂载硬盘时所用mergerfs聚合硬盘不同,具体可以参看github页面mergerfs,命令为
1
2
3
4
5
6
7
|
sudo apt–get –y update
sudo apt–get –y install git make
cd mergerfs
make install–build–pkgs
# build-essential git g++ debhelper libattr1-dev python automake libtool lsb-release
make deb
sudo dpkg –i ../mergerfs_version_arch.deb
|
然后按照方案1的方法成功设置后,输入storjshare status,可以看到
由于之前密币之家重装系统,所以时间上只有10天,其实密币之家参与storjshare已经数月有余,上月获得了17个多一点的storj,每月可以到storj社区查看自己storj地址收入多少storj币,社区访问不需要VPN,但是他们的payouts表格是通过google表格进行分享,所以你需要VPN才能访问payouts表格,然后Ctrl+F,查找自己的地址,结算日期为上月1日至上月最后一天,每月中旬进行结算,具体请常常访问社区,如下
(最简单) 方案 3. windows系统:
一般都作为日常工作娱乐的平台,很少会让其24小时开机,所以windows系统方案作为最后推出,但是实现很简单
- 首先到storj官网(storj.io)下载新版钱包,我们选择win64.exe,
- 安装完成后,需要net time辅助时间同步,微软自带时间同步工具无法满足storjshare的应用,时间同步后在启动storjshare,第一步填地址
- 选择存储目录后,设置分享的存储空间大小,再选择你的端口,密币之家提前做了内网穿透,然后需要勾选reachable,下步填写你的内网穿透所用域名即可,对于有公网ip用户,填路由所转发的端口,没有绑定公网ip至域名则填写你的公网ip
- 大功告成!
验证:
需要注意的是:如果你的节点一切正常,但就是没有获得任何Allocs或者Shared,那么首先去https://api.storj.io/contacts/Nodeid,nodeid换成你自己的,本文是47cc82204e418626993257eb4c19c6031eb5e569(非本文作者真实nodeid,仅为举例),那么https://api.storj.io/contacts/47cc82204e418626993257eb4c19c6031eb5e569,点开该链接会获得一个节点信息,里面必须有一项参数response time ,响应时间,如果不存在该项参数,只能回到步骤storjshare create –storj=填写你自己的storj地址 –storage=/mnt/s ,再次重新创建,直到成功为止,这是官方BUG,目前没有修复,这也是Storj官方给出的解决办法,亲测有效。
步骤三、运维
1
|
wget –O install.sh http://download.bt.cn/install/install–ubuntu.sh && sudo bash install.sh
|
- 打开数据监控之后,隔几天就能看到有意思的数据出现
步骤四、整合
有了宝塔面板,该平台不仅可以用于storjshare,大家还可以考虑安装一个nextcloud/owncloud在上面,nextcloud为免费使用,有PC平台/手机平台,其他后续内容将在未来公布。