背景

家里淘汰了一台笔记本,windows系统装起来很卡,于是装了个linux系统。这台笔记本有2G内存,奔腾双核处理器,配置比我在阿里云上买的ECS高多了,于是想着给它利用起来。研究了一下,发现ngrok内网穿透能实现这个功能,刚好我也有外网服务器和域名,那就直接开干。

安装gcc、git和go语言

yum install gcc -y
yum install git -y
yum install golang -y

源码编译

下载源码

此处从git下载,选择的是tutumcloud修改过的源码,解决了部分包无法获取的问题。也可以在window下下载zip包,然后再上传至服务器,解压即可。

git clone https://github.com/tutumcloud/ngrok.git ngrok

生成自签名证书

我们采用自己的服务器自建ngrokd服务,需要生成自己的自签名证书,并用该证书编译一个ngrok客户端。
生成证书需要配置一个环境变量NGROK_BASE_DOMAIN,直接在命令行里定义即可,这个域名是一个基础域名,后面ngrok提供http服务的时候,可以在这个域名前面再加前缀。以ngrok.com的官方服务为例,它提供的服务地址为xxx.ngrok.com,那么它这个NGROK_BASE_DOMAIN变量就为,“ngrok.com”。此处,我用自己的二级域名“ngrok.shawnan.xyz”,后续提供http服务时,域名为“xxx.ngrok.shawnan.xyz”。
生成签名的代码如下,在ngrok目录执行。

cd ngrok
NGROK_DOMAIN="ngrok.shawnan.xyz"
openssl genrsa -out base.key 2048
openssl req -new -x509 -nodes -key base.key -days 10000 -subj "/CN=$NGROK_DOMAIN" -out base.pem
openssl genrsa -out server.key 2048
openssl req -new -key server.key -subj "/CN=$NGROK_DOMAIN" -out server.csr
openssl x509 -req -in server.csr -CA base.pem -CAkey base.key -CAcreateserial -days 10000 -out server.crt

替换证书

生成完成后需要替换证书,就在当前目录把编译要用到的证书替换掉。

cp base.pem assets/client/tls/ngrokroot.crt

编译

编译,编译一个服务端和一个客户端,如果是在window下使用,就编译windows的客户端。

make release-server release-client// 编译windows客户端
GOOS=windows GOARCH=amd64 make release-client

编译后会在bin目录下生成ngrokd和ngrok文件,ngrokd和ngrok文件分别是ngrok的服务端程序和linux平台下的客户端程序。如果编译了windows客户端,则会生成一个ngrok.exe,是windows下的客户端程序。
到此处编译工作就完成了,下面开始启动服务。

启动服务

准备工作

准备工作之一就是首先要确定几个端口,分别是ngrok用来转发http、https服务的端口,还有转发ssh、ftp等服务的端口,此处我用到了3个,分别是http的8088、https的8443、ssh的8022。此处要记得在linux的防火墙开启这几个端口,如果是云服务器,则要配置相应的规则,否则外网的设备如何也连不进你部署的ngrokd服务。
我们可以在windows下采用telnet命令测试服务器的端口是否已经打开:

telnet xx.xx.xxx.xx 222
// 如果返回类似“SSH-2.0-OpenSSH_7.4”的结果,则222端口就打开了,如果一直是connecting,则该端口就没打开

此处假设端口已经可用了,下面开始启动ngrok服务。

启动ngrokd服务

通过命令行启动ngrokd服务很简单,只需要配置几个参数即可,httpAddr、httpsAddr分别是ngrok用来转发http、https服务的端口,可以自由配置,domain就是你的外网域名。ngrokd 还会开一个4443 端口用来跟客户端通讯,这个端口也可通过 -tunnelAddr=”:xxx” 指定。

./bin/ngrokd -tlsKey=server.key -tlsCrt=server.crt -domain="ngrok.shawnan.xyz" -httpAddr=":8088" -httpsAddr=":8443"

nginx映射

服务端启动完毕之后,还要配置nginx代理。在服务器上面的nginx的配置文件里面增加如下一段:

server {listen 80;server_name ngrok.shawnan.xyz *.ngrok.shawnan.xyz;location / {proxy_pass http://127.0.0.1:8088;proxy_redirect off;proxy_set_header Host $http_host:8088;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header X-Nginx-Proxy true;proxy_set_header Connection "";proxy_connect_timeout 90;proxy_send_timeout 120;proxy_read_timeout 120;}
}

此处就把ngrok.shawnan.xyz和*.ngrok.shawnan.xyz上的请求都转发到了8088上,实现客户端可以通过xxx.ngrok.shawnan.xyz域名访问。

启动客户端

http服务

linux在ngrok文件(windows在ngrok.exe)的同级目录新建配置文件,ngrok.config,输入以下内容(域名改成自己的):

server_addr: "ngrok.shawnan.xyz:4443"
trust_host_root_certs: false

然后利用以下命令启动:

ngrok -config=ngrok.config -subdomain=local 8080Tunnel Status                 online
Version                       1.7/1.7
Forwarding                    http://local.ngrok.shawnan.xyz:8888 -> 127.0.0.1:8080
Forwarding                    https://local.ngrok.shawnan.xyz:8888 -> 127.0.0.1:8080
Web Interface                 127.0.0.1:4040
# Conn                        0
Avg Conn Time                 0.00ms

启动后如果正常连接,Tunnel Status会显示online,这样就把local.ngrok.shawnan.xyz映射到了你本地的8080端口。
如果连接不上会显示connecting,超时之后还会显示reconnecting。

tcp服务

除了http服务,ngrok还可以对tcp服务进行转发,这样我们就可以通过转发22端口利用SSH把局域网内的linux服务器共享到局域网外面去远程连接了。
比如把本机的22端口转发到外网,还是使用刚才的配置文件,使用如下命令:

ngrok -config=ngrok.config -proto=tcp 22

如果配置文件里面没有配置端口,ngrok会随机选择一个端口进行tcp转发。比如将本地的22端口转发到了ngrok.shawnan.xyz的34538。

Tunnel Status                 online
Version                       1.7/1.7
Forwarding                    tcp://ngrok.shawnan.xyz:34538 -> 127.0.0.1:22
Web Interface                 127.0.0.1:4040
# Conn                        0
Avg Conn Time                 0.00ms

此时就可以使用域名和端口远程连接局域网内的linux机器了。

ssh xxx@ngrok.shawnan.xyz -p 34358

完善配置文件

前面ngrok随机选择了一个端口对22端口进行转发,很不方便,每次还需要先看一下端口才能远程ssh连接。此处如果想自定义tcp转发的端口,则需要完善ngrok的配置文件,通过完善配置文件,可以大大简化运行命令。配置文件前面两行不变,仍旧是配置服务器地址和禁用TLS加密协议的证书信任。下面配置管道,可以同时配置多种管道,比如ssh、http、https等。

server_addr: ngrok.moonwalker.me:4443
trust_host_root_certs: false
tunnels:ssh:remote_port: 1122proto:tcp: 22ftp:remote_port: 20proto:tcp: 20ftp2:remote_port: 21proto:tcp: 21http:subdomain: wwwproto:http: 80https: 443

配置完成后,可以直接启动指定的管道或者启动全部管道。

./ngrok -config ngrok.cfg start ssh
./ngrok -config ngrok.cfg start-all

配置成为服务并设置自启动

服务端和客户端都配置完了,但是我们不想每次都输入这么长的命令,那么就可以借助systemctl来将我们的服务配置成为系统服务并设置自动启动。此处以Centos7为例,CentOS7的服务systemctl脚本存放在:/usr/lib/systemd/system,在此文件夹下建立ngrok.service文件,内容如下:

[Unit]
Description=ngrok
After=network.target[Service]
ExecStart=/usr/local/ngrok/bin/ngrokd -tlsKey=/usr/local/ngrok/server.key -tlsCrt=/usr/local/ngrok/server.crt -domain=ngrok.shawnan.xyz -httpAddr=:8088 -httpsAddr=:8443[Install]
WantedBy=multi-user.target

[Unit]部分主要是对这个服务的说明,内容包括Description和After,Description用于描述服务,After用于描述服务类别。[Service]部分是服务具体运行参数的设置,此处ExecStart即为服务启动的命令,[Install]部分是服务安装的相关设置,可设置为多用户的。
配置完毕后,使用如下命令分别启动服务,停止服务,查看状态。

systemctl start ngrok.service // 启动
systemctl stop ngrok.service // 停止
systemctl status ngrok.service // 查看状态

使用enable指令可以配置该服务为开机自启动,这条命令实际上是创建了一个该文件的软连接到/etc/systemd/system/multi-user.target.wants/ngrok.service。放在/etc/systemd/system下的service都是会开机自启动的,但是比较规范的做法是放到/usr/lib/systemd/system,然后再使用systemctl enable设置开机启动。

systemctl enable ngrok.service

至此,借助ngrok,家里的笔记本也可以作为服务器对外提供服务了。

ngrok实现内网穿透,让家里的笔记本也能做服务器相关推荐

  1. Ngrok: 使用 Ngrok 实现内网穿透

    Jan 10,2017 in 教程 read (14235) | 百度已收录 | Author: Leonn 目录 背景 NAT 穿透原理 一个栗子 Ngrok 准备工作 编译服务端 服务端 测试连接 ...

  2. 使用工具ngrok 实现内网穿透(免费)

    使用工具ngrok 实现内网穿透 工具下载:ngrok下载,提取码:5555 使用:

  3. 内网穿透远程访问家里的群晖NAS 1-2

    系列文章 内网穿透远程访问家里的群晖NAS 1-2 内网穿透远程访问家里的群晖NAS 2-2 随着科学技术的发展,各类型的电子设备已经全面覆盖了我们的生活和工作,为了让这些电子设备能够连接为一个整体, ...

  4. Ngrok(内网穿透工具)使用教程详解

    简介 国内Ngrok官网地址 Ngrok是什么? ngrok 是一个反向代理,通过在公共的端点和本地运行的 Web 服务器之间建立一个安全的通道 ngrok 可捕获和分析所有通道上的流量,便于后期分析 ...

  5. 内网穿透远程访问家里的群晖NAS 2-2

     系列文章 内网穿透远程访问家里的群晖NAS 1-2 内网穿透远程访问家里的群晖NAS 2-2 上一篇:  内网穿透远程访问家里的群晖NAS 1-2 在上一篇文章中,我们为大家介绍了在群晖NAS中安装 ...

  6. 怎么使用ipv6进行内网穿透访问家里的服务

    首先,你需要确保你的路由器支持IPv6协议,并且已经开启了IPv6功能.然后,你可以使用一些内网穿透工具,比如ngrok或者frp,将你家里的服务暴露到公网上.这些工具通常都支持使用IPv6地址进行内 ...

  7. Ngrok 实现内网穿透教程(Ngrok 和 Sunny-Ngrok )

    ngrok是什么我这边就不多介绍了,百度一找一大堆.你可以把它理解为内网穿透的工具.(简而言之就是将内网IP映射成对外可访问的域名) Ngrok使用流程如下: 从https://ngrok.com/ ...

  8. CentOS7下使用ngrok搭建内网穿透服务器

    目录 1.简介 1 2. 必要条件 2 2.1.ngrok服务器 2 2.2.域名 2 2.3.ngrok客户端 2 3. 安装依赖包 2 4. 安装golang 2 5. 下载ngrok源码 3 6 ...

  9. 废旧Android手机搭建个人服务器:ksweb搭建Web服务器+Termux、Ngrok实现内网穿透

    写在前面: 本篇博客介绍利用废旧手机搭建一个服务器,可以放自己的网页搭建网站 之前闲着没事,低价买了个虚拟主机,放了自己的静态网页,搭建了个人博客引导网站,后来虚拟主机被打死,凑巧了解到相关知识,于是 ...

最新文章

  1. latex中的\label标签的作用
  2. open***配置成功分析(服务器)
  3. 信息系统项目管理师项目变更管理
  4. linux系统更新失败处理功能,Proxmox VE升级apt-get update失败处理 | linux运维小站–linux系统架构_服务器运维_Linux运维工程师工作手札...
  5. python基础知识点汇总_Python基础知识梳理
  6. 自动获取服务器,c#-自动获取服务器IP到客户端
  7. unity SDK/NDK的下载
  8. html中实现LED字体步骤记录
  9. 英语四级备考~自我总结
  10. 计算机组成原理期中考,计算机组成原理期中考卷
  11. 教你在“狼人杀”中实现变声效果
  12. 华硕路由器配置虚拟服务器,华硕ASUS路由器无线中继模式设置步骤图解
  13. mysql 1452 Cannot add or update a child row: a foreign key constraint fails
  14. python SSLError HTTPSConnectionPool bad handshake
  15. openwrt sdk下交叉编译aria2c
  16. PCB板框的绘制——AD19
  17. 研磨设计模式 配套源代码发放
  18. SecureCRT 终端仿真程序 v7.0.0.326 中文绿色便携破解版 地址
  19. 网站关停之后SEO资源怎么办?
  20. conj在c语言中什么意思,关于conj是什么词性

热门文章

  1. 怎么计算机械连接的工程量,结合GTJ2018,正确计算工程量
  2. UCOSii的任务切换
  3. 解决内嵌字幕的MKV视频剪辑分割时,字幕无法伴随子视频片段的问题
  4. u盘数据丢失恢复办法分享
  5. 电磁场与电磁波——静电场
  6. 百度云8秒视频,怎么破?
  7. 如何安全的保存密码?
  8. VirtualBox VM 空间瘦身记(vmdk)
  9. Emacs: 英文单词(或唐诗宋词/其它词库)补全
  10. 美国计算机属于敏感专业吗,美国留学F1签证中最常见被check的14个敏感专业