[3] 操作系统 · 2021年1月12日 0

frp内网穿透

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

服务器端,设置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

执行后,我们可以通过

netstat -lnp|grep 7000

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

linux 服务器端启动:

./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

实现 RDP 远程桌面

在针对 Windows 系统的远程控制中,兼容性最好的当然是 RDP 远程桌面——无需安装第三方软件,非常简单容易进行设置。微软也在其他系统平台上推出了微软远程桌面客户端,让你几乎能在所有的主流平台上实现远程控制 Windows 主机。

首先,我们需要设置一下被控 PC 端(也就是希望被远程控制的设备)在 frp 的 GitHub 下载页面 中下载对应的执行包,这里因为内网目标被控主机是 Windows 10,因此需要下载 Windows 版本。解压缩之后,对 frpc.ini 文件进行编辑。

frpc.ini 文件中主要分为两个部分,最上面[common]是和云端服务器通信的部分,因此server_addr填写的是对应的云服务器的 ip 地址,而下面这个server_port则是刚才我们在服务端所设置的bind_port,两者需要保持一致。local_ip 指的是本机处于内网的 IP 地址,如果你是自己使用,只需要写 127.0.0.1 即可,而 local_port 指的是对应的服务端口,RDP 服务端口就是 3389。remote_port 就是远程用来映射的端口,根据原理,如果想通过远程桌面控制当前内网主机,其对应的地址就是:[server_port]:[remote_port](公网服务器 IP:映射的端口号)

完成之后点击保存,接着我们需要对电脑的远程进行设置。右键点击「此电脑」-「属性」,找到「远程设置」,在「远程桌面」中勾选「允许远程连接到此计算机」,同时取消「仅允许运行使用网络级别身份验证的远程桌面的计算机连接」的勾选,然后点击「确定」

最后,我们需要打开 Windows 防火墙给以上服务予以放行,在控制面板->所有控制面板项->Windows Defender 防火墙->允许的应用中点击「更改设置」,然后在下面找到「远程桌面」和「远程桌面(webSocket)」并分别勾选上「专用」和「公用」。

客户端,设置frpc.ini

[common]
server_addr = 152.136.140.85
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

# 对于ssh登录,服务端将监听 7703
# ssh ch_cumtlp3@152.136.140.85 -p 7703
# 即可代理到本机 ssh 登录

linux客户机端启动

./frpc -c ./frpc.ini    

windows 客户机端启动:

frpc.exe -c frpc.ini 

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

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

frp后台运行与自动启动

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

windows方法一

这里我们通过这个 winsw 小工具来实现,在其GitHub 的 {https://github.com/winsw/winsw/releases}{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”文件的开机自启任务

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

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

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 就可以直接打开对应的主机文件目录.

参考文献

  1. 内网穿透的几种方式(here)
  2. FRP 简单入门安装配置教程 – 开源免费内网穿透工具,无公网 IP 远程访问(here)
  3. 内网穿透frp配置示例}之linux客户机 here
  4. 内网穿透frp下载地址 here
  5. 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客户端运行成功