我的 GitHub 仓库:
在很多场景下内网穿透都是我们常常遇到的需求,之前也用过花生壳、ngrok、FRP 等等一些工具,但是由于限速、收费、安全各方面因素只好放弃了。
目前所在实验室主要从事和机器学习相关工作,有一台高配 GPU 计算型服务器,大家使用 Jupyter Notebook 在网页上进行编码工作,但是只能在学院内网才能进行使用,在外面就无法使用让人比较抓狂。如果购买阿里云等深度学习服务,价格昂贵,只好决定通过内网穿透实现公网工作。
近期无意间看到 这款开源工具,正好实验室购置了一台公网服务器,正好可以实现内网穿透,决定入坑折腾一番。对于有后台开发基础的同学还是挺简单的,不过好记性不如烂笔头,来吧,这里手把手深入探索一番。
一、概述
1.1 什么是内网穿透
好吧,先上一段百度百科的定义
内网穿透,即NAT穿透,网络连接时术语,计算机是局域网内时,外网与内网的计算机节点需要连接通信,有时就会出现不支持内网穿透。
反正简单来说,就是能通过公网访问你的内网服务,把你的内网通过一台公网服务器,穿透出去。
1.2 什么是 lanproxy
1.3 原理
内网穿透的原理如下图所示:
- 用户访问我们的服务器,这个服务器是有公网IP的,所以用户可以无压力访问
- 本地电脑将响应回复给服务器
- 服务器将响应回复给用户
要搭建内网穿透,我们得完成两个任务
- 在公网能访问的服务器上运行我们的内网穿透服务;
- 在本地电脑上面运行内网穿透客户端。
当然,你可以自己根据原理实现一套,不过我们有现成的三方开源工具,可以帮我们实现这一套功能。这个就是我们今天的主角 。
二、快速开始
这里我将手把手带你配置 lanproxy 穿透服务,这里配置主要分成了 公网服务器配置 和 内网电脑配置 。 在内网电脑配置中分为:Java 客户端和 GO 客户端
2.1 硬件与环境要求
这里以我的环境为例
- 一台公网服务器(Centos 7.4,当然这不重要,反正都 docker 啦) docker(简化更多的配置,这里采用 docker 容器进行搭建) Nginx 环境
- 一台内网电脑(Ubuntu 16.04) Java JDK 1.8 Maven(包依赖管理工具) docker 启动服务,tensorflow(jupyter notebook)
- 已备案的域名
2.2 公网服务器配置(Docker 一键启动)
基础环境安装
- 安装 docker 服务,以 CentOS 7.4 为例
1、安装依赖包 $ sudo yum install -y yum-utils device-mapper-persistent-data lvm2
2、设置稳定版仓库 $ sudo yum-config-manager –add-repo https://download.docker.com/linux/centos/docker-ce.repo
3、安装 //安装最新版本 $ sudo yum install docker-ce
//或者安装指定版本 $ yum list docker-ce –showduplicates | sort -r //显示有以下版本 docker-ce.x86_64 18.03.0.ce-1.el7.centos docker-ce-stable //指定一个版本进行安装 $ sudo yum install docker-ce-<VERSION STRING>
4、启动doker $ sudo systemctl start docker
5、通过运行hello-world镜像验证安装是否成功 $ sudo docker run hello-world
- 安装 Nginx 服务,以 CentOS 7.4 为例
1.添加Nginx到YUM源 $ sudo rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
2.安装Nginx $ sudo yum install -y nginx Nginx将完成安装在你的CentOS 7 服务器中。
3.启动Nginx $ service nginx start
- 更多配置请参考:
通过 Docker,启动 lanproxy 服务
启动 Docker 后运行一下代码
docker run -d --name lanproxy-server -p 8090:8090 -p 4900:4900 -p 4993:4993 -p 9000-9100:9000-9100 biodwhu/lanproxy
输入你的公网服务器 IP:8090,例如: lanproxy 的基础环境已经搭建成功,是不是很快,这就是 docker 的魅力。如果不用 docker 启动,请参考 lanproxy 的官方文档。
默认:account/password:admin/admin
Nginx 反向代理配置域名
# 两个域名都解析到你的公网上去
# 这个域名由于访问 lanproxy 管理后台 lanproxy.frankfeekr.cn => 120.92.10.120 | Nginx to => 127.0.0.1:8090
# 这个域名由于访问你的内网电脑服务,9000 端口可自由的在 lanproxy 管理后台进行配置 jupyter.frankfeekr.cn => 120.92.10.120 | Nginx to => 127.0.0.1:9000
好啦,上门就是对域名进行了一些简单的解释,现在开始 Nginx 的配置
- 进入 /etc/nginx/conf.d Nginx 的配置目录,在这里创建配置文件
- 创建 lanproxy.frankfeekr.cn.conf 配置文件
server { listen 80; # 这里使用自己的域名 server_name lanproxy.frankfeekr.cn; charset utf-8; location / { proxy_set_header X-Real-IP $remote_addr; proxy_set_header Host $http_host; # 这里根据你的 lanproxy 配置,改成 config.server.port的值 proxy_pass http://127.0.0.1:8090; client_max_body_size 35m; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; } }
- 创建 jupyter.frankfeekr.cn.conf 配置文件
server { listen 80; # 这里使用自己的域名 server_name jupyter.frankfeekr.cn; charset utf-8; location / { proxy_set_header X-Real-IP $remote_addr; proxy_set_header Host $http_host; # 这里根据你的lanproxy配置,改成 外网接口 的值,在lanproxy后台网页上配置,后面配置 proxy_pass http://127.0.0.1:9000; client_max_body_size 35m; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; } }
- 重启 Nginx 服务
$ service nginx restart
至此,你可以通过域名 进行访问 lanproxy 网页后台配置
继续配置 lanproxy 后台服务
- 添加一个客户端
- 添加配置
至此,服务端的配置就完成了。下面开始内网电脑的配置。
2.3 内网电脑配置(Java 客户端)
这里我的内网是一台 Ubuntu 16.04 的服务器,以下我都将以此为例
Java 1.8 安装
- 下载 JDK1.8(lanproxy 支持 JDK1.7 以上环境)
$ wget https://download.oracle.com/otn-pub/java/jdk/8u191-b12/2787e4a523244c269598db4e85c51e0c/jdk-8u191-linux-x64.tar.gz
- 解压安装包,移动文件夹到 /user/lib 目录
- 环境变量配置 这里是将环境变量配置在 etc/profile,即为所有用户配置 JDK 环境。
$ vim + etc/profile
环境设置
#set java env export JAVA_HOME=/usr/lib/jdk/jdk1.8.0_191 export JRE_HOME=${JAVA_HOME}/jre export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib export PATH=${JAVA_HOME}/bin:$PATH
执行命令使修改立即生效
$ source /etc/profile
- 配置软连接 软连接相当于windows系统中的快捷键,部分软件可能会从/usr/bin目录下查找Java,因此添加该软连接防止其他软件查找不到的情况。
$ sudo update-alternatives --install /usr/bin/java java /usr/lib/jdk/jdk1.8.0_191/java 300 $ sudo update-alternatives --install /usr/bin/javac javac /usr/lib/jdk/jdk1.8.0_191/bin/javac 300
- 测试安装是否成功
# 在终端输入,出现版本号则表示安装成功 $ java -version
更详细文档:
maven 安装
maven 是个项目管理工具,在编程领域应用广泛。
- 下载maven。
$ wget https://www-eu.apache.org/dist/maven/maven-3/3.6.0/binaries/apache-maven-3.6.0-bin.tar.gz
- 解压到 /opt/maven 目录
创建 manve 目录。
$ sudo mkdir /opt/maven
解压到 /opt/maven 目录下。
$ sudo tar zxvf apache-maven-3.6.0-bin.tar.gz -C /opt/maven
- 配置 maven 环境
$ vim + /etc/profile
在文件内容后面添加以下内容:
# set maven env export M2_HOME=/opt/maven/apache-maven-3.6.0 export CLASSPATH=$CLASSPATH:$M2_HOME/lib export PATH=$PATH:$M2_HOME/bin
保存,输入以下命令使配置文件生效。
$ source /etc/profile
验证是否安装成功。
$ mvn -v
- 修改 maven 源为阿里云,以及仓库默认存放路径。这样 maven 下载 jar 包的速度会快很多。
打开 maven 的配置文件
$ vim /opt/maven/apache-maven-3.6.0/conf/settings.xml
在 /home 目录下生成 maven/repository 文件夹
<localRepository>maven/reposity</localRepository>
修改源
<mirrors> <mirror> <id>alimaven</id> <name>aliyun maven</name> <url>http://maven.aliyun.com/nexus/content/groups/public/</url> <mirrorOf>central</mirrorOf> </mirror> </mirrors>
至此,Maven 安装成功
参考资料:
启动内网服务
在前面我们将 反向代理(公网服务器 9000 服务,内网 5050)
这里我们需要确保在内网电脑上,浏览器能够访问到 127.0.0.1:5050 这个服务。以我的 notebook 为例:
这里,我的内网服务已经启动。接下来只需要启动 lanproxy 客户端即可。
运行 lanproxy client 服务
官方提供了两种方式运行客户端,一种方式是使用官方提供的 GO,另一种通过 Java 环境运行。本文采用主流的 Java 方式运行
- 克隆 lanproxy 代码到本地电脑
$ git clone https://github.com/ffay/lanproxy.git lanproxy
- 打包 lanproxy 打包之前需要确保你安装了 maven
$ cd lanproxy $ mvn package
- 修改配置文件信息 打包完成之后,客户端文件会出现在 distribution/proxy-client-0.1 目录下,打开之后有是个文件夹:bin、conf、lib和log,配置信息在 conf/config.properties 文件内,根据前面服务端的配置信息修改一下。
# 这里是在lanproxy后台配置的密钥 client.key=e6a49a19b8024652ab4ff2210abf2c6a
# 配置ssl信息,根据服务端的配置填写(enable = false 就不需要配置) ssl.enable=false ssl.jksPath=test.jks ssl.keyStorePassword=123456
# 服务器的ip server.host=120.92.10.120
#proxy-server ssl默认端口4993,默认普通端口4900 #ssl.enable=true时这里填写ssl端口,ssl.enable=false时这里填写普通端口 server.port=4900
- 启动客户端 客户端信息配置完成之后就可以启动客户端了
# mac/linux使用这个 $ bash bin/startup.sh
# Windows 直接运行 bin/startup.bat
- 访问测试 至此,即可通过公网域名 访问内网服务,实现内网穿透
当然你也可以通过公网 IP 和域名访问,例如: 这种方式访问!
- 停止客户端
$ bash bin/stop.sh
lanproxy 网页后台服务
客户端启动服务后,后台可查看状态(在线 / 离线)
流量统计
2.4 内网电脑配置(GO 客户端)
GitHub 客户端主页:
不想安装 Java 环境的可以选择 Go
安装Go环境安装
1. buntu、Debian或Linux Mint安装Go语言
基于 Debian的 Linux 发行版本都可以使用 apt-get 命令来进行安装:
sudo apt-get install golang
要查看当前系统安装的 Go 语言版本可以使用如下命令:
go version
由于 Go 代码必需保存在 workspace(工作区)中,所以我们必需在 Home 目录(例如 ~/workspace)创建一个workspace 目录并定义 GOPATH 环境变量指向该目录,这个目录将被 Go 工具用于保存和编辑二进制文件。
mkdir ~/workspace echo export GOPATH="$HOME/workspace" >> ~/.bashrc source ~/.bashrc
根据不同的需要,我们可以使用 apt-get 安装 Go tools:
sudo apt-cache search golang
2. Fedora、CentOS或RHEL安装Go语言
基于 Red Hat 的 Linux 发行版本都可以使用 yum 命令来进行安装:
sudo yum update sudo yum install golang
要查看当前系统安装的 Go 语言版本可以使用如下命令:
go version
接下来还是在 Home 目录(例如 ~/workspace)创建一个 workspace 目录并定义 GOPATH 环境变量指向该目录,这个目录将被 Go 工具用于保存和编辑二进制文件。
mkdir ~/workspace echo export GOPATH="$HOME/workspace" >> ~/.bashrc source ~/.bashrc
根据不同的需要,我们可以使用 yum 安装 Go tools:
yum search golang
参考资料:
拉取 ffay/lanproxy-go-client 代码
git clone https://github.com/ffay/lanproxy-go-client.git
安装客户端依赖包
cd lanproxy-go-client sh build-release.sh
安装后,这时候在目录下会出现文件。
启动客户端
普通端口连接
# mac 64位 nohup ./client_darwin_amd64 -s SERVER_IP -p SERVER_PORT -k CLIENT_KEY &
# linux 64位 nohup ./client_linux_amd64 -s SERVER_IP -p SERVER_PORT -k CLIENT_KEY &
# windows 64 位 ./client_windows_amd64.exe -s SERVER_IP -p SERVER_PORT -k CLIENT_KEY
SSL端口连接
# mac 64位 nohup ./client_darwin_amd64 -s SERVER_IP -p SERVER_SSL_PORT -k CLIENT_KEY -ssl true &
# linux 64位 nohup ./client_linux_amd64 -s SERVER_IP -p SERVER_SSL_PORT -k CLIENT_KEY -ssl true &
# windows 64 位 ./client_windows_amd64.exe -s SERVER_IP -p SERVER_SSL_PORT -k CLIENT_KEY -ssl true
例如:
nohup ./client_linux_amd64 -s lp.thingsglobal.org -p 4900 -k 01c1e176d6ee466c8db717a8 &
命令参数:
GLOBAL OPTIONS: -k value client key -s value proxy server host -p value proxy server port (default: 4900) --ssl value enable ssl (default: "false", -p value should be server ssl port) --cer value ssl cert path, default skip verify certificate --help, -h show help --version, -v print the version
三、总结
通过以上的配置,只要有一台公网电脑,即可实现内网穿透功能。摆脱花生壳的域名端口限制,流量限制,带宽限制。笔者的公网服务器为 6M 带宽,通过公网映射,文件下载测试大概在 800K/s – 1.5M/s 范围,如果仅是普通的网站服务完全可以完美穿透。
参考资料
业务搭载离不了云服务器,选择合适的平台最重要!
从目前国内云计算市场的格局来看,国内云计算前三强分别是阿里云、腾讯云和华为云,阿里云、腾讯云作为背靠互联网平台的企业,更偏向于B端用户;华为与作为传统的通信巨头,更偏向于G端。
本人从事云计算相关工作至今已有多年,国内主流的云平台都接触过,包括他们的销售及技术团队,对各家的产品也小有了解,并且指导过数百家企业迁移上云,对云平台选择也有一定的发言权!
网上有很多评测,评测数据也五花八门,说谁好的都有,这个两篇博文分析汇总的非常详细,分享给大家,文档地址:
博文1:
博文2:
如果是高并发,高IO业务场景,需要确定服务器规格,可让业务应用性能发挥到最佳,参考官方文档:
阿里云服务器规格:
腾讯云服务器规格:
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/291202.html