阿里云服务器+ngrok搭建内网穿透服务(只有公网ip无域名)

注意:现有的情况使用frp更为方便快捷,详情见frp的github网页(https://github.com/fatedier/frp)

frp配置服务端

配置文件frps.ini
[common]
bind_port = 7000      
dashboard_port = 7500
token = 12345678
dashboard_user = admin
dashboard_pwd = admin
vhost_http_port = 10080
vhost_https_port = 10443
启动服务端
./frps -c frps.ini

frp配置客户端

配置文件frpc.ini
[common]
server_addr = ip(server ip)
server_port = 7000

[http]
type = http
local_ip = 127.0.0.1
local_port = 8081
custom_domains =  ip(server ip)
启动客户端
./frpc -c frpc.ini

本篇记录阿里云服务器+ngrok搭建内网穿透服务(只有公网ip无域名

有的时候在项目开发或者远程开发时,需要把本地端口映射到公网上,让本地端口可以远程访问(TCP(ssh), http, https等),如果自己没有一台拥有公网ip的服务器的话可以租一台阿里云服务器,这里选择突发实例t5(1vcpu, 0.5GIB,固定1M带宽),月费大概在45人民币。

阿里云服务器上操作:

购买完成后,在阿里云服务器中添加安全组开放端口,注意,ngrok默认使用4443端口进行通信。
远程ssh连接到阿里云服务器上,更新(由于阿里云服务器默认使用了root权限,所以不用加sudo,如果是自己的服务器请加sudo)
apt-get update
安装git和go语言(为ngrok提供支持)
apt-get install git golang

检查

go version
git
下载源码
 git clone https://github.com/inconshreveable/ngrok.git
使用ip生成自签证书
# 生成自签证,一年过期
export DOMAIN=xx.xx.xx.xx # 域名,这里我用了 ip
echo subjectAltName = IP:xx.xx.xx.xx > extfile.cnf #如果使用ip直接访问的话必须加这一句以及最后的-extfile extfile.cnf

openssl genrsa -out rootCA.key 2048
openssl req -x509 -new -nodes -key rootCA.key -subj "/CN=$DOMAIN" -days 10000 -out rootCA.pem
openssl genrsa -out device.key 2048
openssl req -new -key device.key -subj "/CN=$DOMAIN" -out device.csr
openssl x509 -req -in device.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out device.crt -days 10000 -extfile extfile.cnf

# 复制到 assets 构建的时候自动引用
cp rootCA.pem assets/client/tls/ngrokroot.crt
cp device.crt assets/server/tls/snakeoil.crt
cp device.key assets/server/tls/snakeoil.key
去掉随机生成的 subdomain

ngrok 客户端会自动生成一个随机子域名或者用户自定义一个,总之无论如何都会有一个域名,这就会导致 ip 域名无效, 例如http://92832de0.1.1.1.1 -> localhost:80, 解决办法就是改源码,去掉随机生成的 subdomain

// src/ngrok/server/tunel.go  #89 行
// Register for random URL
    t.url, err = tunnelRegistry.RegisterRepeat(func() string {
      return fmt.Sprintf("%s://%x.%s", protocol, rand.Int31(), vhost)
    }, t)

删掉 %x. ,rand.Int31(), 以及该文件第一行引入的 math/rand,重新编译出服务端与客户端即可。这样不加 -subdomain 选项就不会有子域名

编译服务端(编译可能会很慢,慢慢等)

如果出现GnuTLS recv error (-110): The TLS connection was non-properly terminated,安装gnutls-bin

apt-get install gnutls-bin

继续编译

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

编译完成后在bin目录下应当有如下文件:

go-bindata  ngrok  ngrokd

ngrokd是公网阿里云服务器上运行的程序,ngrok是本地运行的程序,可以使用scp拷贝到本地

启动服务端

./bin/ngrokd -tlsKey=device.key -tlsCrt=device.crt -domain="47.103.192.173" -httpAddr=":4001" -httpsAddr=":4002"

启动客户端

写配置文件ngrok.cfg

server_addr: "ip:port"
trust_host_root_certs: false
tunnels:
 ssh:
  proto:
   tcp: 127.0.0.1:22
  remote_port: 4000

开始配置的ssh隧道

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

开启http转发

./ngrok --config=./ngrok.cfg --proto=http 80

(其他)使用tmux在后台运行程序

apt-get install tmux

新建tmux窗口(名称为ngrok)并进入,退出用Ctrl+D,或者直接关闭窗口

tmux new-session -s ngrok

连接tmux窗口

tmux attach-session -t ngrok

列出所有tmux窗口

tmux ls

关闭某个tmux窗口

tmux kill-window -t ngrok

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值