此文章是17年中完成的,此方法已经不可用,但文章仍有一部分参考意义,如果想深究,请移步到新文章开发完成了网站的自动同步功能,写一些建站的那些小事
这阵子为了某个不能说的原因root了过保的两个路由,折腾了一阵,感觉完全开启了一个新世界,
其实一般的现代家用路由器的系统很多都是基于OpenWRT或者类OpenWRT用衍生变种,
这就是一个精简的linux系统,路由器的硬件并不是家用机的通用的x86的架构,比较流行的是MTK的MIPS架构,
所以运行可执行文件需要重新针对MIPS编译,一般常用的工具都支持。
既然有了这样的基础,我们可以在这上面跑一些非重度的服务,能非常方便的构建一个轻型的服务器。
这里就介绍一下怎么在路由器上搭一个博客,如何技术选型最优(自认为的),当然还可以做更复杂的事,
以后有时间码文再慢慢说。
讲到博客这东西,其实本质上是自己记录的信息,如何长久的保存自己的信息,大部分人应该都有过痛苦的经历,
曾经风光一时的百度博客运营着就关停了,各种网盘说没就没,所以我还是倾向于自己用最小的成本完全控制住自己的信息,
还是自己搭博客最靠谱。
废话说完,下面讲如何做到这个事,本文以极路由2为构建原型,当然其他路由也是完全可以的,有些地方是相通的,
异同我尽量兼顾一下。
Root你的路由
工欲善其事必先利其器,首先需要拿到路由的ssh和root权限,极路由用如下方式拿到权限,当你拿到ssh的时候,
也意味着你失去了质保。
- 第一步申请开发者模式,打开路由管理后台(http://192.168.199.1), 点击“云插件”,然后依次点击 已安装的插件—>路由器信息—>高级设置—>申请。
- 微信关注并绑定极路由账号,完成申请。
- 在后台云插件中找到开发者模式,点击安装,等待重启后成功root。
- 另外小米路由的步骤依次为,刷开发版rom —>到这里下载root工具包并按说明步骤操作。
Root完成后,其实可以做的事就多了,如果有兴趣刷机,还可以刷一个新的系统,github上有开源的适配opnwrt可以刷,
功能很强大,喜欢尝鲜可以一试,但我觉得不是很稳定,尤其是无线桥接不定时抽风无法正常使用,原生系统还算相对是比较好用的了。
极路由登陆的端口号改成了1022,极路由密码默认是管理员帐户的密码,登陆命令
1
|
ssh -p 1022 root@192.168.199.1
|
如果是用windows系统,下载putty一样可以ssh登陆,另外小米路由密码在上面的官方网站有给出,看到下面登陆界面,就登陆成功了。
1
2
3
4
5
6
7
8
9
10
11
12
|
BusyBox v1.19.4 (2016-11-08 04:49:02 CST) built-in shell (ash)
Enter 'help' for a list of built-in commands.
***********************************************************
__ __ _ _ ____ _ TM
/ / / / (_) _ __ (_) / __/ (_)
/ /_/ / / / | | /| / / / / / /_ / /
/ __ / / / | |/ |/ / / / / __/ / /
/_/ /_/ /_/ |__/|__/ /_/ /_/ /_/
http://www.hiwifi.com/
***********************************************************
|
动态域名映射公网IP
正常家用的宽带上网每次拨号成功,都是不同的IP,正常域名无法跟这种动态IP的绑定,因此我们用动态域名绑定,
动态域名服务提供商挺多,可以随便选择,这里就不做广告了,但是一般还是推荐买个顶级域名解析,否则各种免费的域名一般是会被QQ或者安全软件认为是危险网站,影响访问。
作者用的是电信的宽带,一般来说我们电信的出口并不是公网IP,简单的方法,在路由器管理中看到WAN的IP(一定注意要看WAN口的IP)和真正的出口IP是否一致就可以判断。(可以在这里看到出口的公网IP)
获取公网IP的办法也很简单,给电信一个报修电话就搞定。
有了公网IP,就可以绑定DDNS了,可以装极路由的各种DDNS插件,以及小米路由中高级设置—>DDNS来绑定IP。
绑定完成后,我们来测试一下是否正常使用,可以ping一下域名看IP是否一致,或者开个SSH的端口映射还能方便我们日后管理。
- 打开极路由管理后台页面,依次点击互联网,超级端口转发,添加转发规则
- 外部端口随便自定,内部端口填1022,IP地址填192.168.199.1,点击保存
- 外网尝试用域名和第一步绑定的外部端口号ssh登陆,如果成功则DDNS绑定运行正常
映射443端口,免费DV签名
一般来说,家用宽带都是被禁掉了80端口的,直接通过http不加其他端口访问是不行的,当然如果弄个隧道也行,但是免费的隧道有各种限制,收费的还不如自己搭VPS呢,实际上除了http还有https呢,万幸的是443端口一般是没有被禁的。
要用到443端口访问就得做SSL安全链接,为了兼容浏览器的安全性,我们得弄个认证的DV签名。免费的DV签名很多方式可以申请,比较简单的方法是在腾讯云或者阿里云上申请。
阿里云 腾讯云
以腾讯云为例,申请证书需要在域名特定目录下验证特定文件,而我们的域名能启用访问也得靠证书,这就陷入了先有鸡先有蛋的死循环了。其实还有办法解决这个问题的。我们可以先自己给自己颁发一个证书临时用,以下操作是在ubuntu中实现的,windows也有openssl的可执行文件,但是可能生成文件会遇到一些路径上的问题。
如果未安装openssl,执行以下命令
1
|
sudo apt-get install openssl
|
接下来,生成一个RSA key文件:
1
2
|
openssl genrsa -des3 -passout pass:x -out ssl.nopass.key 2048
openssl rsa -passin pass:x -in ssl.nopass.key -out ssl.key
|
接着,利用已经生成的 ssl.key 文件,进一步生成 ssl.csr 文件:
1
|
openssl req -new -key ssl.key -out ssl.csr
|
填入一些必要的信息,执行此行命令中会有输入密码提示,按回车留空即可,因为前面我们在生成 ssl.key 时没有密码。
最后一步,利用前面生成的 ssl.key 和 ssl.csr 文件来生成 ssl.crt 文件,也就是自签名的 SSL 证书文件:
1
|
openssl x509 -req -days 365 -in ssl.csr -signkey ssl.key -out ssl.crt
|
成功后,保留好ssl.key及ssl.crt文件,我们到现在为止,就可以一个生成一个可访问的简单展示的静态页面了,需要做好映射端口及一些配置的工作,极路由上自带的web服务代理是nginx,小米路由用的是uhttpd,下面以nginx配置web服务,uhttpd请搜索相应的资料解决,当然如果不嫌太麻烦,可以自己尝试编译nginx的mipsel指令集的二进制文件并解决依赖问题。
我们把生成的页面放到路由器的sd卡中,极路由对应的是这个路径 /tmp/storage/mmcblk0/
(小米路由的路径我忘了,可以用df命令查看)
拷贝文件到此目录下可以用简单的smb网络共享,在windows下访问
\\192.168.199.1,linux用smb://192.168.199.1
或者用scp来拷贝文件,具体查询命令用法。
新建一个mysite的目录,写入最简单的一个页面,保存名为 index.html
1
2
3
4
5
6
7
8
9
10
11
12
|
<!DOCTYPE html>
<html>
<head>
<title>Hello hiwifi Page</title>
</head>
<body>
<h1>This is a test simple page</h1>
<p>hello world.</p>
</body>
</html>
|
另外在mysite目录之外,保存一个nginx配置文件,命名为nginx.conf,并拷贝上面的ssl.key及ssl.crt目录,内容如下:
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
|
### version 0.1.4 ###
user nobody nogroup;
worker_rlimit_nofile 4096;
worker_processes 1;
error_log /tmp/storage/mmcblk0/nginx.log crit;
pid /tmp/storage/mmcblk0/nginx.pid;
events {
worker_connections 4096;
use epoll;
multi_accept on;
}
http {
server_tokens off;
include mime.types;
default_type application/octet-stream;
access_log on;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 2;
send_timeout 30;
gzip off;
ignore_invalid_headers off;
client_header_buffer_size 1k;
large_client_header_buffers 4 4k;
client_max_body_size 0;
server_names_hash_bucket_size 64;
map_hash_bucket_size 64;
proxy_request_buffering off;
fastcgi_request_buffering off;
client_body_buffers 16 4k;
client_body_postpone_size 32k;
proxy_pass_header Date;
proxy_pass_header Server;
server_name_in_redirect off;
port_in_redirect off;
server
{
listen 11111;
server_name (你申请的域名);
ssl on;
ssl_certificate /tmp/storage/mmcblk0/ssl.crt;
ssl_certificate_key /tmp/storage/mmcblk0/ssl.key;
index index.html;
root /tmp/storage/mmcblk0/mysite;
}
}
|
还要保存一个mine.types文件
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
72
73
74
75
76
77
78
79
|
types {
text/html html htm shtml;
text/css css;
text/xml xml;
image/gif gif;
image/jpeg jpeg jpg;
application/x-javascript js;
application/atom+xml atom;
application/rss+xml rss;
text/mathml mml;
text/plain txt;
text/vnd.sun.j2me.app-descriptor jad;
text/vnd.wap.wml wml;
text/x-component htc;
image/png png;
image/tiff tif tiff;
image/vnd.wap.wbmp wbmp;
image/x-icon ico;
image/x-jng jng;
image/x-ms-bmp bmp;
image/svg+xml svg svgz;
image/webp webp;
application/java-archive jar war ear;
application/mac-binhex40 hqx;
application/msword doc;
application/pdf pdf;
application/postscript ps eps ai;
application/rtf rtf;
application/vnd.ms-excel xls;
application/vnd.ms-powerpoint ppt;
application/vnd.wap.wmlc wmlc;
application/vnd.google-earth.kml+xml kml;
application/vnd.google-earth.kmz kmz;
application/x-7z-compressed 7z;
application/x-cocoa cco;
application/x-java-archive-diff jardiff;
application/x-java-jnlp-file jnlp;
application/x-makeself run;
application/x-perl pl pm;
application/x-pilot prc pdb;
application/x-rar-compressed rar;
application/x-redhat-package-manager rpm;
application/x-sea sea;
application/x-shockwave-flash swf;
application/x-stuffit sit;
application/x-tcl tcl tk;
application/x-x509-ca-cert der pem crt;
application/x-xpinstall xpi;
application/xhtml+xml xhtml;
application/zip zip;
application/octet-stream bin exe dll;
application/octet-stream deb;
application/octet-stream dmg;
application/octet-stream eot;
application/octet-stream iso img;
application/octet-stream msi msp msm;
audio/midi mid midi kar;
audio/mpeg mp3;
audio/ogg ogg;
audio/x-m4a m4a;
audio/x-realaudio ra;
video/3gpp 3gpp 3gp;
video/mp4 mp4;
video/mpeg mpeg mpg;
video/quicktime mov;
video/webm webm;
video/x-flv flv;
video/x-m4v m4v;
video/x-mng mng;
video/x-ms-asf asx asf;
video/x-ms-wmv wmv;
video/x-msvideo avi;
}
|
以上()中的内容是要自己填写的,
由于在上面的nginx配置中,我们监听了本地的11111端口,因此需要在路由器中设置一下端口转发,管理后台页面,依次点击互联网,超级端口转发,添加转发规则
外部端口填443,内部端口填11111,IP地址填192.168.199.1,点击保存。
完成以上步骤之后,运行命令 nginx -c /tmp/storage/mmcblk0/nginx.conf,然后在浏览器中输入https://你申请的域名
是不是已经可以访问了呢,不过一般浏览器会提示这是一个非法的证书,不过没关系,我们已经可以利用这个非法的证书申请一个合法的证书了。
回到上面的腾讯云,一般颁发机构证书需要验证目录下的一个文件.well-known/pki-validation/fileauth.txt,这个就很简单照做就行了。
申请证书成功后,不要忘了把下载下来对应的key及crt文件在nginx.conf配置中替换成新的。
一切搞定,再访问https对应的域名,是不是已经是一个合法认证的静态网页了呢^_^
到此为止,搭建博客的基础就已经搞定了。