目录
概述
公网服务器端
内网Windows客户端
外网Windows客户端
附加:暴露多台内网Windows客户端
附加:暴露服务
总结
概述
frp 是一个专注于内网穿透的高性能的反向代理应用,支持 TCP、UDP、HTTP、HTTPS 等多种协议。可以将内网服务以安全、便捷的方式通过具有公网 IP 节点的中转暴露到公网。
但是直接暴露内网的IP或者IP某个端口给外网是不安全的,因此需要做一些安全的手段。这里采用STCP(secret TCP)的方式配置安全的内网穿透,即访问内网客户端的时候,需要外网客户端先完成密码认证。
其主要思路是:
- 在公网服务器端正常配置frps.ini文件,主要是外网访问的端口
- 在内网Windows客户端配置stcp,使得外网Windows客户端也需要相应配置才能访问
- 如果要使用内网Windows客户端,也需要在外网Windows客户端启动frp
文件介绍:
网络结构图:
解释:之前直接访问公网服务器暴露的端口,就等于访问内网客户端的端口,其中没有任何的认证过程。如果有端口扫描的自动程序,就可能扫描到对应的端口,由于内网客户端可能在这个端口存在漏洞,因此可能被爆破。采用stcp以后,则需要完成密码认证,才能进行下一步的内网穿透服务,即通过外网Windows客户端的frpc与内网Windows客户端的frpc进行认证。
公网服务器端
- 查询防火墙状态
systemctl status firewalld
- 启动防火墙
systemctl start firewalld
- 设置防火墙开机自启
systemctl enable firewalld
- 添加防火墙暴露端口,需要与frp暴露端口一致。并查看端口暴露列表
firewall-cmd --zone=public --add-port=7000/tcp --permanent
systemctl restart firewalld
firewall-cmd --zone=public --list-ports
- 下载frp文件,并解压
wget https://github.com/fatedier/frp/releases/download/v0.38.0/frp_0.38.0_linux_amd64.tar.gz
tar -zxvf frp_0.38.0_linux_amd64.tar.gz
cd frp_0.38.0_linux_amd64/
ls
- 修改配置frps.ini,注意要修改密码
vim frps.ini
[common]
bind_port = 7000
token=123123
dashboard_port = 7501
dashboard_user = admin
dashboard_pwd = admin123
解释:
- 启动服务器frps运行文件
./frps -c frps.ini
# 后台运行,log.log为日志文件
nohup ./frps -c frps.ini > log.log 2>&1 &
内网Windows客户端
- 开启支持远程Windows,直接搜索远程Windows即可
- 下载文件
https://github.com/fatedier/frp/releases/download/v0.38.0/frp_0.38.0_windows_amd64.zip
- 修改配置frpc.ini
[common]
server_addr = 服务器ip
server_port = 7000
token=123123
[secret_rdp]
type = stcp
sk = 123456
local_ip = 127.0.0.1
local_port = 3389
- 启动客户端frps运行文件
frpc.exe -c frpc.ini
- window10设置开机自启,编写startfrp.bat脚本,内容如下,需要修改为自己的绝对路径,并放到C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp目录下
C:\Users\zx\Desktop\frp\frpc.exe -c C:\Users\zx\Desktop\frp\frpc.ini
- (可选)如果是Windows10服务器,通过组策略设置脚本随服务器启动,开始->运行->gpedit.msc->计算机配置->Windows设置->脚本(启动/关机)
外网Windows客户端
- 修改配置frpc.ini
[common]
server_addr = 服务器ip
server_port = 7000
token=123123
[secret_rdp_visitor]
type = stcp
role = visitor
sk = 123456
server_name = secret_rdp
bind_addr = 127.0.0.1
bind_port = 30009
- 启动客户端frps运行文件
frpc.exe -c frpc.ini
- 访问内网客户端,注意是外网Windows客户端的本地端口127.0.0.1: 30009
附加:暴露多台内网Windows客户端
frp当然也能同时暴露多台内网中的Windows客户端,其中公网服务器端的配置完全不用改变。只需要先在另外一台内网Windows客户端注册服务,然后外网Windows客户端修改对应配置即可。
- 内网Windows客户端配置,只需要修改secret_anotherName为另外一个名字即可。
[common]
server_addr = 服务器ip
server_port = 7000
token=123123
[secret_anotherName]
type = stcp
sk = 123456
local_ip = 127.0.0.1
local_port = 3389
- 外网Windows客户端配置,只需要修改secret_anotherName_visitor和secret_anotherName为对应内网Windows客户端名字即可。
[common]
server_addr = 服务器ip
server_port = 7000
token=123123
[secret_anotherName_visitor]
type = stcp
role = visitor
sk = 123456
server_name = secret_anotherName
bind_addr = 127.0.0.1
bind_port = 30009
附加:暴露服务
当然也可以暴露内网中的web服务给外部使用,只需要修改frpc.ini的对应端口即可,同暴露多台内网Windows客户端类似。
如果是需要别人直接访问web服务,可以修改直接修改内网客户端frpc.ini为如下配置,就直接可以用公网ip(域名): vhost_http_port 端口访问,(ip地址只能在custom_domains 中使用一次,导致其它web服务只能使用tcp暴露)
第一个web服务是222.222.22.22:8080,或者aaa.test.com:8080;其中8080为vhost_http_port服务端配置
第二个web服务是bbb.test.com:8080;其中8080为vhost_http_port服务端配置
第三个web服务是222.222.22.22:2131;
[web01]
type = http
local_ip = {可以是域名,比如aaa.target.com,local_port=80(http默认端口)}
local_port = 80
custom_domains = {此处填写服务端的公网IP(222.222.22.22)、或者域名(aaa.test.com)}
[web02]
type = http
local_ip = {可以是域名,比如aaa.target.com,local_port=80(http默认端口)}
local_port = 80
custom_domains = {域名(bbb.test.com)}
[web03]
type = tcp
local_ip = {可以是域名,比如aaa.target.com,local_port=80(http默认端口)}
local_port = 80
remote_port = 2131
完整比如:
[common]
server_addr = 服务器ip
server_port = 7000
token=123123
[web01]
type = http
local_ip = a.com
local_port = 80
custom_domains = 222.222.22.22
[web02]
type = https
local_ip = b.com
local_port = 443
custom_domains = bbb.test.com
[web03]
type = tcp
local_ip = c.com
local_port = 80
remote_port = 2131
(注意版本问题,我这边用frp_0.11.0_windows_amd64版本可以,frp_0.22.0_windows_amd64和frp_0.38.0_windows_amd64版本都不可以,会报错do http proxy request error: no such domain(The page you requested was not found.)。这点真的很坑,我搞了一晚上才试出来)
或者最简单的方法ngrok:
https://blog.csdn.net/wxqee/article/details/100840131
总结
有点麻烦,但是尽量安全一点的暴露内网端口,如果有什么问题,可以评论。