首页 > 技术文章 > 第一章 服务器内网穿透

jhno1 2021-03-10 18:59 原文

一、环境介绍

通过外网访问公司内网的办公电脑,实现可以通过远程桌面直接访问

- 环境描述:
  - [FRP](https://www.dqzboy.com/tag/frp/)服务端:Linux-CentOS 7(作为跳板,然后映射3389远程桌面端口)
  - [FRP](https://www.dqzboy.com/tag/frp/)客户端:则是自己外网下的个人PC
- 注意:前提是中转机FRP服务端所在的机器能通过公网的机器ping通

二、安装FRP服务端

[[email protected] ~]# wget https://github.com/fatedier/frp/releases/download/v0.30.0/frp_0.30.0_linux_amd64.tar.gz
 
[[email protected] ~]# tar -xf frp_0.30.0_linux_amd64.tar_2.gz -C /usr/local/
[[email protected] ~]# cd /usr/local/
[[email protected] local]# mv frp_0.30.0_linux_amd64/ frp

三、FRP配置

1.配置FRP服务端

- 配置 FRP 服务端的前提条件是需要一台具有公网 IP 的设备,得益于 FRP 是 Go 语言开发的,具有良好的跨平台特性。你可以在 Windows 、Linux、MacOS、ARM等几乎任何可联网设备上部署。
- 这里以 Linux 为例,FRP 默认给出两个服务端配置文件,一个是简版的 `frps.ini`,另一个是完整版本 `frps_full.ini`
[[email protected] local]# cd frp/
[[email protected] frp]# vim frps.ini
[common]
bind_port = 7000

其中`bind_port`指frp服务端监听的端口号,frp客户端将通过这一端口进行连接,这里我们 可以按需设置,建议修改

2.启动FRP服务端

[[email protected] frp]# nohup ./frps -c ./frps.ini >/dev/null 2>&1 &

#防火墙放通7000端口
[[email protected] frp]# firewall-cmd --permanent --zone=public --add-port=7000/tcp
[[email protected] frp]# firewall-cmd --reload
success

#通过systemd管理
[[email protected] frp]# vim /etc/systemd/system/frps.service
[Unit]
Description=frps daemon
After=syslog.target  network.target
Wants=network.target
 
[Service]
Type=simple
ExecStart=/usr/local/frp/frps -c /usr/local/frp/frps.ini
Restart= always
RestartSec=1min
 
[Install]
WantedBy=multi-user.target
 
[[email protected] frp]# systemctl daemon-reload
[[email protected] frp]# systemctl start frps.service
[[email protected] frp]# systemctl enable frps.service

- 注意ExecStart中要配置成自己的路径.
- 然   后使用`systemctl start frps`即可启动frps, 用`systemctl enable frps`即可将frps设置为开机启动。

3.配置FRP客户端

和 FRP    服务端类似,FRP 默认也给出两个客户端配置文件,一个是简版的`frpc.ini`,另一个是完整版本`frps_full.ini`
[[email protected] frp]# vim frpc.ini
[common]
server_addr = 58.242x.x		//frp服务端外网IP地址
server_port = 7000			//为FRP服务端监听的端口
 
[ssh]
type = tcp 
local_ip = 127.0.0.1
local_port = 22
remote_port = 6000
注意:`local_port`和`remote_port`,前者的设置根据我们的具体需求,比如笔者的需求是在外网访问内网电脑的远程桌面,那么我们就设为远程桌面的3389端口;后者则可以自定义,比如我们设为1234,那么我们访问frps服务端外网`IP:1234`的时候,就会被转发至frps客户端的3389端口。

4.启动FRP客户端

[[email protected] frp]# nohup ./frpc -c ./frpc.ini >/dev/null 2>&1 &
#放通端口
[[email protected] frp]# firewall-cmd --permanent --zone=public --add-port=6000/tcp
success
[[email protected] frp]# firewall-cmd --permanent --zone=public --add-port=1234/tcp
success
[[email protected] frp]# firewall-cmd --reload
success
#访问测试
[[email protected] ~]# ssh [email protected] -p 6000

四、FRP 高级进阶

1.添加dashboard配置

#给FRP添加dashboard,修改配置文件

[[email protected] ~]# vim /usr/local/frp/frps.ini
# 指定 Dashboard 的监听的 IP 地址
dashboard_addr = 0.0.0.0
 
# 指定 Dashboard 的监听的端口
dashboard_port = 7500
 
# 指定访问 Dashboard 的用户名
dashboard_user = admin
 
# 指定访问 Dashboard 的密码
dashboard_pwd = admin
#放通7500端口
[[email protected] ~]# firewall-cmd --permanent --zone=public --add-port=7500/tcp
success
[[email protected] ~]# firewall-cmd --reload
success

2.重启fprs服务

[[email protected] ~]# /usr/local/frp/frps -c /usr/local/frp/frps.ini &

3.浏览器访问

4.添加身份验证

默认情况下只要知道 FRP 服务端开放的端口,任意 FRP 客户 端都   可以随意在服务端上注册端口映射,这样对于在公网上的 FRP 服务来说显然不太安全。FRP 提供了身份验证机制来提高 FRP 服务端的安全性。要启用这一特性也很简单,只需在 FRP 服务端和 FRP 客户端的 co   mmon 配置中启用 `privilege_token` 参数就行。
[[email protected] frp]# vim frps.ini
...
privilege_token = dqz123456
- 启用这一特性后,只有 FRP 服务端和 FRP 客户端的 common 配置中的 `privilege_token` 参数一致身份验证才会通过,FRP 客户端才能成功在 FRP 服务端注册端口映射。否则就会注册失败
- 需要注 意的是 FRP 客户端所在机器和 FRP 服务端所在机器的时间相差不能超过 15 分钟,因为时间戳会被用于加密验证中,防止报文被劫持后被其他人利用。这个超时时间可以在配置文件中通过 `authentication_timeout` 这个参数来修改,单位为秒,默认值为 900,即 15 分钟。如果修改为 0,则 FRP 服务端将不对身份验证报文的时间戳进行超时校验。

5.加密与压缩

- 如果公司内网防火墙对外网访问进行了流量识别与屏蔽,例如禁止了 SSH 协议等,可通过设置 `use_encryption = true`,将 FRP 客户端 与 FRP 服 务端之间的通信内容加密传输,将会有效防止流量被拦截。
- 如果传输的报文长度较长,   通过设置 `use_compression = true` 对传输内容进行压缩,可以有效减小 FRP 客户端 与 FRP 服务端之间的网络流量,来加快流量转发速度,但是会额外消耗一些 CPU 资源。
- 这两个   功能默认是不开启的,需要在 FRP 客户端配置 文件中通过配置来为指定的代理启用加密与压缩的功能,压缩算法使用的是 snappy。
[[email protected] frp]# vim frpc.ini
 
[ssh]
type = tcp
local_port = 22
remote_port = 6000
use_encryption = true
use_compression = true

五、配置远程访问内网PC

- 获取windows客户端程序包,将下载下来的程序包安装在家里的PC机上;
- 将程序包解压到自己电脑的磁盘的任意目录,这个 目录下面创建`.bat`脚本需要用到

1.修改配置frpc.ini

[common]
server_addr = 58.242.xx.xx #FRP服务端的公网IP
server_port = 7000           #服务器监听的port,与frps.ini文件中配置的bind_port的值一致
privilege_token = dqz123456	#服务端配置的token
 
[rdp]				#远程桌面配置的名称
type = tcp
local_ip = 目标PC主机IP           
local_port = 3389            # 监听本地端口;当用户连接以下remote_port的7001端口时,会被转发到frp client的3389端口(远程桌面的默认端口)。 
remote_port = 7001           # 绑定远程端口;frpc 在与frps建立连接后,server会监听于此端口用于被用户连接。需要打开frp服务端的防火墙需要放通此端口

2.创建启动脚本

#创建个.bat文件,命名为frpstart.bat,添加如下内容
 
@echo off  
start  "C:\Windows\System32\cmd.exe"   
cd D:\frp_0.30.0_windows_amd64	//frpc存储路径
frpc -c frpc.ini
exit

测试下脚本是否可以正常运行

3.注册为系统服务

sc create frp_client binPath= D:\frp_0.30.0_windows_amd64\frpstart.bat start= auto

问题解决:以管理员身份去运行CMD

4.服务端防火墙放通端口

[[email protected] ~]# firewall-cmd --permanent --zone=public --add-port=7001/tcp

5.查看WEB页面 是否注册成功

浏览器输入   服务端IP:dashboard端口

6.远程访问测试

- 确认远程的办 公机开启了远程桌面访问
- 微软键+R—mstsc—服务端公网IP:7001(服务端IP:远程绑定的端口)
- 输入你办公机的开机用户和密码即可登入成功

推荐阅读