Ubuntu下交叉编译kcptun go语言源码 for openwrt

Ubuntu下交叉编译kcptun go语言源码 for openwrt无评论

2016年12月26日 at 上午10:14分类:软件 阅读: 1,666 次

1、安装go 1.8环境

golang从1.8开始官方支持mips32了,执行效率比之前非官方版gomini的快很多

以下操作以root用户执行,如以其他用户执行,需修改为对应路径

下载版本:

 git clone https://go.googlesource.com/go
 cd go
要安装1.8版本,先要安装1.4版本,不然会出错

 git checkout go1.4 
安装go 1.4:

 cd src
 ./all.bash
 export GOROOT_BOOTSTRAP=~/go1.4
 cp ~/go ~/go1.4 -rf 
清除环境

 cd ~/go 
 git clean -dfx
安装go 1.8:

 git checkout go1.8beta2
 cd src
 ./all.bash

安装成功后会提示:

加入路径

 export PATH=$PATH:~/go/bin
 #go version 
  go version devel +9cd3c06 Thu Dec 15 20:06:07 2016 +0000 linux/386 
设置profile

echo 'export PATH=$PATH:~/go/bin' >> /etc/profile

2、编译kcptun

设置环境变量

 export GOARCH=mips
 export GOPATH=~/go/src/gocode 
 export GOOS=linux 
 export GOROOT=~/go 
下载必要的包,需确认下载正确

 go get -v golang.org/x/crypto/pbkdf2  
 go get -v github.com/xtaci/kcp-go 
 go get -v github.com/urfave/cli 
 go get -v github.com/hashicorp/yamux
 go get -v github.com/golang/snappy 
 go get -v golang.org/x/net/ipv4 
 go get -v github.com/xtaci/kcptun/client 
 go get -v github.com/xtaci/kcptun/server 
 go get -v github.com/klauspost/cpuid 
开始编译

 cd ~
 git clone https://github.com/xtaci/kcptun.git
 cd kcptun  
 ./build-release.sh  
或者按如下方式编译

VERSION=`date -u +%Y%m%d`
LDFLAGS="-X main.VERSION=$VERSION -s -w"
env CGO_ENABLED=0 GOOS=linux GOARCH=mips go build -ldflags "$LDFLAGS" -o client_linux_mips github.com/xtaci/kcptun/client

编译完成:

编译后的软件如果在openwrt上运行出现如下错误:

root@wndr3800:/usr/bin/kcptun# ./client_linux_mips
Illegal instruction

那是因为内核中没有开启FPU

开启方法:

在openwrt的编译目录执行:

make kernel_menuconfig

选中上述选项后重新编译

 

或者也可以用gomini编译kcptun,不需要开FPU

gomini 1.4版本编译过程:

首先要看你使用的路由器cpu架构,是big还是little

https://dev.openwrt.org/wiki/platforms

big用mips,little用mipsel,ar71xx是big,小米、极路由等MT76xx是little

little编译参考:

https://github.com/xtaci/kcptun/issues/79

 

ar71xx编译过程:

git clone https://github.com/gomini/go-mips32.git
cd go-mips32/src
export GOOS=linux
export GOARCH=mips32
./make.bash
mkdir ~/kcp
cd ~/kcp

export GOPATH=~/go-mips32/src/gocode
export GOOS=linux
export GOARCH=mips32
export GOROOT=~/go-mips32
export PATH=~/go-mips32/bin:$PATH

go get -v golang.org/x/crypto/pbkdf2
go get -v github.com/xtaci/kcp-go
go get -v github.com/urfave/cli
go get -v github.com/hashicorp/yamux
go get -v github.com/golang/snappy

go get -v golang.org/x/net/ipv4

到这一步我这里提示:

ywb@ubuntu:~/kcp$ go get -v golang.org/x/net/ipv4
golang.org/x/net/ipv4
# golang.org/x/net/ipv4
../go-mips32/src/gocode/src/golang.org/x/net/ipv4/zsys_linux_ppc.go:7: sysIP_TOS redeclared in this block
previous declaration at ../go-mips32/src/gocode/src/golang.org/x/net/ipv4/zsys_linux_mips.go:7

定义重复,临时解决方法(没时间深究原因):

将此目录(~/go-mips32/src/gocode/src/golang.org/x/net/ipv4/)下除了zsys_linux_mips.go外的所有zsys_*_*.go名称改成zsys_*_*.go1:

再执行go get -v golang.org/x/net/ipv4成功,继续

go get -v github.com/xtaci/kcptun/client
go get -v github.com/xtaci/kcptun/server

VERSION=`date -u +%Y%m%d`
LDFLAGS="-X main.VERSION=$VERSION -s -w"
env CGO_ENABLED=0 GOOS=linux GOARCH=mips32 go build -ldflags "$LDFLAGS" -o client_linux_mips github.com/xtaci/kcptun/client
env CGO_ENABLED=0 GOOS=linux GOARCH=mips32 go build -ldflags "$LDFLAGS" -o server_linux_mips github.com/xtaci/kcptun/server

搞定收工

 

openwrt luci开发及安装过程中的问题

openwrt luci开发及安装过程中的问题无评论

2016年12月24日 at 下午10:05分类:软件 阅读: 608 次

1、缓存影响

luci会缓存用户访问的内容,有时用旧的控制语言去控制新开发的界面会出现错误,如果你开发或安装luci时遇到问题,先清除缓存

缓存目录/tmp/luci-modulecache,将目录下的文件全部删除

还有luci-indexcache文件

2、Luci控制文件的保存路径

/usr/lib/lua/luci

可以在此路径直接更改luci的文件,不用每次都编译、安装再测试

3、文件格式问题

最好用unix,其他格式如dos、UTF等可能会出现一些莫名其妙的问题,内容一样格式不同可能导致执行出错

在git中需设置“git config --global core.autocrlf false”,让Git不要管Windows/Unix换行符转换的事 ,不然上传的是unix,同步下载后又变成dos

4、交叉编译

编译ar71xx没问题,编译rammips时提示:

checking whether the C compiler works... no
configure: error: C compiler cannot create executables

解决:sudo apt-get install ccache

5、怎么将shell脚本或程序甩到后台执行

一些监控脚本或程序执行后不会退出,这时要把它甩到后台,否则在luci界面会一直显示正在应用配置。

有两种方法,一种是用service_start,此函数存在于/lib/functions/service.sh ,在shell脚本中前两行写上:

#!/bin/sh /etc/rc.common

SERVICE_DAEMONIZE=1

就可以调用此函数,如

#!/bin/sh /etc/rc.common
SERVICE_DAEMONIZE=1

service_start ssr-redir -c /var/etc/shadowsocksr.json

注意:引用了/etc/rc.common的脚本文件,对参数传递格式是“脚本名称 动作(start/stop/restart/reload/enable/disable) 参数列表”

比如有一个文件test.sh,内容为:

#!/bin/sh /etc/rc.common

echo $1_$2

执行

./test.sh 1 2 3

打印的是2_3,1被当成动作

 

另一种方法比较特别,用( ..  &)来执行命令,比如

( ssr-monitor 2  &)

 

DNS域名污染对SS、SSR Openwrt客户端的影响测试

DNS域名污染对SS、SSR Openwrt客户端的影响测试有1条评论

2016年12月23日 at 下午4:13分类:其他 阅读: 2,436 次

【现象】

针对被污染的域名如google,openwrt上的SS客户端可以不受影响,而SSR客户端必须使用UDP转发,通过隧道获取正确的dns后才能访问。

【环境】

SS、SSR客户端的版本号都为2.5.6,配置相同,SSR协议为origin,无混淆(plain);服务器配置不变。

SS源码库:

https://github.com/shadowsocks/shadowsocks-libev

SHA1 ID:d6c377df9c8053b10276dd2dddf9aceda5f1faf5

SSR源码库:

https://github.com/breakwa11/shadowsocks-libev

SHA1 ID:ccecb762b5943769ca10676f8bda478f4d5beb7f

SS for openwrt源码库:

 https://github.com/shadowsocks/openwrt-shadowsocks

SSR for openwrt源码库:

https://github.com/ywb94/openwrt-ssr

 

如下图,本地计算机被污染的google域名地址为59.24.3.173,这是一个随机的垃圾地址:

 

【Openwrt SS客户端测试】

开启Openwrt SS客户端,在计算机上访问google网页,访问成功

本地计算机端口连接成功:

抓包有交互数据:

openwrt上有透明转发的记录:

SSR服务器(兼容SS客户端)上有转发到google的记录(216.58.196.227为正确的google IP地址):

说明SSR服务器根据转发来的数据内容重新进行了域名解析,并用正确的IP地址和google进行了数据交互,而不是单纯的根据收到的目的IP地址进行转发。

 

【Openwrt SSR客户端测试】

开启Openwrt SSR客户端,在计算机上访问google网页,访问超时

 

本地计算机端口连接成功:

openwrt上有透明转发的记录,第3条记录为透明代理收到的请求,第一条记录为透明代理向服务器转发的请求:

SSR服务器上有openwrt连接的记录:

但是SSR服务器直接以被污染的google IP地址(而不是对域名进行重新解析)进行了转发,导致失败:

 

【补充】

将上述测试中的SSR服务端换成SS服务端进行测试,结果一样。

在所有测试环境相同的情况下,替换SS、SSR客户端可执行程序为对方的名称,测试结果和上述一样,SS成功、SSR失败。

【结论】

SS客户端在本地DNS解析被污染的情况下可以在远程服务器重新解析成功,SSR客户端不具备此功能。

在所有配置和环境相同的情况下,有问题的可能是SSR客户端程序,需要修改SSR客户端源码。

【解决】

将SSR源替换为如下即可:

https://github.com/glzjin/shadowsocks-libev

此版本ssr libev的服务端目前还支持部分混淆

传输协议:verify_simple,verify_sha1

混淆插件:http_simple/post,tls1.2_ticket_auth

 

新的SSR for OpenWRT地址不变:

https://github.com/ywb94/openwrt-ssr

 

另:新版SSR官方源已修正这个问题

https://github.com/breakwa11/shadowsocks-libev

SHA1 ID:cd646ce98f0c21d54011d636dabba1fc053fbc0d

再战DNS域名解析污染

再战DNS域名解析污染无评论

2016年12月23日 at 上午10:40分类:建站 阅读: 952 次

tips:

windows下清除dns缓存:

C:\Users\Administrator>ipconfig/flushdns
Windows IP 配置
已成功刷新 DNS 解析缓存。

openwrt下清除dns缓存:
root@Open743:~# /etc/init.d/dnsmasq restart

DNS域名请求和响应报文为明码UDP报文(端口为53),中间设备很容易对域名解析的返回结果进行修改,从而使你访问不到你想要访问的网站。

 

正文:

原来在用VPN时使用openwrt的dnsmasq将国外域名列表指向8.8.8.8的google服务器进行解析:
使用DNSMASQ解决OPENWRT的DNS解析问题

 

此种方法在使用VPN时正常,国外IP(含8.8.8.8)全走加密VPN,包括TCP、UDP,中间设备无法对内容进行修改。

 

但此种方法在使用SSR时发现失效,原因是没有将SSR的UDP隧道转发打开,SSR缺省只对TCP报文进行透明代理,UDP报文在中间被劫持修改

上图第一次ping是没打开隧道转发时的IP地址,返回一个随机的垃圾IP(意大利的地址),第二次是打开隧道转发后的正确IP。

 

隧道转发打开方式

openwrt上安装openwrt-ssr

打开UDP转发:

在WAN设置中取消“使用端局通告的DNS服务器”:

在DNS配置中设置“DNS转发”为“127.0.0.1#5300”:

按上述设置可以正确解析所有域名,但是有个问题,国内的域名也交给google去解析了,导致访问淘宝变成国际淘宝网站。

 

问题1:能不能不开启隧道,用UDP中继服务器中转DNS请求?

目前测试,从openwrt上发出的dns不理会UDP中继服务器设置,直接不走代理出去,但是局域网内其他的计算机发出的UDP报文会转发到UDP中继服务器。因此如果不开隧道,开UDP中继服务器,可以将局域网中的计算机的dns手动设置成8.8.8.8,也可以防止DNS污染:

 

问题2:如何设置使国内域名走国内DNS,国外走google的DNS?

在openwrt上打开UDP隧道,不要修改WAN和DNS配置,修改openwrt上/etc/dnsmasq.d/foreign_list.conf文件,将8.8.8.8改为127.0.0.1#5300

重启dnsmasq:

/etc/init.d/dnsmasq restart

 

另发现SS的openwrt客户端在域名污染情况下仍然可以正常使用,而SSR必须开隧道,具体原因待查。

【补充】

新版本SSR已经修复了在域名污染情况下无法使用的问题,已经不需要上述步骤。

新版SSR for OpenWRT地址:

http://github.com/ywb94/openwrt-ssr

在github上新建项目

在github上新建项目无评论

2016年12月22日 at 上午11:14分类:软件 阅读: 547 次

1、注册及创建项目

首先在github上通过邮箱注册账号,账号激活后建立一个项目版本库

项目创建后提示如何上传代码:

2、建立本地仓库

启动git-gui,创建新版本库:

将代码拷贝到上述目录,然后在gui中点击“重新扫描”按钮,可以发现新的代码文件:

3、同步上传代码

先创建ssh key,点git中“帮助”-“show ssh key”,创建key,这里要输入一个口令,需记住:

拷贝此key,粘贴到github中的key设置页面:

验证是否配置成功 :
ssh -T git@github.com,需输入上面创建ssh key时输入的口令:

设置远端版本库,选“远端”-“add”:

在git中缓存改动并提交本地版本后,点击“上传”按钮:

输入github的用户名和密码,开始上传:

上传完成,在github上可以看到你提交的代码了:

 

如果提交代码时需要输入用户名和密码,在命令行输入命令:
git config --global credential.helper store

下一次会记住用户名和密码

删除tag:

本地:

git tag -d <tagname>

远端:

git push origin --delete tag <tagname>

【补充:Ubuntu中使用github】
1、在github中创建项目,如merlin-ac9
2、设置账号
git config --global user.name = "用户名或者用户ID"
git config --global user.email = "邮箱"
3、设置ssh
ssh-keygen -C 'you email address@gmail.com' -t rsa
在 github.com 的merlin-ac9界面中 选择右上角的 Settings,然后选择 Deploy keys ,选择新加。
Title 可以随便命名,Key 的内容拷贝自 ~/.ssh/id_rsa.pub 中的内容,完成后,可以再使用 ssh -v git@github.com 进行测试。
4、设置本地仓库
进入到代码目录,初始化
git init
添加代码
git add .
这里 “.” 表示将文件夹下所有的文件都添加进去,我们也可以指定文件进行添加,如git add README.md。
本地提交
git commit -m 'first commit'
5、同步到github
设置远程仓库
git remote add origin https://github.com/ywb94/merlin-ac9.git
同步本地代码到远程
git push -u origin master