注意:现有的情况使用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