frp:将内网机器通过公网 IP 连接起来

服务器端

新版本

设置frps.toml
部署 frps 并编辑 frps.toml 文件。以下是简化的配置,其中设置了 frp 服务器用于接收客户端连接的端口:

bindPort = 7000

旧版本

设置 frps.ini

[common]
# 服务端口
bind_addr = 0.0.0.0
bind_port = 7001 #监听地址,安全组要开
token = 57**** 	#认证token

# 控制面板的端口、账号、密码
dashboard_port = 7500 
dashboard_user = root
dashboard_pwd = iloveyou

#http服务端口
vhost_http_port = 80 #一般可以直接设置80,那么就可以直接访问域名无需加端口
#https服务端口
vhost_https_port = 443  #一般可以直接设置443,那么就可以直接访问域名无需加端口
    
[web-http]
listen_port=80 #监听内网端口

[web-http02]
listen_port=80 #监听内网端口

[web-https]
listen_port=443 #监听内网端口	

开启 frp 的服务端,对于 Linux 主机,可以执行这一条命令来将其作为进程放到系统后台运行:

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

执行后,我们可以通过

netstat -lnp|grep 7000

看一下进程是否正常运行。到这里,云端服务的操作基本上就完成了。如果你使用的云服务商的主机绑定了安全组,需要手动登录服务器的云控制台,在网络安全组中将 7000 端口设置为进站出站的放行策略。

服务器端启动

./frps -c ./frps.ini    

服务器端自启动

liupei@tx:~$ cat /etc/systemd/system/frps.service
[Unit]
Description=Frp Server Service
After=network.target

[Service]
Type=simple
User=root
Restart=on-failure
RestartSec=5s
ExecStart=/home/liupei/.frp/frps -c /home/liupei/.frp/frps.ini

[Install]
WantedBy=multi-user.target

客户端

新版本

部署 frpc 并编辑 frpc.toml 文件,假设 frps 所在服务器的公网 IP 地址为 x.x.x.x。以下是示例配置 cat frpc.toml

serverAddr = "x.x.x.x"  # 公网服务器IP
serverPort = 7000 # 服务器端口 can be changed

# ssh 穿透
# 对于ssh登录,服务端将监听 7703
# ssh ch_cumtlp3@152.xx.xx.xx -p 7703
# 即可代理到本机 ssh 登录
[[proxies]]
name = "ssh"
type = "tcp"
localIP = "127.0.0.1"
localPort = 22
remotePort = 6000   # 用于转发的端口 can be changed

# 文件分享
[[proxies]]
name = "static_file"
type = "tcp"
remotePort = 6001   # 用于转发的端口 can be changed
[proxies.plugin]
type = "static_file"
localPath = "/home/xx/frpshare/"
stripPrefix = "files"
httpUser = "lp"
httpPassword = "itisasecret"

# http网络穿透
[[proxies]]
name = "anything"
type = "tcp"
localPort = 3001
remotePort = 6002  # 用于转发的端口 can be changed

旧版本

设置frpc.ini

[common]
server_addr = xx.xx.xx.xx
server_port = 7001
token = 57****

[rdp]
type = tcp
local_ip = 127.0.0.1
local_port = 3389 
remote_port = 7705 # ID,安全组,编辑规则,入站规则

[ssh]
type = tcp
local_port = 22
local_ip = 127.0.0.1 
remote_port = 7703

linux客户机端启动

./frpc -c ./frpc.ini    

树莓派版本 arm

windows 客户机端启动:

frpc.exe -c frpc.ini 

使用方法:ip:770x, 输入远程主机的登录用户名和密码之后,你就可以通过远程桌面来控制内网中的被控主机了!

除了正常的操作之外,你还可以实现一定程度的文件传输,比如说你可以从控制端的 PC 中复制文件并在远程桌面点击粘贴来实现文件传输,其实这个操作和那些商业远程控制软件非常类似,传输的速度和云服务器的公网带宽有关。

用法

使用以下命令通过 SSH 访问内网机器,假设用户名为 test:

ssh -o Port=6000 test@x.x.x.x

or

host phddell
 hostname x.x.x.85
 user test
 port remotePort

frp后台运行与自动启动

虽然这样实现了远程控制,但 frp 的客户端运行却需要一直在前台开启 Powershell 终端。其实,完全可以使用更加高效率的做法:将可执行文件打包成系统服务,然后让服务在后台自动运行。

windows方法一

这里我们通过这个 winsw 小工具来实现,在其GitHub 的 {https://github.com/winsw/winsw/releases}{[releases](https://github.com/winsw/winsw/releases)} 页面中下载} 对应 .net 运行时的版本,如果你使用的是 Windows 10 那么可以直接下载「WinSW.NET461.exe」这个文件,同时需要下载「sample-minimal.xml」这个配置文件,然后将两者下载到 frp 对应的文件夹,分别改名为「winsw.exe」和「winsw.xml」。

使用代码编辑器打开「winsw.xml」,将配置文件修改为:

<service>
    <id>frp</id>
    <name>frp</name>
    <description>frp service</description>
    <executable>frpc.exe</executable>
    <arguments>-c frpc.ini</arguments>
    <onfailure action="restart" delay="60 sec"/>
    <onfailure action="restart" delay="120 sec"/>
    <logmode>reset</logmode>
</service>

点击保存之后,在 powershell 终端中按下ctrl + c 结束此前的 frpc 进程,然后输入.

.\winsw install   

来安装服务,然后再输入

.\winsw start 

来启动服务,期间如果弹出 UAC 点击允许即可,这样 frp 就被安装成系统服务在后台默默运行了。

dos批量删除进程和服务

taskkill /F /im frpc.exe
sc delete [服务名]

windows方法二

windwos利用 任务计划程序。在 Frp 同目录下新建一个start.bat 文件。接着,右键编辑这个 start.bat:

@echo off
:home
frpc -c frpc.ini
goto home

windows 管理工具里找到 计划任务程序 ,添加 start.bat 文件的开机自启任务

img

img

img

img

img

img

linux开机启动

设置frp开机自启,创建service服务文件

sudo vim /etc/systemd/system/frpc.service

填入如下信息,

ExecStart参数请自行替换路径

[Unit]
Description=Frp Client
After=network.target
Wants=network.target

[Service]
Restart=on-failure
RestartSec=5
ExecStart=/home/frp/frpc

[Install]
WantedBy=multi-user.target

刷新服务列表:

systemctl daemon-reload

设置开机自启

systemctl enable frpc

关闭开机自启

systemctl disable frpc

启动服务

systemctl start frpc

停止服务

systemctl stop frpc

查看开机启动项

systemctl list-unit-files

查看启动项状态

systemctl status frpc.service

anydesk with frp突破内网

配置frpc.ini

# frpc.ini
[common]
server_addr = x.x.x.x # 服务器地址
server_port = 7000

[anyDesk]
type = tcp
local_ip = 127.0.0.1
local_port = 7070
remote_port = 7080

anydesk设置

  1. 配置自主访问密码
  2. 连接 – 配置监听端口,允许直接连接

使用方法:

152.136.xxx.85:6005                 21xy

frp指定访问者

实现 SFTP 文件传输

虽然使用远程桌面可以覆盖远程控制中大部分的使用场景,但如果遇到需要传输文件的场景,远程控制简单的复制粘贴效率就比较低了。

通常远程文件传输可以通过 FTP 服务来解决。但 FTP 在服务配置上相当麻烦,一方面需要安装额外的第三方软件,并不能使用系统现成的软件来实现;另一方面服务相关的设置上都相当复杂。Windows 10 从 v1809 开始原生支持 OpenSSH,这让文件传输有了新的选择——通过 SSH 协议实现文件传输,无论是功能实现还是操作都变得既简单又高效。

首先我们需要在 Windows 10 上安装 openSSH 这个组件,打开 「Windows 设置 – 应用 – 可选功能」,点击「添加功能」找到 「OpenSSH 服务器」和「OpenSSH 客户端」点击安装。

之后打开「控制面板 – 管理工具」中「服务」,找到「OpenSSH Authentication Agent」以及「OpenSSH SSH Server」两个服务,都将其修改为「自动」并立即启动。

再次打开防火墙设置控制面板\textbf{->}所有控制面板项\textbf{->}Windows Defender 防火墙\textbf{->}允许的应用,找到「OpenSSH Server」看是否已经勾选了「专用」和「公用」,之后重启 PC。

重启之后,打开 PowerShell 并进入 frp 目录中,输入

.\winsw stop    

暂停服务,使用编辑器打开 frpc.ini,添加有关 ssh 的映射配置:

[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 6000

这里远程的映射端口为 6000,更改完成之后保存,并使用 PowerShell 输入

.\winsw start    

重启 frp 服务。至此被控端的 SSH 映射就已经配置完毕了。

我们来实验一下,从控制端 PC 打开 ssh 客户端(举例客户端为 Xshell),在新建会话中的「主机」一栏输入公网云服务器的 IP 地址,在端口号处输入此前设置的映射端口号 6000,点击「连接」。在弹出的对话框中,输入被控电脑的登录账户和密码(如果绑定了 Microsoft ID 就输入此 ID),完成连接之后你就可以看到终端显示为被控主机的用户目录。我们通过 SSH 协议连接到了被控主机的 Powershell 终端中,这也间接说明 SSH 服务已经开启成功了。

既然已经可以通过 SSH 连接,那么使用相同的协议传输文件也是顺理成章。点击 Xshell 功能栏中的 Xftp 就可以直接打开对应的主机文件目录.

参考文献

参考文献

  • 最新帮助
  • 内网穿透的几种方式(here)
  • FRP 简单入门安装配置教程 – 开源免费内网穿透工具,无公网 IP 远程访问(here)
  • 内网穿透frp配置示例}之linux客户机 here
  • 内网穿透frp下载地址 here
  • frp中文帮助 here

查看线程数目

cat /proc/19011/status |grep Threads
ps -ef |grep comm|wc -l

客户端无法连接问题

在部署frp的客户端时,执行命令./frpc -c ./frpc.ini,提示错误信息:

2020/06/15 18:15:17 [W] [service.go:101] login to server failed: dial tcp 39.97.228.44:7000: connect: connection timed out

特意把服务器对应的安全组放开7000端口,但是还遇到这个错误。

经过排查发现,服务器还安装了宝塔,我赶紧登陆宝塔,同时把7000端口放行,frp客户端运行成功