ChinaDNS+ShadowSocks实现路由器透明代理

之前给一个路由器刷了OpenWrt在学校上网用,这个月开始学校改计费方式了,索性就拿回家来做透明代理了。之前想使用GFWlist来分流结果没成功,所以才折腾一下ChinaDNS感觉还是比较简单的,但唯一的弊病是无论境外IP是否被屏蔽都会走代理,这样有些无关痛痒的国外网站访问起来可能会变慢。无论如何,终端设备不再使用代理软件已经方便很多了。

在搞透明代理之前请确保路由器已经安刷好了OpenWrt。具体怎么刷OpenWrt请参见我之前的一篇博文路由器刷入OpenWrt固件

必要软件

首先是在OpenWrt下装上一堆必要软件:

  • shadowsocks-libev-spec
  • luci-app-shadowsocks-spec
  • ChinaDNS
  • luci-app-chinadns

这些都可以在sourceforge里找到。如果无法访问也可以下载我备份在服务器上的较老版本:

wget https://www.shintaku.cc/files/shadowsocks-libev-spec_2.4.6-1_ar71xx.ipk
wget https://www.shintaku.cc/files/luci-app-shadowsocks-spec_1.4.0-1_all.ipk
wget https://www.shintaku.cc/files/ChinaDNS_1.3.2-3_ar71xx.ipk
wget https://www.shintaku.cc/files/luci-app-chinadns_1.4.0-1_all.ipk

下载完成后使用opkg命令安装,如果当前目录下没有其他文件就直接opkg install *就好了。这时刷新一下LuCI界面就会多出服务一项了。

服务

配置ChinaDNS

默认配置是这样的:

ChinaDNS

其中的设置基本不用动,国内路由表在/etc/chinadns_chnroute.txt,最好设置成定期更新,可以在计划任务中添加crontab任务:

0 4 * * * wget -O- 'http://ftp.apnic.net/apnic/stats/apnic/delegated-apnic-latest' | grep ipv4 | grep CN | awk -F\| '{ printf("\%s/\%d\n", $4, 32-log($5)/log(2)) }' > /etc/chinadns_chnroute.txt

这样每天凌晨4点就可以将新的路由表文件写入了。

还有上游服务器一项,前面的是对于国内线路的DNS服务器,默认是114基本没什么问题;但是后一个DNS服务器则要求没有污染,默认用的Google的,感觉直接作为DNS不会太理想,所以需要自己在VPS上搭建一个简易的DNS服务器。

简单来说,使用dnsmasq比较方便,所以登入VPS服务器,安装dnsmasq并加入开机启动:

yum install dnsmasq
systemctl enable dnsmasq

然后编辑配置文件/etc/dnsmasq.conf(因为所有内容都注释掉了,所以直接加入下面几行就可以了):

1
2
3
port = 5353
server = 8.8.8.8
server = 8.8.4.4

保存后运行dnsmasq就监听到5353端口了,这样就可以间接地使用Google的DNS了。

回到路由器方面,将上游服务器的后一项改为VPS_ip:5353保存就可以了。

然后进入网络-DHCP/DNS,将基本设置里的本地服务器改为127.0.0.1#5353

DHCP/DNS

再到HOSTS和解析文件忽略解析文件忽略/etc/hosts保存即可。

配置ShadowSocks

服务器配置按实际情况填写即可,主要要注意访问控制里的被忽略IP列表,因为装了ChinaDNS,所以选里面的ChinaDNS路由表就行了。如果怕自己的VPS也被代理了,在额外被忽略IP里填上自己的VPS地址就好了:

ShadowSocks

启动ShadowSocks以后可以用Baidu和Google分别测一下自己的IP地址,如果分别是ISP和VPS的IP应该就没问题了。

Read More +

将jar程序打包成app

Mac下的Minecraft启动器是jar文件,每次需要启动的时候都要进入到它所在的目录下双击用Jar Launcher运行,或者使用jawa -jar命令启动,非常麻烦。所以想了一个办法,用Automator将它打包成app文件放到Application目录下就会出现在Launchpad里了。

新建app

首先打开Automator创建一个Application:

Application

选择Run Shell Script并将jar的运行命令填进去:

java -jar /Applications/Minecraft.app/Contents/Jar/Minecraft\ Launcher.jar

Run Shell Script

然后改个名字保存到Application下。

打包jar

打开新建好的app的Contents,在里面新建一个Jar目录,并将启动器的jar文件移进去(只要跟上面命令的路径自洽即可):

Jar

然后可以用Automator右上角的Run测试一下是否可以正常执行:

Run

更改图标

打开app的Info,点击图标后会出现一个蓝圈:

Info

这时将复制好的图片粘贴到这里就可以更改图标了。

现在就可以到Launchpad里启动Minecraft的启动器了:

Launchpad

Read More +

Mac上进行Verilog仿真

这学期上VLSI系统设计这门课,同时顺带着把计算机设计与调试的课程设计做了。往FPGA上烧写之前要用Verilog进行仿真,在实验室直接用机房的ModelSim仿真了,但是课下在虚拟机上做有诸多的不便,于是就研究了一下在Mac下写Verilog的方法。

配置Sublime代码高亮

Sublime Text默认是不支持Verilog代码高亮的,可以通过安装插件增加对其的支持。首先要安装Sublime包管理工具,按control+` 打开控制台,并运行以下代码(以Sublime Text 2为例):

1
import urllib2,os,hashlib; h = '2915d1851351e5ee549c20394736b442' + '8bc59f460fa1548d1514676163dafc88'; pf = 'Package Control.sublime-package'; ipp = sublime.installed_packages_path(); os.makedirs( ipp ) if not os.path.exists(ipp) else None; urllib2.install_opener( urllib2.build_opener( urllib2.ProxyHandler()) ); by = urllib2.urlopen( 'http://packagecontrol.io/' + pf.replace(' ', '%20')).read(); dh = hashlib.sha256(by).hexdigest(); open( os.path.join( ipp, pf), 'wb' ).write(by) if dh == h else None; print('Error validating download (got %s instead of %s), please try manual install' % (dh, h) if dh != h else 'Please restart Sublime Text to finish installation')

安装完后重启,按command+shift+P唤出命令面板,打开Install Package包管理工具:

Install Package

然后查找Verilog,将搜到的自动补全和代码高亮插件装上重启就可以了:

Verilog

安装Icarus Verilog

Icarus Verilog是Verilog硬件描述语言的实现工具之一。该软件以GNU通用公共许可协议发布,是一个自由软件。它支持Verilog对应的的IEEE 1995、IEEE 2001和IEEE 2005三个不同的版本,并对SystemVerilog的部分内容提供支持。

首先保证已经安装了Homebrew,然后通过brew安装:

brew install icarus-verilog

安装Scansion

Scansion是Mac平台下的一个VCD文件查看工具,可以去http://www.logicpoet.com/downloads/下载其最新版本并安装。

编译仿真

随便新建一个测试文件叫test.v:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
module vaddsws( vra, vrb, vrt, sat );

input [31 : 0] vra;
input [31 : 0] vrb;
output [31 : 0] vrt;
output sat;

wire [31 : 0] sum;
wire [31 : 0] vrt;
wire sat;

assign {sat, sum} = vra + vrb;
assign vrt = (vra[31]^vrb[31]) ? sum : (vra[31]&&vrb[31] ? (sum[31] ? sum : 32'h80000000) : (sum[31] ? 32'h7fffffff : sum));

endmodule

再对其新建testbench文件test_tb.v:

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
`timescale 1ns/100ps
`include "test.v"

module vaddsws_tb;

reg [31: 0] vra;
reg [31: 0] vrb;
wire [31: 0] vrt;
wire sat;

initial
begin
$dumpfile("test.vcd");
$dumpvars(0, vaddsws_tb);
assign vra=32'hffffffff;
assign vrb=32'hffffffff;
#100
assign vra=32'h01234567;
assign vrb=32'h76543210;
#100
$finish;
end

vaddsws add( .vra(vra), .vrb(vrb), .vrt(vrt), .sat(sat) );

endmodule

注意testbench文件的第二行中include宏是为了引用前一个文件的模块定义,如果在Windows下用ModelSim时把它注释掉就可以了。第13行是为了生成波形文件以便在Scansion里查看。

源码编辑好后执行以下命令编译执行:

iverilog -o test.vvp test_tb.v
./test.vvp

生成vcd格式的波形文件用Scansion打开即可(也可以使用命令open -a Scansion test.vcd):

输出波形

Read More +

CentOS 7配置LEMP环境

由于最近许多服务都需要依赖LEMP(Linux、Nginx、MySQL、PHP)环境,之前旧金山机房的VPS使用CentOS 6的系统总是安装不成功,最近换了新加坡机房装了CentOS 7,所以重新完完整整的配置一遍,以便后面使用。

安装MySQL

MySQL直接从yum安装总是不能成功,后来索性就直接下载rpm包安装了。首先下载MySQL社区版的rpm包并执行安装:

rpm -ivh http://repo.mysql.com/mysql-community-release-el7-7.noarch.rpm
yum update

之后安装mysql-server:

yum install mysql-server

通过mysql -V命令查看版本来检查MySQL是否安装成功。

启动服务并设置开机启动:

systemctl start mysqld
systemctl enable mysqld

然后配置安全脚本:

mysql_secure_installation

这时会要求输入数据库的root密码,由于是新安装的并没有密码,所以直接回车即可。接下来会提示设置新的root密码,然后会有一些其它选项:

Remove anonymous users? [Y/n]
Disallow root login remotely? [Y/n]
Remove test database and access to it? [Y/n]
Reload privilege tables now? [Y/n]

按需求选择即可,推荐都选Y。

结束后使用mysql -u root -p命令以root身份登录,后面输入密码就登进去了。

安装PHP

yum默认安装的PHP还是5.4版本,对于需要新版本特性的用户还是通过Remi源安装好了。所以首先下载安装Remi源:

rpm -ivh http://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
rpm -ivh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
yum update

然后编辑/etc/yum.repos.d/remi.repo文件:

1
2
3
4
5
6
7
[remi]
name=Remi's RPM repository for Enterprise Linux 7 - $basearch
#baseurl=http://rpms.remirepo.net/enterprise/7/remi/$basearch/
mirrorlist=http://rpms.remirepo.net/enterprise/7/remi/mirror
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-remi

请确保[remi]中的enabled的值是1。然后向下查看,在想要安装的php的版本([remi-php55][remi-php56])一段将对应的enabled的值改为1,例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[remi-php55]
name=Remi's PHP 5.5 RPM repository for Enterprise Linux 7 - $basearch
#baseurl=http://rpms.remirepo.net/enterprise/7/php55/$basearch/
mirrorlist=http://rpms.remirepo.net/enterprise/7/php55/mirror
# NOTICE: common dependencies are in "remi-safe"
enabled=0
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-remi

[remi-php56]
name=Remi's PHP 5.6 RPM repository for Enterprise Linux 7 - $basearch
#baseurl=http://rpms.remirepo.net/enterprise/7/php56/$basearch/
mirrorlist=http://rpms.remirepo.net/enterprise/7/php56/mirror
# NOTICE: common dependencies are in "remi-safe"
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-remi

保存之后就可以用yum命令安装较新的PHP了:

yum install php php-fpm php-mysql

当然以后如果发现缺了什么php的组件也可以通过这种方式安装,例如:

yum install php-gd php-mcrypt php-pear

通过php -v命令查看版本来检查PHP是否安装成功。

启动PHP并设置开机启动:

systemctl start php-fpm
systemctl enable php-fpm

安装Nginx

再使用yum安装Nginx:

yum install nginx

通过nginx -v命令查看版本来检查Nginx是否安装成功。

启动Nginx并设置开机启动:

systemctl start nginx
systemctl enable nginx

然后在/etc/nginx/nginx.confhttp段中加入一句:

1
include /etc/nginx/conf.d/*.conf;

编辑/etc/nginx/conf.d/default.conf文件(若不存在请新建,以后就可以在这里修改配置了):

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
server {
listen 80;
server_name your_domain;
return 301 https://$server_name$request_uri;
#charset koi8-r;

#access_log logs/host.access.log main;

# Load configuration files for the default server block.

include /etc/nginx/default.d/*.conf;

location / {
root /usr/share/nginx/html;
index index.html index.htm index.php;
}

error_page 404 /404.html;
location = /404.html {
root /usr/share/nginx/html;
}

# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}

# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}

# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
# include fastcgi_params;
#}

# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}

保存后通过systemctl restart nginx命令重启Nginx。然后在根目录下新建一个html文件并从浏览器访问它看看是不是正常显示。

配置Nginx和PHP

继续编辑/etc/nginx/conf.d/default.conf文件,将location ~ \.php$一段解注释,并改成如下样子:

1
2
3
4
5
6
7
location ~ \.php$ {
root /usr/share/nginx/html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}

其中要注意root改成网页的根目录,此外还要确保location /index中有index.php。然后通过systemctl restart nginx命令重启Nginx。

再编辑/etc/php-php.d/www.confusergroup的值改为nginx(默认应该是apache):

1
2
user = nginx
group = nginx

保存后使用systemctl restart php-fpm命令重启PHP。

下面新建/usr/share/nginx/html/index.php文件测试PHP环境是否配置成功:

1
2
3
<?php
phpinfo();
?>

从浏览器打开该页面,如果出现PHP信息则说明配置完成。

Read More +

舰娘更改Cookie直接连接

DMM的游戏限制境外玩家登录,因此玩游戏必须要让DMM认为你是从日本访问的,境外玩家使用日本的匿名代理是一种常见的手段。而DMM仅仅是在登陆的时候会验证访客的IP地址,因此多了所谓直连的这一种途径。另外,DMM并不会经常改变游戏Token,因此采用任何方法登陆后,都可以通过浏览器的开发者工具将Flash的链接提取出来并保存为书签便可直接登陆游戏。

***———— 萌娘百科***

地区错误

之前玩舰娘不是使用ShadowSocks就是使用VPN,后来也曾一度使用改hosts搭配国内VPN的方式(因为只改hosts在有的网络环境下会出现白屏)。觉得这些方式都太繁琐并且过于依赖网络代理,后来就找到一种注入Cookie的方法。

直连方法是利用DMM在大部分时间都不检查用户IP这个特性,通过技术手段绕过IP验证的环节来达到直接连接的目的,更改浏览器或者舰娘辅助工具(比如Poi)的Cookie来使服务器不去验证用户的地域信息。

清空Cookie

首先打开DMM主页并选择语言为日本语

选择语言

然后清一下Cookie:

删除Cookie

注入Cookie

打开浏览器开发者工具中的控制台(在Poi中是显示菜单中的Webview开发者工具),将以下代码粘贴进去并回车:

document.cookie = "ckcy=1;expires=Sun, 09 Feb 2019 09:00:09 GMT;domain=osapi.dmm.com;path=/";
document.cookie = "ckcy=1;expires=Sun, 09 Feb 2019 09:00:09 GMT;domain=203.104.209.7;path=/";
document.cookie = "ckcy=1;expires=Sun, 09 Feb 2019 09:00:09 GMT;domain=www.dmm.com;path=/netgame/";
document.cookie = "ckcy=1;expires=Sun, 09 Feb 2019 09:00:09 GMT;domain=log-netgame.dmm.com;path=/";

运行代码

如果出现

“ckcy=1;expires=Sun, 09 Feb 2019 09:00:09 GMT;domain=log-netgame.dmm.com;path=/“

则说明注入成功。这时再次进入舰娘的页面-艦これ-则会正常打开:

舰娘主页

登陆后就会顺利进入游戏了:

进入游戏

楽しもっ!

Read More +

Linux上搭建Minecraft服务器

之前想在树莓派上搭建一个Minecraft服务器,但是只限于局域网内玩有点不爽,所以才想在VPS上开服。这个服务器的地址是mc.shintaku.xyz,一般时候都是宕机,欢迎大家过来乱搞。

环境配置

Minecraft是基于Java运行的,所以首先要安装Java环境:

yum install java

好像比其他平台的安装简单得多。然后为了让Minecraft在后台运行而不受终端操作的干扰,要装一个screen:

yum install screen

启动游戏

因为最开始要安装到树莓派上,硬件资源有限,所以这里介绍一个叫SpigotMC的轻量级MC服务器端,是Bukkit的优化版,但是可能游戏中有些材质无法使用。新建一个目录将下载的spigot.jar放进去,然后用以下命令启动:

java -Xms256M -Xmx512M -jar spigot.jar nogui

后来发现微软官网有了服务器版的下载,所以服务器配置足够好的话运行这个也是没有问题的,同样是先下载对应版本的server.jar,启动命令相同:

java -Xms512M -Xmx1024M -jar server.jar nogui

其中前两个参数是指定MC运行的内存范围,然后会出现一系列启动信息,最后就是Stopping server

修改配置文件

启动之后MC的目录下会生成一些其他的文件,先编辑eula.txt,将eula的值改为true

eula=true

然后编辑server.properties,开始里面应除了一些注释没有其他内容,将以下内容加进去:

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
generator-settings=                 #用于设置超平坦世界的函数,留空即可
op-permission-level=4 #设置OP的许可权等级
allow-nether=true #是否允许生成/进入下界
level-name=world #世界名称及其文件夹名
enable-query=false #允许使用GameSpy4协议的服务器监听器
allow-flight=false #是否允许玩家在生存模式透过MOD飞行
announce-player-achievements=true #是否公开显示玩家成就
server-port=25565 #服务器端口(默认为25565)
level-type=DEFAULT #世界类型
enable-rcon=false #是否允许远程访问服务器仪表盘
level-seed= #世界种子
force-gamemode=false #玩家是否总是以默认游戏模式进入服务器
server-ip= #服务器IP,一般来说留空即可
max-build-height=256 #最高建筑高度(最高256)
spawn-npcs=true #是否生成村民NPC
white-list=false #是否开启白名单认证
spawn-animals=true #是否生成动物
hardcore=false #是否开启极限模式
snooper-enabled=true #是否允许服务器定期发送统计数据
online-mode=false #是否开启正版认证(开启后只有正版玩家可进入)
resource-pack= #资源包URL(可让玩家选择是否使用服务器提供的资源包)
pvp=true #可否PVP
difficulty=1 #难度
enable-command-block=false #是否可以使用命令方块
gamemode=0 #默认游戏模式
player-idle-timeout=0 #如果该玩家无反应超过这个分钟数将会被踢出
max-players=20 #最大玩家数量
spawn-monsters=true #是否生成怪物
generate-structures=true #是否生成建筑物
view-distance=10 #客户端视野距离的上限
motd=A Minecraft Server #服务器在服务器列表页所显示的信息

可以按照注释自己进行修改,注意如果没有购买正版需要将online-mode一项改为false

一切完成后新开一个screen来启动MC:

screen -S mc

这时相当于进入一个新终端,mc是这个screen的名字。在里面继续执行之前的java启动命令就可以正常启动游戏了。在screen中只要按下Ctrl+A再按下Ctrl+D就可以回到原来的终端了。再想进入这个screen的话运行screen -r mc就可以了。想要停止游戏的话输入stop就可以了。

然后在本地启动游戏,选多人游戏并输入服务器地址就能连接了。

另外附上基本的OP命令,就可以方便地管(zhuō)理(nòng)其他玩家了:

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
/achievement <give|take> <stat_name|*> [player]
/ban <name> [reason ...]
/ban-ip <address|name> [reason ...]
/banlist [ips|players]
/blockdata <x> <y> <z> <dataTag>
/clear [player] [item] [data] [maxCount] [dataTag]
/clone <x1> <y1> <z1> <x2> <y2> <z2> <x> <y> <z> [maskMode] [cloneMode]
/debug <start|stop>
/defaultgamemode <mode>
/deop <player>
/difficulty <new difficulty>
/effect <player> <effect> [seconds] [amplifier] [hideParticles] OR /effect <player> clear
/enchant <player> <enchantment ID> [level]
/entitydata <entity> <dataTag>
/execute <entity> <x> <y> <z> <command> OR /execute <entity> <x> <y> <z> detect <x> <y> <z> <block> <data> <command>
/fill <x1> <y1> <z1> <x2> <y2> <z2> <TileName> [dataValue] [oldBlockHandling] [dataTag]
/gamemode <mode> [player]
/gamerule <rule name> [value]
/give <player> <item> [amount] [data] [dataTag]
/help [page|command name]
/kick <player> [reason ...]
/kill [player|entity]
/list
/me <action ...>
/op <player>
/pardon <name>
/pardon-ip <address>
/particle <name> <x> <y> <z> <xd> <yd> <zd> <speed> [count] [mode]
/playsound <sound> <player> [x] [y] [z] [volume] [pitch] [minimumVolume]
/replaceitem <entity|block> ...
/save-all
/save-off
/save-on
/say <message ...>
/scoreboard <objectives|players|teams> ...
/seed
/setblock <x> <y> <z> <TileName> [dataValue] [oldBlockHandling] [dataTag]
/setidletimeout <Minutes until kick>
/setworldspawn [<x> <y> <z>]
/spawnpoint [player] [<x> <y> <z>]
/spreadplayers <x> <z> <spreadDistance> <maxRange> <respectTeams true|false> <player ...>
/stats <entity|block> ...
/stop
/summon <EntityName> [x] [y] [z] [dataTag]
/tell <player> <private message ...>
/tellraw <player> <raw json message>
/testfor <player> [dataTag]
/testforblock <x> <y> <z> <TileName> [dataValue] [dataTag]
/testforblocks <x1> <y1> <z1> <x2> <y2> <z2> <x> <y> <z> [mode]
/time <set|add|query> <value>
/title <player> <title|subtitle|clear|reset|times> ...
/toggledownfall
/tp [target player] <destination player> OR /tp [target player] <x> <y> <z> [<y-rot> <x-rot>]
/trigger <objective> <add|set> <value>
/weather <clear|rain|thunder> [duration in seconds]
/whitelist <on|off|list|add|remove|reload>
/worldborder <set|center|damage|warning|get|add> ...
/xp <amount> [player] OR /xp <amount>L [player]
Read More +

SoftEther VPN的搭建与连接

虚拟专用网(VPN),是一种常用于连接中、大型企业或团体与团体间的私人网络的通讯方法。虚拟私人网络的讯息透过公用的网络架构来传送内联网的网络讯息。它利用已加密的通道协议来达到保密、发送端认证、消息准确性等私人消息安全效果。这种技术可以用不安全的网络来发送可靠、安全的消息。可以用通俗的例子来解释这件事情:

FFF国的小张和小王是异地双性恋,他们之间经常互通情书。但是FFF国有一个规定,就是异性青少年不能互通信件,否则就要被双双烧死。于是这对情侣就拜托他们的父亲老张和隔壁老王代为收发信件:小张和小王写完信后各自放在信封中封好,信封上分别写上小王亲启小张亲启,然后分别交给他们的父亲,老张和老王把信封又装进一个大信封中,上面分别写上老王收老张收再寄出。自然之后老张和老王会收到信件,拆开大信封后发现不是给自己的就转交给自己的孩子,这对情侣就这样达到了通信目的。

看了VPN的原理,我们很容易想到可以用这种方式来科学上网。我们虽然不能直接和被墙的网站通讯,但我们可以通过VPN的方式躲过GFW的追杀。

SoftEther VPN是由日本筑波大学的登 大遊在硕士论文中提出的开源、跨平台、多重协议的虚拟专用网方案,是专门为穿过防火墙而设计的。我们可以用它在自己的VPS上搭建一个简单的VPN来使用。

服务器端

下载解压

首先要在服务器上下载并解压安装文件,一定注意是32位还是64位(可通过uname -a命令查看)。
32位系统:

wget http://jp.softether-download.com/files/softether/v4.20-9608-rtm-2016.04.17-tree/Linux/SoftEther_VPN_Server/32bit_-_Intel_x86/softether-vpnserver-v4.20-9608-rtm-2016.04.17-linux-x86-32bit.tar.gz

64位系统:

wget http://jp.softether-download.com/files/softether/v4.20-9608-rtm-2016.04.17-tree/Linux/SoftEther_VPN_Server/64bit_-_Intel_x64_or_AMD64/softether-vpnserver-v4.20-9608-rtm-2016.04.17-linux-x64-64bit.tar.gz

以上为截止发布本文时的最新版本,建议从SoftEther官方网站获取最新版本。

安装启动

先解压(建议装到/usr/local下):

tar -zxvf softether-vpnserver-*.tar.gz

cd vpnserver进入到解压目录下并启动安装脚本./.install.sh


SoftEther VPN Server (Ver 4.20, Build 9608, Intel x64 / AMD64) for Linux Install Utility
Copyright (c) SoftEther Project at University of Tsukuba, Japan. All Rights Reserved.


Do you want to read the License Agreement for this software ?

  1. Yes
  2. No

Please choose one of above number:

认识不认识字至少读一读,之后会出现一堆License,然后问你看懂了没:

Did you read and understand the License Agreement ?
(If you couldn’t read above text, Please read ‘ReadMeFirst_License.txt’ file with any text editor.)

  1. Yes
  2. No

Please choose one of above number:

当然没看懂也要说看懂了,然后又问你同不同意:

Did you agree the License Agreement ?

  1. Agree
  2. Do Not Agree

Please choose one of above number:

不同意就不要用了。如果提示不识别某些命令比如gcc,另行安装即可。如果没有异常则说明安装成功,执行./vpnserver start启动服务。同理./vpnserver stop停止服务。

在CentOS7以后可以用systemd启动vpnserver,先新建启动脚本/etc/systemd/system/vpnserver.service

1
2
3
4
5
6
7
8
9
10
11
[Unit]
Description=SoftEther VPN Server
After=network.target

[Service]
Type=forking
ExecStart=/usr/local/vpnserver/vpnserver start
ExecStop=/usr/local/vpnserver/vpnserver stop

[Install]
WantedBy=multi-user.target

然后就可以通过systemctl start vpnserver启动了,并通过systemctl enable vpnserver设置开机自启。

设置密码

启动成功后我们需要设置远程登录密码以便本地管理服务。运行./vpncmd进入VPN的命令行:

vpncmd command - SoftEther VPN Command Line Management Utility
SoftEther VPN Command Line Management Utility (vpncmd command)
Version 4.20 Build 9608 (English)
Compiled 2016/04/17 21:59:35 by yagi at pc30
Copyright (c) SoftEther VPN Project. All Rights Reserved.

By using vpncmd program, the following can be achieved.

  1. Management of VPN Server or VPN Bridge
  2. Management of VPN Client
  3. Use of VPN Tools (certificate creation and Network Traffic Speed Test Tool)

Select 1, 2 or 3:

这里我们选择1,然后出现:

Specify the host name or IP address of the computer that the destination VPN Server or VPN Bridge is operating on.
By specifying according to the format ‘host name:port number’, you can also specify the port number.
(When the port number is unspecified, 443 is used.)
If nothing is input and the Enter key is pressed, the connection will be made to the port number 8888 of localhost (this computer).
Hostname of IP Address of Destination:

这里需要选择地址和端口。由于这台VPS我搭了一个网站,用了SSL占用了443端口,所以默认的443端口是用不了了,所以一定要改。我改用了5555端口,所以在这里输入localhost:5555,然后出现:

If connecting to the server by Virtual Hub Admin Mode, please input the Virtual Hub name.
If connecting by server admin mode, please press Enter without inputting anything.
Specify Virtual Hub Name:

这里就是指定一个虚拟HUB名字,用默认的直接回车就行。

Connection has been established with VPN Server “localhost” (port 5555).

You have administrator privileges for the entire VPN Server.

VPN Server>

这时我们需要输入ServerPasswordSet命令设置远程管理密码,确认密码后就可以通过Windows版的SoftEther VPN Server Manager远程管理了。

VPN管理

首先下载并安装SoftEther VPN Server Manager(居然最近移植了Mac版),其实只用到了管理工具:

Setup Wizard

安装之后运行它:

Server Manager

在这里点新建

New Connection Setting

Host Name填服务器的地址或域名,端口如果之前改过了在这也记得改过来,右下角的密码填之前设置过的密码。新建完成后Connect就会弹出Easy Setup窗口(如果提示连不上请检查一下服务器的防火墙设置):

Easy Setup

这里在第一个远程连接挑钩然后下一步即可,虚拟HUB名像之前一样默认就好。

然后会弹出一个动态DNS功能的窗口,由于不能确定它给的域名是不是被墙了,我们就不去用它,把这个窗口关了就行了。

之后会有一个协议设置的窗口:

IPsec/L2TP/EtherIP/L2TPv3 Server Settings

这里把启用L2TP挑上钩,下面设置一个IPsec预共享密钥就行了。

之后又会弹出一个VPN Azure Cloud服务的窗口,感觉没什么用,禁用了就行了。即使有用以后也可以再启用。

接下来要新建用户:

Create New User

其中用户名是必填的,验证类型选密码验证就行,然后在右侧设置用户密码。

Server Manager

之后回到管理界面,点管理虚拟HUB

Virtual Hub

这里也可以继续添加新用户。点虚拟NAT和虚拟DHCP服务器,弹出窗口:

Virtual NAT & Virtual DHCP

在里面启用SecureNAT并点SecureNAT配置

SecureNAT Configration

注意DNS要改为8.8.8.88.8.4.4。这里就算配置完毕。然后顺便生成一下OpenVPN的配置文件,点OpenVPN / MS-SSTP Setting

Server Manager

然后点击新窗口中部的按钮生成配置文件:

OpenVPN / MS-SSTP Setting

打开导出的压缩包会看到里面有两个.ovpn文件,一般我们要用到*_openvpn_remote_access_l3.ovpn这个文件,因为我们是通过IPv4地址管理的VPN,所以这个配置文件里的remote一项会是IPv4地址,如果需要使用IPv6的VPN就将其替换为相应的IPv6地址即可。

本地连接

IPv4

这里只说电脑设备,移动的设备的话配置方法类似。

Windows

首先到网络和共享中心里新建一个网络连接:

Set Up a Connection or Network

选择连接到工作区

Connect to a Workplace

这里当然要选VPN咯。

Connect to a Workplace

然后在地址栏里填上服务器地址或域名。配置完成后打开更改适配器设置

Network Connections

打开VPN连接的属性:

Properties

安全选项卡里将VPN类型改为L2TP,然后点高级设置:

Advanced Properties

在里面选上使用预共享密钥并把之前设置的密钥填进去。

Sign in

之后在VPN连接里把用户名和密码填进去就可以连上了。

Mac OS X

在网络配置里新建网络连接:

Network Preferences

接口选VPN,VPN类型选L2TP over IPSec,创建即可。

Network Preferences

然后在地址栏填服务器地址或域名,下面的账户名称填之前新建的用户名,然后点下面的认证设置

Network Preferences

密码中填上面用户的密码,共享密钥填之前设置的预共享密钥,保存并连接即可。

IPv6

因为有使用教育网通过IPv6的需求,这里也说一下IPv6的连接方法。

移动设备

iOS的应用商店里有OpenVPN的客户端,但由于软件的特殊性,中国应用商店里已经下架了,所以通过什么渠道安装请自己想办法。

如果你的Android设备支持IPv6网络的话,Play Store里也有OpenVPN的客户端下载,也可以搜一个apk自己装。

OpenVPN

上述设备安装好客户端以后,将之前生成的.ovpn文件传到设备中,用OpenVPN打开即可,之后还会需要输入之前设置的用户名密码之类的,这里不再赘述。

macOS

因为没有找到Mac上的OpenVPN客户端,所以使用了一个叫做Tunnelblick的App,功能类似。

Tunnelblick

Tunnelblick官网下载后,同样将.ovpn文件用它打开就可以了,输入用户名密码后就连上了。

Windows

从理论上讲IPv6的VPN用Windows自带的VPN连接就可以(同IPv4),把地址变一下就可以了。如果遇到不能连接的情况也可以试一下OpenVPN的Windows版,去OpenVPN官网下载即可。

Read More +

SSL证书的申请与配置

超文本传输安全协议(HTTPS)是一种网络安全传输协议。在计算机网络上,HTTPS经由超文本传输协议进行通讯,但利用SSL/TLS来对数据包进行加密。HTTPS开发的主要目的,是提供对网络服务器的身份认证,保护交换数据的隐私与完整性。

如今越来越多的个人网站使用HTTPS协议,所以感觉自己的网站不装这么一个逼就落伍了。看着自己的主页地址栏前面有一个绿色的https也感觉安全了许多虽然并没有什么卵用

申请证书

要使用HTTPS协议首先要有一个值得信任的证书颁发机构给你的网站颁发的证书。目前免费的SSL证书颁发机构有很多,本文以从沃通上申请证书为例。

填写信息

首先到沃通官网注册账号并登录。

然后会出现以下界面:

填写信息

单次申请支持1个证书5个域名2年期限,证书可选中英文,提交就好了。

验证域名

签发机构需要验证域名的所有者,可以通过域名邮箱验证,也可以将指定信息放到网站上让其扫描以验证:

验证域名

如果没有域名邮箱,将指定的html文件下载下来上传到服务器上网站的根目录下然后点下面的验证就可以了。

生成签名

到订单里选择签名生成方式,可以选择第一种方式系统自动生成,设置密码:

生成签名

这个密码是最后解压证书用的,所以要记好。

下载证书

之后会弹出证书的下载链接,如果没有可以稍等片刻去订单里Get Cert,或者等待邮箱收到链接,输入刚才设置的密码就可下载压缩包了:

下载证书

部署证书

通过之前设置的密码解压压缩包,里面有各种服务器的证书,解压自己所用的服务器对应的证书即可。本文以Nginx服务器为例。

上传证书

解压后里面有一个.crt文件和一个.key文件,将它们上传到服务器上:

scp 1_your_domain_bundle.crt remote_username@remote_host:/usr/share/nginx/
scp 2_your_domain.key remote_username@remote_host:/usr/share/nginx/

监听端口

一般HTTPS使用443端口,因此要编辑/etc/nginx/conf.d下的ssl.conf文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
server {
listen 443;
server_name your_domain;

ssl on;
ssl_certificate /usr/share/nginx/1_your_domain_bundle.crt;
ssl_certificate_key /usr/share/nginx/2_your_domain.key;

ssl_session_timeout 5m;

ssl_protocols SSLv2 SSLv3 TLSv1;
ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
ssl_prefer_server_ciphers on;

location / {
root /usr/share/nginx/www;
index index.html index.htm;
}
}

解开注释并将证书文件路径写进去保存,然后运行nginx -s reload重新加载配置文件即可。

强制跳转

经过之前的配置必须在地址里写上https才会跳转到HTTPS域名,不然还是会跳转到HTTP的。

所以还要编辑/etc/nginx/conf.d下的default.conf文件:

1
2
3
4
5
6
7
8
9
10
11
12
server {
listen 80 default_server;
server_name your_domain;
return 301 https://$server_name$request_uri;

include /etc/nginx/default.d/*.conf;

location / {
root /usr/share/nginx/www;
index index.html index.htm;
}
}

server_name下面加一个301跳转就能强制跳转到https了。

保存后运行nginx -s reload重新加载配置文件就搞定了。

Read More +

使用dd命令制作启动盘

双十二期间因为有十几块钱的代金券用不出去剁手了一个树莓派2代为了二两醋买一斤螃蟹。货到了以后就要往micro SD卡里装一个系统。之前用Windows的时候一直用软碟通往U盘之类的介质中写入镜像文件,换了rMBP之后还没干过这类事,所以一时摸不着头脑。后来发现有dd这样一个命令可以用来制作启动盘。

在Unix上,硬件的设备驱动器和特殊设备文件就像普通文件一样,出现在文件系统中;只要在各自的驱动程序中实现了对应的功能,dd也可以读取或写入到这些文件。这样,dd也可以用在备份硬件的引导扇区、获取一定数量的随机数据等任务中。dd程序也可以在复制时处理数据,例如转换字节序、或在ASCII与EBCDIC编码间互换。

查询驱动器名

插入U盘或读卡器后首先需要知道其在当前系统下的驱动器名,可以使用diskutil list命令:

/dev/disk0 (internal, physical):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      GUID_partition_scheme                        *251.0 GB   disk0
   1:                        EFI EFI                     209.7 MB   disk0s1
   2:          Apple_CoreStorage Macintosh HD            250.1 GB   disk0s2
   3:                 Apple_Boot Recovery HD             650.0 MB   disk0s3
/dev/disk1 (internal, virtual):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:                  Apple_HFS Macintosh HD           +249.8 GB   disk1
                             Logical Volume on disk0s2
                             6507AD0A-D7FF-4641-AC5C-012CCD75AA23
                             Unlocked Encrypted
/dev/disk2 (external, physical):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:     FDisk_partition_scheme                        *4.0 GB     disk2
   1:                 DOS_FAT_32 UNTITLED                4.0 GB     disk2s1

可以看到disk0当然是电脑的内置物理磁盘,disk1是内置虚拟磁盘,disk2才是要写入的U盘。然后卸载刚才插入的驱动器:

diskutil unmountDisk /dev/disk2

出现以下内容说明卸载成功:

Unmount of all volumes on disk2 was successful

写入镜像文件

使用命令:

sudo dd if=disk_image_file of=/dev/rdisk2 bs=1m

注意使用sudo,中间of参数中的盘符中记得改成rdisk(据我测试这里如果没加r写入过程会非常缓慢)。还有bs参数代表的是块大小学过体系结构的都知道,单位可以使用b、k、m、g等,默认是512字节,但不知道在这里不同大小会影响什么。

写入成功后会返回一个报告:

501+1 records in
501+1 records out
526260224 bytes transferred in 82.961110 secs (6343457 bytes/sec)

这里看到写入到一个2.0的U盘速度大概6兆/秒,如果上面of中没加r的话速度则不到1兆/秒:

526260224 bytes transferred in 552.306611 secs (952841 bytes/sec)

到这里写入完成,使用diskutil eject /dev/disk2弹出驱动器即可,出现:

Disk /dev/disk2 ejected

说明弹出成功,全部完成。

Read More +

OpenWrt路由器的IPv6代理

之前本来是想用路由器获取IPv6地址并使用双栈连接的代理服务器访问互联网。虽然之前网件自己的固件是有穿透模式并可以获取v6地址,但是无法安装ShadowSocks,所以才刷成了OpenWrt。但是这个固件默认是没有穿透模式的,所以需要自己配一发。

现在我们需要用到以下软件:

  • shadowsocks-libev-spec
  • luci-app-shadowsocks-spec
  • 6relayd

安装ShadowSocks

在OpenWrt上我们可以安装shdowsocks-libev版本,顺便搭配LuCI界面的luci-app使用,这个项目在sourceforge有发布,可以从这里下载最新的。下载完成后使用opkg命令安装:

opkg install shadowsocks-libev-spec_2.4.6-1_ar71xx.ipk
opkg install luci-app-shadowsocks-spec_1.4.0-1_all.ipk

安装完成后reboot命令重启路由器,再次进入LuCI界面可以看到多了一个Services-ShadowSocks

ShadowSocks

就说明安装正确,在里面输入ShadowSocks服务器信息就可以自动代理了,凡是连上这台路由器的设备获取到的都是代理后的网络了。

安装6relayd

由于现在即使通过代理上网也是消耗校内流量的,为了不走流量,我们只能借助IPv6网络。但是普通的路由器很少可以正常获取IPv6地址,即使路由器能获取到连接设备也很难获取,除了NETGEAR的部分路由器(包括WNR2200)的新版固件是有IPv6连接的,并且本人亲测使用穿透模式可以正常使用IPv6网络。所以我希望在OpenWrt上也能使用穿透模式,再通过ShadowSocks代理IPv6网络就可以免流量访问外网了。

要使用穿透模式就少不了6relayd这个软件。可是官方源如今没提供这个包,于是可以获取我的备份并安装:

wget https://www.shintaku.cc/files/6relayd_2013-10-21_ar71xx.ipk
opkg install 6relayd_2013-10-21_ar71xx.ipk

安装完成之后编辑/etc/config/6relayd文件在默认配置后面加一组:

1
2
3
4
5
6
config relay
option master 'wan'
option network 'lan'
option rd 'relay'
option dhcpv6 'relay'
option ndp 'relay'

保存后使用下面的命令开启服务并设置为开机启动即可:

/etc/init.d/6relayd start
/etc/init.d/6relayd enable

配置路由器

现在要到LuCI界面下找到Network-Interfaces并添加一个新的接口:

Add new interface

接口名叫wan6,协议选择DHCPv6 client,接口自定义为@wan

wan6

保存应用后重启路由器,就会发现多了一个WAN6接口,并且WAN口获取到IPv6地址了:

IPv6地址

这时回到ShadowSocks的配置界面,将服务器地址改为VPS的IPv6地址就可以了:

ShadowSocks设置

记得要开全局代理,因为毕竟PPPoE拨着号呢,在校园网11月30日改革后有线网拨号后不用登录就能上网让我很慌啊,路由器一直连着网终归是有偷跑流量的风险,所以打开IPv6全局代理最为保险,使得能通过代理的IPv6网络可以使用而IPv4网络因为通不过代理无法使用。2016年春季学期开学后发现即使拨号路由器也无法获取IPv6地址了。

于是现在得到的效果就是任何连接到这台路由器的设备无需任何登录即可访问外网,而且不消耗校内网流量,网络还自带科学上网Buff,从此妈妈再也不用担心我流量不够用了。

Read More +