Motivation
我搭建内网穿透,主要是因为在阿里云租的服务器配置较低,考虑到如果把一些web service放在阿里云上面运算,可能提不起来速度,也会消耗较多的云服务器资源,使得我能同时部署的项目变少。所以需要将service搭在内网,然后通过外网的ip访问内网的服务。内网穿透负责让内网的service端口A映射到外网的监听端口B,反向代理让外网的访问端口C能和监听端口B连上。
这里介绍一种快捷、轻便的方案。虽然有一些不足,但是很适合在完全不懂原理的情况下操作。
然而我以后可能会直接使用内网穿透&反向代理(重剑无锋)的方案了。
介绍
最初在网上试了很多,nginx,ngrok,ssh,都有坑。最终还是万能的github解决了问题。
这个rproxy项目主要基于go语言编写。代码简短,理解原理、实际使用上都非常方便。但是我试过之后无法实现ssh穿透。
这个tunnel项目主要用c语言编写,代码也很简单。可以实现ssh。有个不足是,它无法指定公网的对外ip,即公网的端口是变化的,所以运行之后,还要去阿里云上面开放端口,也有点蠢。
所以还是推荐直接采用这个方案内网穿透&反向代理(重剑无锋)
下面分为3个部分
- 安装go语言
- 使用rproxy
- 使用tunnel
安装go
- 自动安装
最简单的是用yum install golang
,但我没成功,提示说没golang这个包,所以要手动安装。 - 手动安装
- 下包
直接进golang官网下载无法成功,没能连出去。所以去这个中文站手动下载。
下载之后解压安装,目录为/usr/local:tar -C /usr/local -xzf filename
,由于版本不同,所以filename改成自己下的名字。 - 配置环境变量
vi /etc/profile
在最后加上下面3行
export GOROOT=/usr/local/go #设置为go安装的路径
export GOPATH=/code/goDemo #默认安装包的路径
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin
更新配置文件source /etc/profile
- 查看版本信息:
go version
,如果有输出就是成功。
使用rproxy做内网服务穿透
- 拉代码:
git clone https://github.com/ying32/rproxy.git
- 给权限:
chmod a+x rproxy/*
- 编译:
cd rproxy
go build
- 到了这里。上面的代码应该在服务端和客户端上都执行一遍。
我们看一下服务端的runsrv.sh文件:vi runsrv.sh
。内容为:
./rproxy --tcpport=8818 --httpport=43006 --mode="server" --vkey="DKiic1g3kY"
# --tcpport 是 服务端 对客户端 监听的端口
# --httpport 是 服务端 向外 开放的端口
# --mode 启动模式,server
# --vkey 客户端与服务端建立连接时校验的加密key,简单的。
再看一下客户端的runcli.sh文件:vi runcli.sh
。内容为:
./rproxy --tcpport=8818 --httpport=8876 --mode="client" --svraddr="106._._._" --vkey="DKibg3kY"
# --tcpport 是 服务端 对客户端 监听的端口
# --httpport 是 客户端 向服务端 开放的端口
# --mode 默认为client
# --svraddr 为连接服务器的地址,不需要填写端口
# --vkey 客户端与服务端建立连接时校验的加密key,简单的。
如果按我上述的端口设定,分别在客户端和服务端运行程序。
然后在其他机器用浏览器访问106.\_.\_.\_:43006
就会先通过外网的43006端口,转发到外网的8818端口,再转发到内网的8876,达到了通过外网ip访问内网8876端口上的服务的效果。
如果想让终端关闭了、进程还能继续跑,可以使用nohup ./xxx.sh
运行程序
利用tunnel做ssh映射
由于rproxy没法做ssh,其他的普通ssh方法链接效果有点不好,虽然能成功,但是还是有掉线的问题。
可以选择编译项目,然后运行tunnel和tunneld,项目作者也直接提供了编译好的文件,在这里,可以直接在服务器运行tunneld和在客户端运行tunnel,两个命令解决。
- tunneld(服务器端)使用说明
执行 tunneld 文件
tunneld
Enter listening port(default 8877):8877
Enter connection password(default maqian.cc):maqian.cc
Port:8877, Password:maqian.cc
Listening...
这时 tunneld 已启动成功,等待客户端连接。
- tunnel(客户端)使用说明
执行 tunnel 文件
tunnel
Enter server IP:xx.xx.xxx.xxx
Enter server port(default 8877):8877
Enter connection password(default maqian.cc):maqian.cc
Enter local port:22
Server IP:xx.xx.xxx.xxx, Server Port:8877, Password:maqian.cc, Local Port:22
Successfully connected, address: xx.xx.xxx.xxx:45915
这样 tunnel 就连接服务器成功了,address是映射到公网的IP和端口,通过访问address的IP和端口就可以访问内部网络服务了。
其他
ssh反向代理()
参考:
https://www.cnblogs.com/kwongtai/p/6903420.html
https://blog.csdn.net/sinat_27774177/article/details/76474834
问题描述:要让外网的机器C通过阿里云上的B能连到内网的A,配置如下所示:
机器 | IP | user | pwd |
---|---|---|---|
局域网机器A | 192.168.. | student_docker | xxx |
阿里云机器B | 106._._._ | root | yyy |
先在A上操作:
ssh -fCNR 43005:localhost:22 root@106._._._
43005是指定B机器的端口,这里将B的43005和A的22映射
ssh -R 43004:localhost:22 root@106._._._
-
登去B,查看状态
netstat -tnl
在B上操作:ssh -fCNL *:43004:localhost:43005 localhost
43004代表另一个映射,43005就是第一步指定的映射。在执行ssh命令的时候,会让输入密码,一个是远程密码,一个是内网密码。
登去C,用ssh连接,
ssh -p 43004 student_docker@106._._._
输入密码xxx,成功登录。
但是这种方式容易断,然而我下载autossh又没有成功,没法开自动监听。
安装ngrok实现内网穿透
参考:https://blog.csdn.net/truong/article/details/73250683
- 安装依赖包
yum install zlib-devel openssl-devel perl hg cpio expat-devel gettext-devel curl curl-devel perl-ExtUtils-MakeMaker hg wget gcc gcc-c++ golang
- 下载,配置,编译,启动服务端
# 克隆ngrok git仓库,
git clone https://github.com/inconshreveable/ngrok.git
cd ngrok
# 设定变量
NGROK_DOMAIN="106._._._"
# 生成秘钥
openssl genrsa -out rootCA.key 2048
openssl req -x509 -new -nodes -key rootCA.key -subj "106._._._" -days 5000 -out rootCA.pem
openssl genrsa -out device.key 2048
openssl req -new -key device.key -subj "106._._._" -out device.csr
openssl x509 -req -in device.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out device.crt -days 5000
# 复制秘钥
cp rootCA.pem assets/client/tls/ngrokroot.crt
cp device.crt assets/server/tls/snakeoil.crt
cp device.key assets/server/tls/snakeoil.key
# 编译
make release-server
make release-client
# 服务端运行
bin/ngrokd -httpAddr=":8818"
- 启动客户端
mkdir ngrok
vi ngrok.cfg
# 输入以下2行内容
server_addr: "106._._._:4443"
trust_host_root_certs: false
# 赋予权限
sudo chmod a+x ngrok
# 启动客户端,将8080端口映射让远程监听
./ngrok -config=ngrok.cfg 8080