一、内网穿透基本原理
内网穿透又叫 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.