内网穿透&反向代理(奇技淫巧)

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这个包,所以要手动安装。
  • 手动安装
  1. 下包
    直接进golang官网下载无法成功,没能连出去。所以去这个中文站手动下载。
    下载之后解压安装,目录为/usr/local:tar -C /usr/local -xzf filename,由于版本不同,所以filename改成自己下的名字。
  2. 配置环境变量
    vi /etc/profile在最后加上下面3行
export GOROOT=/usr/local/go #设置为go安装的路径
export GOPATH=/code/goDemo #默认安装包的路径
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin

更新配置文件source /etc/profile

  1. 查看版本信息:go version,如果有输出就是成功。
    golang成功安装

使用rproxy做内网服务穿透

  1. 拉代码:git clone https://github.com/ying32/rproxy.git
  2. 给权限:chmod a+x rproxy/*
  3. 编译:
cd rproxy
go build
  1. 到了这里。上面的代码应该在服务端和客户端上都执行一遍。

我们看一下服务端的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端口上的服务的效果。

内网穿透&反向代理(奇技淫巧)_第1张图片
成功穿到内网的tensorboard

如果想让终端关闭了、进程还能继续跑,可以使用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和端口就可以访问内部网络服务了。

客户端连接服务器成功
内网穿透&反向代理(奇技淫巧)_第2张图片
登录客户端成功

其他

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
  1. 先在A上操作:ssh -fCNR 43005:localhost:22 root@106._._._
    43005是指定B机器的端口,这里将B的43005和A的22映射
    ssh -R 43004:localhost:22 root@106._._._

  2. 登去B,查看状态netstat -tnl
    在B上操作:ssh -fCNL *:43004:localhost:43005 localhost
    43004代表另一个映射,43005就是第一步指定的映射。

    在执行ssh命令的时候,会让输入密码,一个是远程密码,一个是内网密码。

  3. 登去C,用ssh连接,ssh -p 43004 student_docker@106._._._
    输入密码xxx,成功登录。

但是这种方式容易断,然而我下载autossh又没有成功,没法开自动监听。

安装ngrok实现内网穿透

参考:https://blog.csdn.net/truong/article/details/73250683

  1. 安装依赖包
    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
  2. 下载,配置,编译,启动服务端
# 克隆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"
  1. 启动客户端
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

你可能感兴趣的:(内网穿透&反向代理(奇技淫巧))