一、内网穿透基本原理

内网穿透又叫 NAT 穿透,常用的工具有很多,比如 ngrok、花生壳、frp等

FRP:高性能反向代理应用,支持tcp、udp、http、https协议。

frp 的作用

  • 利用处于防火墙后的机器,对外网环境提供 http 或 https 服务。
  • 对于 http, https 服务支持基于域名的虚拟主机,支持自定义域名绑定,使多个域名可以共用一个80端口。
  • 利用处于防火墙后的机器,对外网环境提供 tcp 和 udp 服务,例如在家里通过 ssh 访问处于公司局部环境的主机

frp 仍然处于前期开发阶段,未经充分测试与验证,不推荐用于生产环境。

frp 分为服务端与客户端,前者运行在有公网 IP 的服务器上,后者运行在局域网内的设备上,服务端默认会先开放 7000 端口,然后客户端与其相连。

同时客户端可以开启用于 ssh 的端口(如下面的3306),与服务端的某个端口(如下面的5200)做映射,这样我们在终端访问服务端的端口(5200)时,会自动转发到客户端去。

二、服务端安装(linux)

1、安装与启动

wget https://github.com/fatedier/frp/releases/download/v0.33.0/frp_0.33.0_linux_amd64.tar.gz
tar zxvf frp_0.33.0_linux_amd64.tar.gz
cd frp_0.33.0_linux_amd64/

服务端的配置文件是 frps.ini,默认绑定 7000 端口,如果购置了云服务器,注意打开 7000 端口。

[common]
bind_port = 7000

通过 fprs 二进制文件启动 frp 服务。

./frps -c ./frps.ini

后台运行命令

nohup ./frps -c frps.ini >/dev/null 2>&1 &

说明:>/dev/null 2>&1 &,表示丢弃。

>: 日志追加到文件中

1>&2 意思是把标准输出重定向到标准错误.

2>&1 意思是把标准错误输出重定向到标准输出。

& 是一个描述符,如果1或2前不加&,会被当成一个普通文件。

如下提示即是启动成功。

2、阿里云服务器放开7000、7500、5200端口

查看放开的端口

firewall-cmd --list-port

放开7000和7500端口

firewall-cmd --zone=public --add-port=7000/tcp --permanent
firewall-cmd --zone=public --add-port=7500/tcp --permanent
firewall-cmd --zone=public --add-port=5200/tcp --permanent

重启防火墙

firewall-cmd --reload

云服务器的防火墙添加规则

另外:80端口也要放开

3、设置dashboard_port 、dashboard_user 、dashboard_pwd

先关闭frps

ps -ef | grep frps
kill -9 进程id

编辑frps.ini

vim frps.ini

添加内容如下:

[common]
bind_port = 7000
dashboard_port = 7500
dashboard_user = admin
dashboard_pwd = 123456

重启frps,效果如下:

浏览器访问:http://公网ip:7500/,弹出对话框

输入用户名和密码后效果如下:

点击TCP

如果想使用域名,则配置如下:

[common]
bind_port = 7000
dashboard_port = 7500
dashboard_user = admin
dashboard_pwd = 123456
vhost_http_port = 80
subdomain_host = xxxxxx.site

vhost_http_port是http访问的端口(外网端口),确保80端口未被占用。如果是https,则用433。

subdomain_host 根据需求可选配置泛域名

有两种情况:

(1)、如果 frps.ini 配置了 subdomain_host 泛域名,那么 frpc.ini 中域名参数需使用 subdomain = xx 仅填写二级域名主机头即可,不要填写完整域名.

frps.ini

[common]
bind_port = 7000
dashboard_port = 7500
dashboard_user = admin
dashboard_pwd = 123456
vhost_http_port = 80
subdomain_host = xxxxxx.site

frpc.ini

[common]
server_addr = xxxxxx.site
server_port = 7000

[ssh]
type = http
local_ip = 127.0.0.1
local_port = 8004
subdomain = ssh

(2)、如果 frps.ini 没有配置 subdomain_host泛域名,那么 frpc.ini 中域名参数需使用 custom_domains = xx.xxx.com 需填写完整的域名.

frps.ini

[common]
bind_port = 7000
dashboard_port = 7500
dashboard_user = admin
dashboard_pwd = 123456
vhost_http_port = 80

frpc.ini

[common]
server_addr = xxxxxx.site
server_port = 7000

[ssh]
type = http
local_ip = 127.0.0.1
local_port = 8004
custom_domains = ssh.xxxxxx.site

三、客户端安装(windows)

由于我是在windows系统中安装客户端,故需要下载windows版的frp安装包。注意:服务端的frp的版本要与客户端的frp的版本保持一致,比如服务端的版本为0.33.0

,那么windows版的frp也应该是0.33.0版本。

下载网址:https://github.com/fatedier/frp/releases

下载后解压,文件如下:

 客户端的配置文件是 frpc.ini,c就是client了。配置如下:

[common]
server_addr = 公网ip
server_port = 7000

[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 3306
remote_port = 5200

common 为通用配置

  • server_addr 为公网服务器 IP 地址
  • server_port 为公网服务器配置的 7000 端口

ssh 用于终端命令行访问

  • type 连接类型,默认为 tcp
  • local_ip 本地 IP
  • local_port 用于 ssh 的端口号,默认 22
  • remote_port 映射的服务端端口,访问该端口时默认转发到客户端的 22 端口

3306是本地mysql的端口了,5200就是当我mstsc请求公网时,后面加这个5200,就能转发到我这台装有frpc的电脑上。

然后启动服务,cmd进入frpc.exe所在的目录

frpc.exe -c frpc.ini

 启动成功后效果如下:

四、访问内网服务

1、远程访问内网的MySQL

使用navicat访问内网的mysql,ip输入公网服务器的IP,端口输入5200,用户名和密码输入内网服务器的MySQL的用户名和密码

2、远程访问内网服务器的nginx

内网服务器启动nginx,端口为8081,先确保在内网服务器可以访问nginx

修改frpc客户端的配置文件

[common]
server_addr = 公网ip
server_port = 7000

[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 8081
remote_port = 5200

重启frpc

在远程访问:http://公网ip:5200/,就可以访问到内网服务器的nginx。

注意:在远程访问时,ip为公网ip,端口为5200。

如果想访问内网服务器的端口为8082的tomcat,只需要改frpc客户端的配置文件,如下

[common]
server_addr = 公网ip
server_port = 7000

[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 8082
remote_port = 5200

当你访问http://公网ip:5200/时,访问的是内网服务器的tomcat。

如果既想访问内网服务器的8081的nginx,也想访问内网服务器端口为8082的tomcat,此时需要再加一个5201的端口。

如果配置如下:

[common]
server_addr = IP
server_port = 7000
token = xxxxxxx

[gap]
type = http
local_ip = 127.0.0.1
local_port = 8007
subdomain = gap

此时通过:http://gap.zwh.net/即可访问,端口为80.

posted on 2021-12-02 19:04  周文豪  阅读(707)  评论(0编辑  收藏  举报