在内网部署的一个应用,想分享给外网的小伙伴玩玩?
学校实验室有一台高性能服务器,在外网就无法使用?
来吧,内网穿透,了解一下?
1. 关于内网穿透
1.1 什么是内网穿透
且看百度百科的说法:
内网穿透,也即 NAT 穿透,进行 NAT 穿透是为了使具有某一个特定源 IP 地址和源端口号的数据包不被 NAT 设备屏蔽而正确路由到内网主机。
说人话:通过一台公网服务器,把你的内网服务穿透出去,使得别人在公网也能访问你的服务。
下面这张图,很好解释了内网穿透的基本原理:
用户访问我们的内网服务,本质上是通过了公网服务器
这个桥梁。
因为这个公网服务器
是有公网IP的,而公网服务器
和内网的服务器持久保持联系。
所以,当用户有请求发送时,公网服务器
将请求转发到我们的内网,内网再将响应回复给公网服务器
,公网服务器
将响应回复给用户。
1.2 如何实现内网穿透
如果你在百度搜索内网穿透
,会找到花生壳、ngrok、FRP 等一些商业化工具,不过这些工具通常需要收费,免费的往往会限速。
当然,也有免费的开源工具,对于有一定开发基础的小伙伴,还是很容易上手的。
今天,就带着大家实操一番。
前段时间,带着大家申请了两台云服务器:
这次刚好拿它们来做实验,带大家快速跑通流程。
- 甲骨文云服务器:作为服务端
- 腾讯云服务器:作为客户端
2. 公网服务端配置
2.1 服务端启动
为了降低部署门槛,开源社区已经有小伙伴做好了 docker 镜像。
所以,服务端我们直接采用 docker 启动。
首先,新建项目文件夹:
mkdir lanproxy
cd lanproxy
然后,编写 docker-compose.yml 配置文件:
version: '3.1'
services:
lanproxy-client:
image: franklin5/lanproxy-server
container_name: lanproxy-server
environment:
# 配置后台管理账号,默认admin
- LANPROXY_USERNAME=admin
# 配置后台管理密码,默认admin
- LANPROXY_PASSWORD=admin
volumes:
# 用于保存创建的配置文件,避免重启服务后配置消失
- /usr/local/docker/lanproxy-server/config-data:/root/.lanproxy
ports:
- 8090:8090
- 4900:4900
- 4993:4993
- 9000-9100:9000-9100
restart: always
解释下上面几个端口:
- 8090:用于服务端 web 界面,方便对多个客户端进行管理
- 9000-9100:用于配置多个客户端,进行端口映射
最后,启动服务:
docker-compose up -d
启动成功后,在宝塔面板中查看状态,如果启动失败。管理
这里进去可以查看容器日志:
服务端配置成功!
2.2 打开防火墙
注意:上述端口:8090、4900、4993、9000-9100 都需要在防火墙中放开,否则无法访问!
有不了解的小伙伴可参考这两篇:
2.3 打开 Web 管理界面
打开 web 应用,也就是公网服务器的 IP + 端口号,例:your_ip:8090
。登陆账号和密码,在 docker-compose.yml 中有配置,默认都是 admin。
进来后,我们先添加一个客户端,注意这里的密钥,会在后面客户端配置时需要用到。
3. 内网客户端配置
3.1 安装 Java 环境
比如我们要装稳定版 Java 1.8,命令行一键安装:
sudo apt install openjdk-8-jre-headless
当然,也可以直接在宝塔面板中进行安装:
上图中给出了 JDK 的地址,我们需要将其加入到环境变量中:
echo "export PATH=$PATH:/www/server/java/jdk1.8.0_371/bin/" >> ~/.bashrc
# 让更改立即生效
source ~/.bashrc
再看下是否安装成功:
java -version
3.2 安装客户端
下载:
git clone https://github.com/frank-lam/lanproxy-client.git
修改配置文件:
在 distribution/proxy-client-0.1/conf/config.properties
中进行修改.m默认只需要填入 client.key
和 server.host
:
# 这里是在lanproxy后台配置的密钥
client.key=刚刚在 2.2 拿到的客户端密钥
# 配置ssl信息,根据服务端的配置填写(enable = false 就不需要配置)
ssl.enable=false
ssl.jksPath=test.jks
ssl.keyStorePassword=123456
# 公网服务器ip,也支持域名
server.host=xx.xx.xx.xx
#proxy-server ssl默认端口4993,默认普通端口4900
#ssl.enable=true时这里填写ssl端口,ssl.enable=false时这里填写普通端口
server.port=4900
启动客户端服务:
sh start.sh
如果需要关闭服务:
# 查看客户端运行状态
sh status.sh
# 停止客户端
sh stop.sh
回到客户端管理界面,发现当前客户端状态,已经变更为 在线
:
4、添加端口映射
回到客户端管理界面,在 配置管理
这里,添加一个端口映射:
- 代理名称:随便填
- 公网端口:9000-9100 中任意一个,用于映射到内网服务
- 内网主机 IP:找到内网主机的 IP,以及你要映射出来的服务的端口号
按照上述步骤,我为当前客户端添加了两个映射关系:
所以,服务端和客户端的映射关系应该是:
- 公网服务端的 IP:9000 对应 101.33.210.166:3001
- 公网服务端的 IP:9001 对应 101.33.210.166:3000
其中 3000 端口是我们上篇中配置的 OneAPI, 我们打开来看看:
代理成功后,后台还支持查看流量数据:
至此,你就可以愉快地采用公网 IP + 9000-9100 端口号去访问内网服务了~
写在最后
本文通过一场实操带大家走完了内网穿透
的全部流程~
作为一款开源免费的服务,lanproxy 使用门槛低,配置简单,非常适合新手玩家尝试。
如果本文对你有帮助,欢迎点赞收藏备用!
大家都在用哪些内网穿透服务,欢迎评论区告诉我~