什么是 Frp
内网穿透工具有很多,其中 Frp (Fast Reverse Proxy) 是比较流行的一款。FRP 是一个免费开源的用于内网穿透的反向代理应用,它支持 TCP、UDP 协议, 也为 http 和 https 协议提供了额外的支持。你可以粗略理解它是一个中转站,帮你实现 公网 ←→ FRP(服务器) ←→ 家庭内网 的连接,让内网里的设备也可以被公网访问到。
服务端设置
安装
FRP 使用 Go 语言开发,可以支持 Windows、Linux、macOS、ARM 等多平台部署。FRP 安装非常容易,只需下载对应系统平台的软件包并解压就可用了。这里以 Linux 系统为例:
下载地址:https://github.com/fatedier/frp/releases
cd /home
wget https://github.com/fatedier/frp/releases/download/v0.33.0/frp_0.33.0_linux_amd64.tar.gz
tar -xf frp_0.33.0_linux_amd64.tar.gz
mkdir /etc/frp
cp frp_0.33.0_linux_amd64/frps /usr/bin/
cp frp_0.33.0_linux_amd64/frps.ini /etc/frp/
frp默认使用7000
端口,如果你的防火墙不允许,需要添加。
输入frps -v
显示版本号则说明安装成功。
启动服务端
frps
使用指定配置文件:
frps -c /etc/frp/frps.ini
作为系统服务启动
将/home/frp_0.33.0_linux_amd64/systemd/frps.service
文件拷贝至/usr/lib/systemd/system/
目录下。
cp /home/frp_0.33.0_linux_amd64/systemd/frps.service /usr/lib/systemd/system/
#添加开机启动
systemctl enable frps
#启动frp服务
systemctl start frps
frps.ini高级设置
token=12310086
dashboard_port = 7500
dashboard_user = admin
dashboard_pwd = admin123
token
是验证token建议设置上。dashboard_port
是frp的web面板端口。dashboard_user
、dashboard_pwd
是面板的账户密码。
配置客户端(安装在内网的机器上)
windows
客户端也是在上面下载的压缩包里,Linux 客户端的安装和启动与服务器端没有太多区别,只是对应运行程序是frpc
而不是frps
。这里以windows为例。
修改配置文件
修改frpc.ini
[common]
# server_addr 为 FRP 服务端 (VPS 服务器) 的公网 IP
server_addr = 1.2.3.4
server_port = 7000
[RDP]
type = tcp
local_ip = 192.168.1.30 #电脑在局域网中的内网 IP (如是本机,也可使用 127.0.0.1)
local_port = 3389
remote_port = 7002
这样就在本地上新增了“RDP”这个可供公网访问的服务了 (名称可以自己取)。如果你需要添加更多的设备和服务供外网访问,那么只需照样画葫芦,指定正确的 IP 地址和端口号即可。
注意放行端口
每个服务的 remote_port 是远程访问时要用到的端口号,注意这些端口号也要在服务器的防火墙和安全组里放行才能顺利访问的,如上面的 7001、7002。
启动 FRP 客户端
假设你已将 Frp 的客户端解压缩到 c:frp
目录中,那么启动 Frp 客户端的命令就是:
c:frpfrpc.exe -c c:frpfrpc.ini
启动之后看到 “start proxy success”字样就表示启动成功了。
Linux
这里以CentOS为例。
将frpc
和frpc.ini
这两个文件拷贝至/home/目录下,赋予权限:chmod 755 frpc
修改frpc.ini内容:
[common]
# server_addr 为 FRP 服务端 (VPS 服务器) 的公网 IP
server_addr = 1.2.3.4
server_port = 7000
[ssh]
type = tcp
local_ip = 127.0.0.1 #电脑在局域网中的内网 IP (如是本机,也可使用 127.0.0.1)
local_port = 22
remote_port = 7103 #FRP 服务端需开启的端口
启动:
cd /home
./frpc -c frpc.ini
启动之后看到 “start proxy success”字样就表示启动成功了。
作为系统服务启动
新建/usr/lib/systemd/system/frpc.service
文件,内容如下:
[Unit]
Description=Frp Client Service
After=network.target
[Service]
Type=simple
User=nobody
Restart=on-failure
RestartSec=5s
ExecStart=/home/frpc -c /home/frps.ini
[Install]
WantedBy=multi-user.target
#添加开机启动
systemctl enable frpc
#启动frpc服务
systemctl start frpc
进行远程访问
远程桌面连接到家里的 Windows 电脑,那么打开“微软远程桌面客户端”后,在地址栏里填入服务器公网IP:7002
即可连接。
由此,借助 Frp,你就能轻松地为本地局域网内网的设备提供公网直接访问的能力了,你可以用 Frp 来转发包括但不限于 ssh、http、https、转发 Unix 域套接字等服务。
Windows将FRP设置为服务并开机自启
实Windows也能像Linux那样设置程序为后台运行,就是将其添加为服务;
下载winsw
: https://github.com/kohsuke/winsw/releases
我下载的是2.9.0
版本。
这里将下载WinSw.Net4.exe
重命名为winsw.exe
了,以方便后面操作;
创建与winsw同名的配置文件winsw.xml
,内容如下:
<service>
<!-- 该服务的唯一标识 -->
<id>frp</id>
<!-- 该服务的名称 -->
<name>frp-windows</name>
<!-- 该服务的描述 -->
<description>frpc客户端 这个服务用 frpc 实现内网穿透</description>
<!-- 要运行的程序路径 -->
<executable>D:toolfrp_clientfrpc.exe</executable>
<!-- 携带的参数 -->
<arguments>-c D:toolfrp_clientfrpc.ini</arguments>
<!-- 第一次启动失败 60秒重启 -->
<onfailure action="restart" delay="60 sec"/>
<!-- 第二次启动失败 120秒后重启 -->
<onfailure action="restart" delay="120 sec"/>
<!-- 日志模式 -->
<logmode>append</logmode>
<!-- 指定日志文件目录(提前在该文件目录下新建logs文件夹) -->
<logpath>logs</logpath>
</service>
开始使用:
//注册服务
winsw.exe install
//卸载服务
winsw.exe uninstall
//启动服务
winsw.exe start
//停止服务
winsw.exe stop
//重启服务
winsw.exe restart
//查看状态
winsw.exe status
注册服务时如果被某60拦截了需要点允许,如果提示:FATAL - WMI Operation failure: AccessDenied
则需要以管理员方式运行CMD再试;
不出意外的话打开任务管理器就能看到刚刚添加的服务了
解除Windows10多账户远程桌面连接限制
Windows默认情况下只能同时登录一个账号,并且手机连上电脑,电脑就会退出登录,被踢下线,这是因为,能让多个账号远程连接到一个电脑,这个是服务器版才该有的功能,想要让Windows10支持多账户远程桌面连接,需要进行如下设置。
配置本地组策略
运行中输入GPEDIT.MSC
打开组策略编辑器,依次点击:
管理模板-Windows组件-远程桌面服务-远程桌面会话主机-连接
双击右边的限制连接的数量
,选择已启用
,然后在下面选择你想开启的最大连接数,一般填个3都够用了.
双击右边的将远程桌面服务用户限制到单独的远程桌面服务会话
,把这里改成已启用
开启多用户连接功能
由于系统本质上装的并不是服务器版本,所以到目前为止我们还是不能够多用户同时连接的,要去github上下载RDPWrap这个软件
解压之后我们右键选择用管理员依次运行这三个文件
- install.bat
- update.bat
- RDPConf.exe
如果你的系统版本太新,那你很可能箭头这里依然会显示[not supported]
需要到这个代码仓库的issues里面搜索你的系统版本(也就是上面的10.0.17763.1369字眼),一般来说都会有人贴出新系统的配置信息,你只要把这个配置信息粘贴到刚刚那个rdpurap.ini文件的末尾就行了.例如下图:
到这里,所有的步骤就都结束了,你的电脑现在可以让两个账户同时连接而不会将本地用户踢出。
其他
配合Microsoft Remote Desktop
APP可以实现手机远程控制电脑。
详情:https://www.iplaysoft.com/microsoft-remote-desktop.html
提示登陆没有成功,但是用户名密码正确
开始–>运行->gpedit.msc->计算机配置->Windows设置->安全设置->本地策略->安全选项->网络访问:本地帐户的共享和安全模型。 修改为使用经典模式
自建 Teamviewer 连接
使用frp来自建teamviewer的本地lan连接,来避开teamviewer的商业检测。
teamviewer使用的是本地5938端口
受控端teamviewer设置
- 允许LAN连接
- 添加无人值守密码
受控端frp设置
使用frp转发本地的5938端口到服务器端上的5938端口,内网外网端口一致为5938。
[teamview]
type = tcp
local_ip = 127.0.0.1
local_port = 5938
remote_port = 5938
控制端teamviewer使用
控制端启动teamviewer,在“控制远程计算机”那里输入服务器的ip,点连接就可以了
身份认证
目前 frpc
和 frps
之间支持两种身份验证方式,token
和 oidc
,默认为 token
。
通过 frpc.ini
和frps.ini
的 [common]
段落中配置 authentication_method
来指定要使用的身份验证方式。
只有通过身份验证的客户端(frpc)才能成功连接 frps。
token
基于 Token 的身份验证方式比较简单,需要在 frpc
和 frps
的 [common]
段落中配置上相同的 token
参数即可。
安全地暴露内网服务
原文地址:https://gofrp.org/docs/examples/stcp/
这个示例将会创建一个只有自己能访问到的 SSH 服务代理。
对于某些服务来说如果直接暴露于公网上将会存在安全隐患。
使用 stcp(secret tcp)
类型的代理可以避免让任何人都能访问到要穿透的服务,但是访问者也需要运行另外一个 frpc 客户端。
frp服务端无需做任何更改。
在需要暴露到内网的机器上部署 frpc
,配置如下:
[common]
server_addr = x.x.x.x
server_port = 7000
[secret_ssh]
type = stcp
# 只有 sk 一致的用户才能访问到此服务
sk = abcdefg
local_ip = 127.0.0.1
local_port = 22
在想要访问内网服务的机器上也部署 frpc
,配置如下:
[common]
server_addr = x.x.x.x
server_port = 7000
[secret_ssh_visitor]
type = stcp
# stcp 的访问者
role = visitor
# 要访问的 stcp 代理的名字
server_name = secret_ssh
sk = abcdefg
# 绑定本地端口用于访问 SSH 服务
bind_addr = 127.0.0.1
bind_port = 6000
运行服务后,即可通过本机的6000端口来连接远程服务器了。