Press "Enter" to skip to content

利用frp进行安全穿透到内网

起因是之前用的TeamViewer受限没办法用了,而我又有远程连接的需求,于是折腾了下使用FRP+VNC进行内网穿透,折腾完发现其实Windows的RDP及Linux的SSH也可以用这个方案进行内网穿透,所以一并记录了下来,才有了这篇流水账。

我总共有三台电脑,公司一台,自己住的地方一台,还有一台笔记本在外出的时候备用,我之前一直用TeamViewer远程控制我的这三台电脑,用了两三年一直没问题,不知道是不是今年疫情导致远程连接需求增多,TeamViewer增强了限制,现在我连正常的个人用途使用都无法进行,趁手上正好有台闲置的腾讯云5M带宽轻量云服务器,于是就想着要不利用这台闲置的服务器搞个内网穿透吧,毕竟自己的东西更靠得住。

TeamViewer受限提示

我基本上就是我这三台电脑来回互相控制使用,而且还不是重度使用,只是有需要的时候偶尔控制下,还不会用来传输大文件,最多复制个小文件用完就退出,我觉得这么轻量使用并没有对TeamViewer造成滥用吧,从一开始的安装就可以直接连接,到后面必须创建账户登录账户才允许使用,到后来某次重装完系统它开始提示我这个:

您的账户可使用设备已到达上限。
TeamViewer 可免费用于个人用途,但所使用的设备数量受限。

我原以为TeamViewer跟Dropbox一样一个账户限制的是总设备数,那我把重装系统之前注册的哪个设备给踢下线然后再次登录总行了吧,没想到TeamViewer就算把旧设备踢下线也不允许新的设备登录,这就很惆怅了,折腾了一番,发现都是要求付费才允许继续使用,付费也不是不可以,但是看TeamViewer哪个收费起步价,实在是打扰了,惹不起我跑得起好吧。

需求及目的

我日常使用的是黑苹果系统,偶尔会使用Windows系统,然后内网公网都有几台没有图形界面的Linux服务器,我的需求也比较简单,就是我的几台电脑能随时连接上就行,说详细点,就是在不管在哪,只要有网就能连接回我的几台电脑和服务器就行。

其实针对我的几台桌面电脑,我也尝试了别的几个远程控制工具,比如说国产的向日葵、ToDesk等,发现都不是很好用,一番搜索之后,发现还是系统自带的“屏幕共享/远程桌面”好用,经过一番折腾,最终摸索出了一套frp+vnc/rdp的远程连接方案。

我手上涉及到的几台设备运行的系统及设备类型如下:

  • 腾讯云轻量云服务器,公网,服务端,Debian10
  • 本地电脑1,内网,客户端,macOS 10.15.7
  • 本地电脑2,内网,客户端,macOS 10.15.7
  • 本地电脑3,内网,客户端,macOS 10.15.7
  • 本地虚拟机1,内网,客户端,Debian10
  • 本地虚拟机2,内网,客户端,Windows10

我打算把服务端跑在我腾讯云上的Debian10系统上,然后几台运行macOS系统的电脑及Linux/Windows内网服务器跑客户端,考虑到我的宽带NAT类型不支持P2P打洞,所以所有流量都设置从我腾讯云服务器中转。

不多说,直接上我的安装配置过程。

frp安装

所有支持frp运行的系统都可以从frp项目的release页面下载到对应系统的预编译好的可执行程序,页面地址如下:

https://github.com/fatedier/frp/releases

目前最新版本是0.34.3,不知道服务端和客户端版本号不一致会不会有问题,为了减少麻烦,我是选择的同一个版本号的frp。

首先是我的腾讯云5M带宽的Linux安装服务端。

Linux系统安装frp

Linux系统安装比较简单,下载解压命令如下:

wget https://github.com/fatedier/frp/releases/download/v0.34.3/frp_0.34.3_linux_amd64.tar.gz
tar zxvf frp_0.34.3_linux_amd64.tar.gz
mkdir /etc/frp

如果当前设备是用来当做服务端,接下来的命令如下:

cd frp*
#将可执行文件赋予可执行权限
chmod +x frps
#将可执行文件复制到/usr/bin目录
cp frps /usr/bin
#将对应的配置文件复制到/etc/frp目录,接下来服务端所有配置都在/etc/frp/frps.ini
cp frps.ini /etc/frp/
#将systemed文件复制到对应的目录
cp systemd/frps.service /etc/systemd/system/
#重载systemed
systemctl daemon-reload
#启动/重启/停止frp服务端
systemctl start/restart/stop frps
#Linux开机启动frp
systemctl enable frps

如果当前设备是用来当做客户端,比如内网服务器,接下来的命令如下:

cd frp*
#将可执行文件赋予可执行权限
chmod +x frpc
#将可执行文件复制到/usr/bin目录
cp frpc /usr/bin
#将对应的配置文件复制到/etc/frp目录,接下来客户端所有配置都在/etc/frp/frpc.ini
cp frpc.ini /etc/frp/
#将systemed文件复制到对应的目录
cp systemd/frp.service /etc/systemd/system/
#重载systemed
systemctl daemon-reload
#启动/重启/停止frp客户端
systemctl start/restart/stop frpc
#Linux开机启动frp
systemctl enable frpc

macOS安装frp

因为我只打算使用macOS当做客户端,所以就不涉及到macOS安装服务端的命令,只说说怎么安装客户端。

虽然macOS也可以在上述frp的release页面下载解压使用frp,但是出于版本及开机启动考虑,我们有更好的选择,就是使用homebrew安装frp,这样可以使用brew services命令更方便的控制frp,相关命令如下:

#macOS安装frp
brew install frpc
#macOS启动/重启/停止frpc
brew services start/restart/stop frpc

和Linux系统不同的是,macOS只要执行了brew services start frpc,每次开机即可自动启动frpc,还是比较方便的。

Windows安装frp

Windows系统安装frp就稍微麻烦点了,要手动下载然后解压frp的可执行文件,都是鼠标点点点的问题,就不细说了,解压软件推荐7zip。

frp服务端配置

作为服务端,frp需要有公网IP,且至少需要暴露一个端口用来监听客户端的配置,直接上配置文件:

# frp服务端配置,注意文件所在路径
vim /etc/frp/frps.ini

# 文件内容
[common]
bind_port = 1080
bind_udp_port = 1080
token = izoco.cn

两个端口可以自定义,只要没有被占用就行,建议是使用1024以上的端口。配置完端口之后,如果是腾讯云及阿里云这样的有安全组的,需要到IDC的控制面板将对应的端口放行,如果服务器系统本身开启了防火墙的,还需要防火墙将对应的端口放行。如果安装了宝塔等面板的,发现frp连接不上服务器还需要到面板上放行对应的端口。至于token,可以自定义,加个token可以防止他人连接,建议设置复杂点。

配置完成之后,最好先使用frps -c /etc/frp/frps.ini进行测试一下,没问题了再使用systemctl restart frps进行重启服务。

macOS设置VNC远程登录控制

跟Windows系统的远程桌面类似,macOS自带了VNC,在配置VNC之前,需要在macOS里面打开远程登录控制,在需要被远程控制的macOS系统开启VNC,路径:系统偏好设置→共享→远程管理,打勾然后选择对应的用户,如图:

macOS开启远程登录

如无意外的话,现在已经可以通过VNC客户端使用地址vnc://192.168.xx.xx:5900进行远程登录这台机器了,能远程登录说明配置成功了。

Windows的远程桌面及Linux的SSH配置类似,配置frp之前开启即可。

FRP客户端配置

FRP可以选择将端口暴露到公网或者不暴露到公网,下面分别是这两种配置方式。

将内网端口暴露到公网

直接将端口暴露到外网,被控端配置:

# 被控macOS系统配置文件
vim /usr/local/etc/frp/frpc.ini
# 被控Linux系统配置文件
vim /etc/frp/frpc.ini

# 文件内容
[common]
server_addr = 12.34.56.78
server_port = 1080
token = izoco.cn

# macOS端vnc
[vnc]
type = tcp
local_ip = 127.0.0.1
local_port = 5900
remote_port = 6000

# Windows端RDP
[rdp]
type = tcp
local_ip = 127.0.0.1
local_port = 3389
remote_port = 6001

# Linux端ssh
[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 6002

上面只是示例配置,每端根据实际的协议三者选择其一就行。配置完成之后需要重启客户端进程。

客户端连接的时候加上服务器IP及对应的端口号就行,比如:

#macOS
vnc://12.34.56.78:6000

#Windows远程桌面
12.34.56.78:6001

#Linux SSH
ssh username@12.34.56.78 -p6002

安全暴露内网端口-被控制端frp配置

frp支持直接将VNC的5900端口、RDP的3389端口及SSH的22端口暴露到外网,不管我们在哪都可以通过公网端口连接到内网的对应设备,这样确实很方便,但是方便的同时也有安全隐患,网上脚本自动扫描端口的太多了,我是使用的frp的stcp将这种敏感服务隐藏到内网。

和直接暴露端口到公网不一样的是,stcp是将被控端和控制端组成一个内网,端口不直接暴露到公网,而是通过frp组成的一个内网进行流量交换,只要token和sk不泄露,stcp方式比tcp方式安全。

被控制的各服务frp配置如下:

# 被控macOS系统配置
vim /usr/local/etc/frp/frpc.ini
# 被控Linux系统配置文件
vim /etc/frp/frpc.ini

# 文件内容
[common]
server_addr = 12.34.56.78
server_port = 1080
token = izoco.cn

[secret_vnc]
type = stcp
sk = izoco.cn
local_ip = 127.0.0.1
local_port = 5900

[secret_rdp]
type = stcp
sk = izoco.cn
local_ip = 127.0.0.1
local_port = 3389

[secret_ssh]
type = stcp
sk = izoco.cn
local_ip = 127.0.0.1
local_port = 22

common部分是服务器相关配置,根据服务端的设置输入一致的就行,下面secret_*部分才是重点,名字可以随便起,下面的ip和port部分正确即可,至于sk,相当于多一层认证,需要visitor一致才能访问,建议设置复杂一点。

安全暴露内网端口-控制端frp配置

和被控端类似,控制端也需要运行frp,相关配置:

# 被控macOS系统配置
vim /usr/local/etc/frp/frpc.ini
# 被控Linux系统配置文件
vim /etc/frp/frpc.ini

[common]
server_addr = 12.34.56.78
server_port = 1080
token = izoco.cn

[secret_vnc_visitor]
type = stcp
# stcp 的访问者
role = visitor
# 要访问的 stcp 代理的名字
server_name = secret_vnc
sk = izoco.cn
# 绑定本地端口用于访问
bind_addr = 127.0.0.1
bind_port = 6001

同样的,上面的secret_vnc可以换成secret_rdp或者secret_ssh,只需要对应的信息同步更改就行,尤其是注意server_name和sk,再者就是端口不要重复。修改完之后记得重启客户端服务。

以我正在用的stcp穿透的VNC为例,finder里用cmd+k唤出登录界面,连接截图:

vnc登录

然后输入对应的macOS的登录用户名和密码:

登录

然后就跟操作本机一样了,再次输入密码即可登录macOS系统,如图:

macOS登录

总结

1、frp开源免费,配置相对来说还是比较简单的,功能却很强大,我这还只是使用了frp的一小部分功能。

2、我是使用的腾讯云国内广州地域的5M轻量云服务器,相同宽带IDC情况下,延迟尚能接受。经过我的实际测试,如果是1M的小水管带宽,使用frp+vnc远程控制macOS会比较难受,但是如果是1M带宽用来内网穿透RDP和SSH,没有明显的延迟,建议如果是跟我一样远程控制VNC还是选择宽带大一点的服务器。

3、优先建议选择stcp方式暴露内网端口,现在中了勒索病毒的也不少,直接将vnc/rdp/ssh端口暴露出去风险太大了,尤其是内网除了被控端很可能还不止一台设备,一旦有设备被入侵,内网的其他设备也会有被入侵风险。

4、对于必须要在公网访问的端口比如SSH,建议换证书登录,防止密码登录被暴力破解。

发表评论

邮箱地址不会被公开。 必填项已用*标注