目录

如何在家庭路由器上搭博客(一)


此文章是17年中完成的,此方法已经不可用,但文章仍有一部分参考意义,如果想深究,请移步到新文章开发完成了网站的自动同步功能,写一些建站的那些小事

/how_to_build_blog1/Img390526711.jpg

这阵子为了某个不能说的原因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对应的域名,是不是已经是一个合法认证的静态网页了呢^_^

到此为止,搭建博客的基础就已经搞定了。