1我的目标:

实现通过域名访问局域网tomcat服务,域名访问方便本地微信调试

2思路:

(1)用服务器搭建内网穿透

利用FRP实现穿透,frp 是一个专注于内网穿透的高性能的反向代理应用,支持 TCP、UDP、HTTP、HTTPS 等多种协议。可以将内网服务以安全、便捷的方式通过具有公网 IP 节点的中转暴露到公网。

  1. 域名映射到服务器nginx 443端口

  1. 服务器nginx443 转发到 服务器的 FRP 服务端28700端口(自定义的)

  1. 服务器的 FRP 服务端7000端口 连接 局域网本机 FRP 客户端7000端口

  1. 局域网本机 FRP 客户端 转发到 本机服务80端口

详细搭建教程见后文

(2)通过宽带,找运营商免费申请公网IP

路由或猫有了拨号后,即可获得公网IP,再由路由或猫映射到内网机器端口

由于普通宽带是动态IP,所以如果要全自动切换或查询,则需要动态获取IP,思路如下

  1. 可以通过路由APP获得,或者通过IP查询网站

  1. 如果需要域名映射到IP时刻保持动态更新,可以调用阿里云接口实现,现成工具https://github.com/xuchao1213/AliyunDdnsCSharp

  1. 但是域名映射更换毕竟有10分钟延迟,也可以通过程序将IP写到网上某个位置,比如对象存储、gitee,如果用对象存储可以实现网页自动跳转

(3)通过现成内网穿透软件

比如花生壳,natapp,想要速度快、域名固定,则需要付费,

免费速度很慢,域名总变

3利用服务器,搭建FRP流程

思路流程见上文2.(1)

(1)域名映射到服务器IP

(2)nginx监听域名,并转发到服务器FRP

我需要用https协议,所以监听443端口,并转发到FRP服务端IP:28700

server {
    listen 443 ssl;
    server_name 你的域名;
    root html;
    index index.html index.htm;
    ssl_certificate cert/你的域名证书.pem;
    ssl_certificate_key cert/你的域名证书.key;
    ssl_session_timeout 60m;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
    #表示使用的加密套件的类型。
    ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3; #表示使用的TLS协议的类型,您需要自行评估是否配置TLSv1.1协议。
    ssl_prefer_server_ciphers on;
    location / {
        #root /usr/share/nginx/html/;  #Web网站程序存放目录。
        #index index.html index.htm;
        proxy_pass http://FRP服务端IP:28700/;
        proxy_redirect http:// $scheme://;
        proxy_set_header  Host       $host;
        proxy_set_header  X-Real-IP    $remote_addr;
        proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

(3)服务器用docker 搭建FRP的服务端

服务器新建frps.ini配置文件

[common]
bind_port = 7000
vhost_http_port = 28700

authentication_method = token
authenticate_new_work_conns = true
token = 123456

28700端口用于接收nginx转发的访问请求

7000端口用于frp服务端接收请求后 与 内网frp客户端的7000通信

token是自定义秘钥,用于安全校验

在服务器上,通过docker拉取FRP的服务端并启动

docker run --name frps -d -p 28700:28700 -p 7000:7000 -v /docker/frp/frps.ini:/etc/frp/frps.ini  -v /etc/localtime:/etc/localtime:ro -e "TZ=Asia/Shanghai" snowdreamtech/frps

(4)windows本机FRP客户端搭建

我用的frp_0.46.0_windows_386.zip,

也可以从这里下载https://download.csdn.net/download/yfx000/87524710

然后新建frpc.ini

[common]
server_addr = 服务器公网IP
server_port = 7000

authentication_method = token
authenticate_new_work_conns = true
token = 123456

[web]
type = http
local_port = 80
custom_domains = 域名

7000用于与服务器保持通信

80端口为本机服务端口,域名是最上面那个域名

然后cmd下启动frp客户端,也可以保存为bat,方便启动

frpc.exe -c frpc.ini

这样就实现了域名访问到本机80端口服务

4、frp内网穿透的各种场景

帮助文档详见:

https://gofrp.org/docs/examples/ssh/

通过 SSH 访问内网机器

这个示例通过简单配置 TCP 类型的代理让用户访问到内网的服务器。

通过自定义域名访问内网的 Web 服务

这个示例通过简单配置 HTTP 类型的代理让用户访问到内网的 Web 服务。

转发 DNS 查询请求

这个示例通过简单配置 UDP 类型的代理转发 DNS 查询请求。

转发 Unix 域套接字

这个示例通过配置 Unix域套接字客户端插件来通过 TCP 端口访问内网的 Unix域套接字服务,例如 Docker Daemon。

对外提供简单的文件访问服务

这个示例通过配置 static_file 客户端插件来将本地文件暴露在公网上供其他人访问。

为本地 HTTP 服务启用 HTTPS

通过 https2http 插件可以让本地 HTTP 服务转换成 HTTPS 服务对外提供。

安全地暴露内网服务

这个示例将会创建一个只有自己能访问到的 SSH 服务代理。

点对点内网穿透

这个示例将会演示一种不通过服务器中转流量的方式来访问内网服务。

5、资源汇总

(1)docker frp项目地址

项目地址:

https://github.com/snowdreamtech/frp

DockerHub:

https://hub.docker.com/r/snowdreamtech/frps

https://hub.docker.com/r/snowdreamtech/frpc

(2)FRP项目地址

https://github.com/fatedier/frp/releases

(3)中文帮助文档:

https://gofrp.org/docs/examples/ssh/

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐