发布于Software分类中的文章

Oct 12

源码: Psiphon 3 Tunnel Core 项目
编译:
原项目中关于编译说的比较简单笼统,这里详细说下。
首先确认 Go 编译环境已经安装好,可以参考 Tomatoware ARM 下建立 Go 编译环境 一文。
然后要下载一些依赖及源程序:
go get -u -v github.com/Psiphon-Inc/bolt
go get -u -v github.com/Psiphon-Inc/dns
go get -u -v github.com/Psiphon-Inc/goptlib
go get -u -v github.com/Psiphon-Inc/goregen
go get -u -v github.com/Psiphon-Inc/ratelimit
go get -u -v github.com/Psiphon-Inc/crypto/nacl/box
go get -u -v github.com/Psiphon-Inc/crypto/nacl/secretbox
go get -u -v github.com/Psiphon-Inc/crypto/ssh
go get -u -v github.com/Psiphon-Inc/goarista/monotime
go get -u -v github.com/Psiphon-Inc/goselect
go get -u -v github.com/Psiphon-Inc/sss
go get -u -v github.com/Psiphon-Inc/gocapability/capability
go get -u -v github.com/Psiphon-Inc/m3u8
go get -u -v github.com/Psiphon-Labs/psiphon-tunnel-core

写个编译脚本:

#!/bin/sh

WORKDIR=$(pwd)

cd src/github.com/Psiphon-Labs/psiphon-tunnel-core

BUILDDATE=$(date --iso-8601=seconds)
BUILDREPO=$(git config --get remote.origin.url)
BUILDREV=$(git rev-parse --short HEAD)
GOVERSION=$(go version | perl -ne '/go version (.*?) / && print $1')
DEPENDENCIES=$(echo -n "{" && go list -f '{{range $dep := .Deps}}
{{printf "%sn" $dep}}{{end}}' | xargs go list -f '{{if not .Standard}}
{{.ImportPath}}{{end}}' | xargs -I pkg bash -c 'cd $GOPATH/src/pkg
 && echo -n "\"pkg\":\"$(git rev-parse --short HEAD)\","' | sed 's/,$/}/')

LDFLAGS="
-X github.com/Psiphon-Labs/psiphon-tunnel-core/psiphon/common.buildDate=$BUILDDATE 
-X github.com/Psiphon-Labs/psiphon-tunnel-core/psiphon/common.buildRepo=$BUILDREPO 
-X github.com/Psiphon-Labs/psiphon-tunnel-core/psiphon/common.buildRev=$BUILDREV 
-X github.com/Psiphon-Labs/psiphon-tunnel-core/psiphon/common.goVersion=$GOVERSION 
-X github.com/Psiphon-Labs/psiphon-tunnel-core/psiphon/common.dependencies=$DEPENDENCIES 
"

cd ConsoleClient && go build -ldflags "${LDFLAGS}"
mv -f ./ConsoleClient ${WORKDIR}/bin/psiphon-tunnel-core-$BUILDREV
cd ${WORKDIR}
strip bin/psiphon-tunnel-core-$BUILDREV
upx -9 bin/psiphon-tunnel-core-$BUILDREV

bin/psiphon-tunnel-core-$BUILDREV

命令行运行:
./psiphon-tunnel-core -config ./psiphon.config -serverList ./server_list.dat -listenInterface br0 -formatNotices

psiphon.config 以及 server_list.dat 文件可以从 Windows 版本的 Psiphon3 (赛风3) 安装版本中提取。
运行结果:
psiphon-tunnel-core: Starting psiphon-tunnel-core...
2016-10-12T02:52:38Z BuildInfo {"buildDate":"2016-09-27T16:28:36+08:00","buildRepo":"https://github.com/Psiphon-Labs/psiphon-tunnel-core","buildRev":"31dad76","goVersion":"go1.6","gomobileVersion":"go1.6"}
2016-10-12T02:52:38Z AvailableEgressRegions {"regions":["CA","DE","GB","IN","JP","NL","SG","US"]}
2016-10-12T02:52:38Z ListeningSocksProxyPort {"port":7788}
2016-10-12T02:52:38Z ListeningHttpProxyPort {"port":8788}
2016-10-12T02:52:38Z ImpairedProtocolClassification {"classification":{}}
2016-10-12T02:52:38Z CandidateServers {"count":153,"protocol":"","region":""}
2016-10-12T02:52:42Z Homepage {"url":"http://www.psiphontoday.com/zh/index_desktop.html?client_region=CN"}
2016-10-12T02:52:42Z ClientUpgradeAvailable {"version":"116"}
2016-10-12T02:52:42Z Tunnels {"count":1}

出现 Tunnels {"count":1} 字样就表示连接服务器成功了。

新版编译出错:
# github.com/Psiphon-Labs/psiphon-tunnel-core/psiphon/common/tls
/mnt/data/compile/go/src/github.com/Psiphon-Labs/psiphon-tunnel-core/psiphon/common/tls/tls.go:106: undefined: deadlineTimeout

修改:

if !dialer.Deadline.IsZero() {
  		deadlineTimeout := dialer.Deadline.Sub(time.Now())
  		if timeout == 0 || deadlineTimeout < timeout {
  			timeout = deadlineTimeout
  		}
  	}

参考: https://github.com/golang/go/issues/14595


Mar 27

样本是 China Domain List,平台是 ASUS RT-AC68P ARM + Tomato,DNS 解析程序都是静态编译。支持排除/指定解析列表的,都加载了样本域名。没什么太大实际意义,蛋疼而已。

Unbound
Statistics:

Queries sent: 26919
Queries completed: 26832 (99.68%)
Queries lost: 87 (0.32%)

Response codes: NOERROR 20030 (74.65%), SERVFAIL 6714 (25.02%), NXDOMAIN 88 (0.33%)
Average packet size: request 28, response 50
Run time (s): 69.774275
Queries per second: 384.554336

Average Latency (s): 0.238396 (min 0.000236, max 4.992936)
Latency StdDev (s): 0.389999

Pdnsd:
Statistics:

Queries sent: 26919
Queries completed: 23513 (87.35%)
Queries lost: 3406 (12.65%)

Response codes: NOERROR 23234 (98.81%), SERVFAIL 171 (0.73%), NXDOMAIN 108 (0.46%)
Average packet size: request 28, response 59
Run time (s): 314.555457
Queries per second: 74.749935

Average Latency (s): 0.596292 (min 0.000358, max 4.999555)
Latency StdDev (s): 1.019165

dnsforwarder:
Statistics:

Queries sent: 26919
Queries completed: 25401 (94.36%)
Queries lost: 1518 (5.64%)

Response codes: NOERROR 25401 (100.00%)
Average packet size: request 28, response 61
Run time (s): 183.965017
Queries per second: 138.075165

Average Latency (s): 0.416087 (min 0.000227, max 4.999129)
Latency StdDev (s): 0.644664

ChinaDNS:
Statistics:

Queries sent: 26919
Queries completed: 21331 (79.24%)
Queries lost: 5588 (20.76%)

Response codes: NOERROR 21232 (99.54%), SERVFAIL 13 (0.06%), NXDOMAIN 86 (0.40%)
Average packet size: request 28, response 57
Run time (s): 363.248690
Queries per second: 58.722855

Average Latency (s): 0.375668 (min 0.015623, max 4.569101)
Latency StdDev (s): 0.340221

Pcap_DNSProxy
Statistics:

Queries sent: 26919
Queries completed: 25476 (94.64%)
Queries lost: 1443 (5.36%)

Response codes: NOERROR 25205 (98.94%), SERVFAIL 158 (0.62%), NXDOMAIN 113 (0.44%)
Average packet size: request 28, response 57
Run time (s): 513.577050
Queries per second: 49.605020

Average Latency (s): 1.716650 (min 0.059361, max 4.998602)
Latency StdDev (s): 1.207510


Mar 25

Windows 7 豪华中文版,在线安装英文语言包失败,用 Vistalizator 安装也失败。

查看出错代码 0x80070052。

原来是我把系统临时目录设到了内存盘,而这个内存盘为了性能我使用的是 FAT32 格式~ 安装语言包时它会解压 N 多个小文件/文件夹到临时目录,可能就是这出了问题。重新格式化内存盘为 NTFS 格式,安装成功!

FAT32 标称为65534,实际到2万+时已不稳定。
NTFS 似乎没有明确限制单目录文件数量,但有人反应在生成10万+ 文件的目录时遇到报错,想来应该是和文件属性(文件名等)、磁盘使用状况相关,至于对效率的影响,可以参考以下内容,以下内容为转载

似乎 FAT32 文件系统下的单一目录下的文件数限制在 20000 -30000 之间的一个数字。。。

具体就不知道是哪个了。。因为我在 解压一个有 30000 多个文件的 rar 文件到 fat32 目录的时候出现 磁盘满的提示。。但是磁盘并没有满。。。 每个目录都要描述它的内容所在的磁盘位置,名字等信息。这些信息是连续存放的,而且空间有限,用完了就不能再加了。改进的文件系统,目录信息自身也是在磁盘上不连续分布的,就没有这个问题了。不过一般来讲这个都不是问题。在文件很多的系统中,往往会自己创建子目录进行分类。比如VSS.
对于FAT16文件系统,可以保存的文件体积最大值是 4 GB - 1 byte (2^32 bytes - 1 byte);卷的最大体积是4GB;每个卷上最多可以保存的文件数量是65,536个 (2^16);根目录下可以保存的文件和文件夹数量最大值是512个(如果使用了长文件名,该数字还会减小)

对于FAT32文件系统, 可以保存的文件体积最大值是 4 GB - 1 byte (2^32 bytes - 1 byte);Windows自带的工具可以创建的卷的最大体积是32GB;每个卷中最多可以保存的文件数量是4,177,920个;一个特定文件夹中最多可以保存的子文件夹和文件的数量是65,534(如果使用了长文件名,那么该数字会减小)

对于NTFS文件系统,可以保存的文件的大小的最大值,理论上是16EB - 1 KB (2^64 bytes - 1 KB)(1EB=1024PB=1024TB=1024GB) ,实际实现过的最大值是16TB - 64 KB (2^44 bytes - 64 KB);卷的体积最大值,理论上可以达到2^64个簇 - 1个簇,实际实现过的最大值是2^56 TB - 64 KB ( 2^32 个簇 - 1个簇);每个卷可以包含的文件个数的最大值是4,294,967,295个 (2^32 - 1)

理论上FAT32单个目录下,最多可以包括65534个子目录或者文件。但是如果采用长文件名命名的话,实际可以容纳的文件数目会远远小于6万多。2万多属于正常现象。

NTFS克服了这个问题,但是对于单个目录下多文件的操作(拷贝,移动或者删除),比如说几万个小文件,每个十几k大,仍然十分头疼,个人觉得是死穴,也是正常现象。


Mar 23

一个是做 DNSSEC 的
auto-trust-anchor-file: "/opt/etc/unbound/root.key"
一个是
use-caps-for-id: yes
开启这两个参数任意一个,如果转发的 DNS (若干)上游服务器稍有“不遵循规范”的就会返回空值:

wrong 0x20-ID in reply qname
......
Capsforid fallback: getting different replies, failed
......

具体没做细研究了!

Use 0x20-encoded random bits in the query to foil spoof
attempts. This perturbs the lowercase and uppercase of query
names sent to authority servers and checks if the reply still
has the correct casing. Disabled by default. This feature is
an experimental implementation of draft dns-0x20.

Tags: ,

Mar 18

1. 下载 JDK,用 7-zip 解压出 tools.zip;
2. 解压 tools.zip 文件到目标目录,例如: e:/JavaJDK;
3. 运行:
for /R %f in (.\*.pack) do @"D:\JavaJDK\bin\unpack200" -r -v -l "" "%f" "%~pf%~nf.jar"
4. 添加系统环境变量 JAVA_HOME 以及相关 bin 路径;
5. 添加注册表相关值;
x86:

Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft]
[HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Runtime Environment]
[HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Runtime Environment\1.8]
"JavaHome"="E:\\JavaJDK"

x64:

Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\JavaSoft]
[HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\JavaSoft\Java Runtime Environment]
[HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\JavaSoft\Java Runtime Environment\1.8]
"JavaHome"="E:\\JavaJDK"

这样系统内基于 Java 的程序都能正常运行了,开发也没问题。

Tags: ,

Jan 05

想利用 DD-WRT 支持 Buffalo WZR-1750DHP 全部 512M 内存的固件来做编译机,安装了 Tomatoware。

编译一些无需通过 automake/autoconf 生成 Makefile 的源程序都没啥问题,但是一旦编译通过 autogen.sh (应该调用 automake 等程序)生成的 Makefile 就会直接出错,信息类似:

[goflex@GoFLEX:/home/local/goflex/work/shairport-sync_git 35%] ~ make
make all-recursive
make[1]: Entering directory '/home/local/goflex/work/shairport-sync_git'
Making all in man
Makefile:518: recipe for target 'all-recursive' failed
make[1]: *** [all-recursive] Error 1
make[1]: Leaving directory '/home/local/goflex/work/shairport-sync_git'
Makefile:371: recipe for target 'all' failed
make: *** [all] Error 2
[goflex@GoFLEX:/home/local/goflex/work/shairport-sync_git 36%] ~

参考:

https://forum.openwrt.org/viewtopic.php?id=60605

https://github.com/lancethepants/tomatoware/issues/18#issuecomment-168871785

目前没什么好的解决办法,好在出错的地方有些规律,就是在 Makefile 中 dot_seen=no; 这句上面的反斜杠“\”需要去掉;写了个脚本做提示:

#!/bin/sh

curr_dir=`pwd`

bad_makefile=""
bad_makefile_line=""

bad_makefile_line=$(sed -n '/dot_seen=no;/=' `grep -lr 'dot_seen=no;' $curr_dir`)
bad_makefile=$(grep -lr 'dot_seen=no;' $curr_dir)

for bfile in $bad_makefile; do
    echo $bfile
done

for line in $bad_makefile_line; do
    fi_line="$(($line - 1))"
    echo $fi_line
done

echo "sed -i 'LINEs/\//' FILE"

它会列出需要修改的文件,所在行数,提示用:

sed -i 'LINEs/\//' FILE

去修改。

参考上面的帖子链接,最终确认是 DD-WRT 自带 /bin/bash 的问题,解决方法是:在 ./configure 之前建立一个环境变量:

export CONFIG_SHELL=/mmc/bin/bash

用来覆盖配置文件建立时默认使用的 /bin/bash 即可。


Jan 03

就是记录一下,别期望太高,暂时推荐使用的是 DNSPod,PandaDNS 和 AliDNS。

OpenNIC 151.236.20.236,106.186.17.181;
PandaDNS 182.254.158.191,120.27.30.176
dnspod 119.29.29.29
oneDNS 112.124.47.27,114.215.126.16
HelloDNS 123.56.46.123,121.40.144.82
114 114.114.114.114,114.114.115.115
AliDNS 223.5.5.5,223.6.6.6
BaiduDNS 180.76.76.76
DNSPod DNS+ 119.29.29.29,182.254.116.116
CNNIC DNS 1.2.4.8,210.2.4.8
DNS 派 101.226.4.6,218.30.118.6
DNS 派 联通 123.125.81.6,140.207.198.6
Google DNS 8.8.8.8,8.8.4.4
OpenDNS 208.67.222.222,208.67.220.220
V2EX DNS 199.91.73.222,178.79.131.110

Apple TV DNS
上海电信 180.153.225.136
杭州电信 115.29.189.118
广东电信 203.195.182.150
北方联通 118.244.224.124

Tags: ,

Jan 02

一. 预备工作:

首先请建立一个足够大的 SWAP 分区/文件,建议 512M 以上。通过源码编译 Go 的时候路由器的 256M 内存很快就会被耗尽。如下是建立一个 1G 的 swapfile 并且挂载为交换区:

dd if=/dev/zero of=/mnt/swap/swapfile bs=1024 count=1048576
mkswap /mnt/swap/swapfile
swapon /mnt/swap/swapfile

然后你需要指定一个临时文件存放目录 TMPDIR,在编译 Go 时,Tomatoware 内置的 TMP 和 TEMP 环境变量不能被编译过程识别,它会把临时文件全部丢去 /tmp 目录,而 /tmp 目录是用内存虚拟的,空间瞬间就会被耗尽。

export TMPDIR=/mmc/tmp

二. 开始编译:(安装目标目录为 /mmc/usr/go,你可以修改为你自己的)

下载解压源码:

rm -fr /mmc/usr/go
curl -sSL https://storage.googleapis.com/golang/go1.4.3.src.tar.gz | tar -xz -C /mmc/usr
#或者:
rm -fr /mmc/usr/go
curl -O https://storage.googleapis.com/golang/go1.4.3.src.tar.gz
tar -xzf go1.4.3.src.tar.gz -C /mmc/usr

编译:
cd /mmc/usr/go/src
./make.bash

这里耗时约 20分钟(ASUS RT-AC68P 1000MHz);
测试:

export PATH=/mmc/usr/go/bin:$PATH
go version
#应该显示:
go version go1.4.3 linux/arm

打包:
为了在其他路由器上也能直接使用,我们可以压缩打包这个编译好的 Go:
tar --numeric-owner -czf /mnt/data/go1.4.3.linux-armv7.tar.gz -C /mmc/usr go
保存这个压缩包,今后在其他路由器上,只需:

rm -fr /mmc/usr/go
tar -xzf /mnt/data/go1.4.3.linux-armv7.tar.gz -C /mmc/usr
export PATH=/mmc/usr/go/bin:$PATH
go version

#应该显示:
go version go1.4.3 linux/arm

即可。

三. 升级为 Go 1.5.2:
Go 1.5.2 并不能直接编译,它需要 1.4.3 版本的支持,还好,我们上面已经编译好 1.4.3 版本的 Go 了。那么开始编译 1.5.2:

mv /mmc/usr/go /mmc/usr/go1.4
rm -fr /mmc/usr/go
curl -sSL https://storage.googleapis.com/golang/go1.5.2.src.tar.gz | tar -xz -C /mmc/usr
#或者解压已下载好的包:
tar -xzf ./go1.11.4.src.tar.gz -C /mmc/usr
cd /mmc/usr/go/src
GOROOT_BOOTSTRAP=/mmc/usr/go1.4 ./make.bash

这个时间很长,你可以去做点别的,大约 30 分钟到 1 小时不等;编译好后你一样可以用上面的方法打包好以便今后使用。

四. 编译实战:

我们以 https://github.com/cyfdecyf/cow 为例来静态编译一下 COW 程序:
export GOPATH=/mnt/data/compile/go
cd /mnt/data/compile/go
go get github.com/cyfdecyf/cow

这里可能会提示出错:
package golang.org/x/crypto/blowfish: unrecognized import path "golang.org/x/crypto/blowfish"
package golang.org/x/crypto/cast5: unrecognized import path "golang.org/x/crypto/cast5"
package golang.org/x/crypto/salsa20/salsa: unrecognized import path "golang.org/x/crypto/salsa20/salsa"

因为 golang.org 被 X 了;使用设置 http_proxy 以及 https_proxy 环境变量的办法在我这不行,所以我们曲线救国:
mkdir -p $GOPATH/src/golang.org/x
cd $GOPATH/src/golang.org/x
git clone https://go.googlesource.com/crypto

这样再编译就没问题了:
cd /mnt/data/compile/go/src/github.com/cyfdecyf/cow
go build

不过这样编译出来的不是静态文件,静态编译要这样:
CGO_ENABLED=0 go build

下载链接是基于 go 11.4 源码编译的成品。 编译环境:

Buffalo WZR-1750DHP:1G/512MB
DD-WRT v3.0-r29875M kongac (06/11/16),内核版本的 Linux 3.10.101;

不在 Asus RT-AC68P 上面编译的原因是: Golang 1.9 之后 ARMv5 已经不支持内核版本低于 3.1 以下升级编译(参考链接)。而 Tomato 固件的内核是 2.6 的。

编译后的版本在 Tomato 这种老内核上运行没问题,支持(基于博通 BCM 4708/4709 的 Asus RT-AC68U/P/Netgear R7000/6300v2/6250/小米) 等路由器。

1.11.4
链接: https://pan.baidu.com/s/1Zj547uPNAijml5BXXuFU8g 提取码: wc9i

1.12.0
链接: https://pan.baidu.com/s/1n6vC0nv9C6GIQUeqvRVEsQ 提取码: d56i

参考: How to compile Go on any ARM device



Dec 30

先配置下选项,我这里以 PolarSSL 为例:
./configure --prefix=/opt --with-crypto-library=polarssl --with-polarssl=/mmc/lib --with-polarssl-include=/mmc/include

为了解决编译时出现的 epoll 相关错误(应为 uClibc 版本低的原因),需要:
sed -i "s/epoll_create1/epoll_create/g" ./libev/ev_epoll.c

使用 ldtools 的话,可以在编译二进制文件时指定 -all-static:
sed -i "s/LDFLAGS = /LDFLAGS = -all-static/g" ./src/Makefile

然后就可以:

make
strip ./src/ss-*
make install

Dec 14

在 DD-WRT 下非交互式状态执行脚本时,所执行的脚本最好加上下面的内容:

export PATH=/bin:/usr/bin:/sbin:/usr/sbin:/jffs/sbin: 
/jffs/bin:/jffs/usr/sbin:/jffs/usr/bin:/mmc/sbin:/mmc/bin: 
/mmc/usr/sbin:/mmc/usr/bin:/opt/sbin:/opt/bin:/opt/usr/sbin: 
/opt/usr/bin
export LD_LIBRARY_PATH=/lib:/usr/lib:/jffs/lib:/jffs/usr/lib: 
/jffs/usr/local/lib:/mmc/lib:/mmc/usr/lib:/opt/lib:/opt/usr/lib

特别是 LD_LIBRARY_PATH 这个环境变量,要不很多脚本在 shell 下可以执行,一旦放到计划任务等非交互状态下就不能执行了,还不好调试!

Tags: ,

[3/19]  < 1 2 3 4 5 6 7 8 9 10 > ... »