目录
10.GitHub Pages(pages.github.com)
一、失败的经历
相信很多人都想搭建网站吧。但是,搭建网站不光得自己访问,还能让别人也能访问。
但是我们家里的设备一般深处内网,无法实现外网访问。
于是,很多人会在网上找各种各样的“内网穿透”软件,并尝试,但是没有一个能如愿。
我也是一样的,接下来,我给大家分享一下我失败的尝试。
1.花生壳
网上很多人推荐。结果安装了一下,发现几乎所有功能都要收费。直接放弃。
2. nat123
说免费,但是速度贼慢。关键是有一次我配置错了,想改,它告诉我需要什么N币,我搜怎么获取,答:花钱!我才意识到,这个软件说免费,其实是骗人的!果断放弃。
3. 网云穿
我的天啊,账号都注册不了,报错Unknown error (-1),在登录页面无限刷新。放弃。
4. cpolar
说很稳定,想尝试一下。结果它告诉我域名每24小时变一次!这样的网站有什么用!
5. ngrok
跟cpolar一样。
6.金万维快解析
用了一个月,不错!能自定义二级子域名!(喜)结果有一天突然无法访问(详情见这篇问答),然后就放弃了。太不稳定了!
7.神卓互联
跟花生壳一样。
8.内网云(neiwangyun.net)
非常简单,直接SSH就行了。但也是不支持自定义二级子域名。
9.localhost.run
同内网云。
(关于内网云和localhost.run,我发布了一篇问答,感谢大家回答。)
10.GitHub Pages(pages.github.com)
只能部署静态网站。
放弃放弃。
11.IPv6
据说移动给咱们都分配了IPv6的公网IP,我高兴得不得了!
可惜,移动分配的IP是动态的。
等等!前面不是讲了GitHub Pages吗!!!
12.IPv6+GitHub Pages
我写了个程序,不断把IPv6公网IP给Push到GitHub仓库里,然后对GitHub仓库开通GitHub Pages服务,然后你只要访问了GitHub Pages,就会自动查询IP,然后跳转到这个IP。(具体源码请参阅https://github.com/bjsdfz17ban/webddns)
我检查了一下,我的IPv6 IP是2409开头的,网上告诉我是公网IP。我访问了一下,没问题。
(大喜)
……
直到有一天,我做了一个游戏,给同学们玩。
同学A:你这个网站怎么访问不了啊?
我:?是不是你的问题?
同学B:我也访问不了
我:???你换个浏览器试试
同学A:换浏览器也不行
我:
一脸懵逼
二脸懵逼
五脸懵逼
十脸懵逼
百脸懵逼
万脸懵逼
亿脸懵逼
公网IP居然还访问不了!!!服了!!!
13.FRP
不少人推荐,结果它说要一台公网IP的服务器!!!我服了,我都有公网IP了,还用锤子的内穿透!!!
(图片出处:https://zhuanlan.zhihu.com/p/437319496)
14.nps
同FRP。
二、终极方案:内网云+GitHub Pages
我开始仔细回忆失败过的方案……
突然,我想起了那些域名随机变化的内网穿透软件。这不是跟IPv6的动态IP是一样的吗?既然IPv6动态IP能用GitHub Pages解决,那么动态域名也能这么解决啊!!!!
于是,我很快确定了一个大体思路:找到那些很稳定且没有什么限制,但是域名随机变化的内网穿透软件(cpolar、内网云……),然后写程序破解它们的客户端,获取到那个域名,存到文件里,最后把文件push到GitHub上,再部署GitHub Pages。接着,照常用GitHub Pages部署静态网页,表面上看是静态页面,但是一个网页如果要访问后台,只需要查询一下那个文件,就可以获取到后台的域名了。再向后台发送ajax请求,就可以与后台交互了。(看不懂没关系,接下来有更具体的讲解)
最终,我选择了“内网云”作为最终的内网穿透软件。因为“内网云”使用SSH作为客户端,比较容易破解到那个随机变化的域名。
具体的部署过程如下:
- 1.在GitHub上创建一个仓库。
- 2.对仓库部署GitHub Pages。
- 3.启动SSH,连接内网云的服务器,并且将输出结果重定向到文件A(SSH的输出结果包含了那个随机域名)。
- 4.通过C语言,在文件A里找到随机域名(实现细节略),并输出到另一个文件B。
- 5.将文件B push到GitHub仓库中。
- 6.在后台服务器上重复步骤3~5。
- 7.写一个静态网页(HTML)。
- 8.这个网页每当需要与后台交互时,就去读取文件B的内容(通过ajax)。
- 9.获取到后台的域名后,就可以与后台交互了(还是用ajax)。
- 10.将网页Push到GitHub仓库中。
这样,就可以一分钱不花,免费部署一个动态网站,并实现外网访问。
如果有没理解的内容,欢迎评论区交流!
三、代码实现
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <unistd.h>
char cmd0[4096],cmd1[4096],cmd2[4096];
char tmp0[4096];
int main(int argc,char **argv){
if (argc != 6){
printf("Usage: openlpl <http|https|ipport> <port> <file> <remote> <git-branch>\n");
printf("Example: openlpl https 80 80.txt origin master\n");
return 0;
}
char *mode = argv[1];
char *port = argv[2];
char *dir = ".";
char *file = argv[3];
char *rem = argv[4];
char *br = argv[5];
sprintf(tmp0,"cd %s",dir);
system(tmp0);
sprintf(cmd0,"ssh -R 80:localhost:%s [email protected] > .%s.tmp 2> /dev/null",port,file);
sprintf(cmd1,"cat .%s.tmp | grep %s | grep -v tunnel | awk '{print $3}' > %s",file,mode,file);
sprintf(cmd2,"git add . && git commit -m \"changed domain\" && git push %s %s",rem,br);
while (1){
if (fork() == 0){
system(cmd0);
return 0;
}
sleep(5);
system(cmd1);
system(cmd2);
wait(NULL);
}
return 0;
}
将这个文件存储为openlpl.c(OpenLPL: Open Local Port Locating,开源的本地端口定位服务)
然后编译:
gcc openlpl.c -o openlpl
运行:
./openlpl <协议类型 http|https|ipport> <端口> <存放域名的文件> <仓库地址> <仓库分支>
例如:
./openlpl https 80 80.txt [email protected]:name/repo.git master
这段代码会将80端口穿透到外网,并不断地把生成的随机地址Push到[email protected]:name/repo.git的master分支。