1. 前言
本文演示的2个场景:
- 通过frp把某台私网服务器的tcp 22 端口暴露在公网上。使公网用户可以使用ssh协议管理它。还有VNC服务,假设端口为5900,使公网用户可以远程连接Linux图形界面,VNC服务需要另外配置,不在本文讨论。
-
通过frp把某台内网的Windows系统的tcp 3389端口暴露在公网上,使公网用户可以使用Windows远程桌面管理它。
本文主要介绍如何搭建frp服务器端和frp客户端对NAT网络进行穿透,而无须做NAT端口映射。
如果我们想访问NAT内部网络里的服务器,传统方法需要同时满足以下2个条件。
- 1: 公网IP
- 2: 网关上做NAT内网端口映射
目前IPv4地址资源非常紧张,对于一般的家庭或者小型办公室而言,运营商一般不会分配全球可达的公网IP。
或者你可能面临这样的场景,你处在一个没有访问NAT路由器权限的网络里,比如客户现场。精通技术的你也无法做NAT端口映射。
如果不能满足以上任意一个条件,我们有办法访问NAT内部网络的服务器吗?
答案是肯定的,而且方法有很多,比如本文介绍的frp。
部署前提条件:
- 带公网IP的服务器
- 熟悉基本的命令行操作
- 具有相关域名的DNS控制,可以做域名与IP地址的映射(只有做URL映射时需要,纯端口转发不需要)
- 具有系统的root账号权限
组件介绍:
- CentOS 7.x/8.x 操作系统
- frp:frp 是一个专注于内网穿透的高性能的反向代理应用,支持 TCP、UDP、HTTP、HTTPS 等多种协议。可以将内网服务以安全、便捷的方式通过具有公网 IP 节点的中转暴露到公网。
2. 下载frp
打开以下github页面下载frp,根据自己的平台,软件包里已经包括服务端和客户端:
https://github.com/fatedier/frp/releases
比如我们使用x86_64架构:
执行以下命令下载最新版的frp:
FILE_PATH=`curl https://github.com/fatedier/frp/releases |grep linux_amd64 |head -n1 |awk -F \" '{ print 2 }'` && wget `echo "https://github.comFILE_PATH"`
3. 解压frp
解压frp到目录/opt/frp/
mkdir /opt/frp && tar zxvf `ls *linux_amd64.tar.gz` -C /opt/frp/
4. 安装frp服务器
复制主程序frps到/usr/bin/,复制frps服务管理文件到/etc/systemd/system
cd /opt/frp/`ls /opt/frp/` && cp frps /usr/bin/ && chmod +x /usr/bin/frps && cp systemd/frps* /etc/systemd/system
创建/etc/frp目录并编辑frp服务器的配置文件frps.ini
mkdir /etc/frp && vi /etc/frp/frps.ini
根据需求修改token字段,即frp密码
[common]
bind_addr = 0.0.0.0
bind_port = 7000
kcp_bind_port = 7000
bind_udp_port = 7001
authentication_method = token
authenticate_heartbeats = false
authenticate_new_work_conns = false
token = frp密码
dashboard_addr = 0.0.0.0
dashboard_port = 7500
dashboard_user = admin
dashboard_pwd = admin
enable_prometheus = true
5. 测试frp服务器
根据配置文件启动frp服务:
frps -c /etc/frp/frps.ini
提示以下结果表示成功启动
2021/01/11 07:39:33 [I] [service.go:190] frps tcp listen on 0.0.0.0:7000
2021/01/11 07:39:33 [I] [root.go:215] start frps success
Ctrl+c结束
设置frps开机启动和启动frps服务
systemctl enable frps
systemctl start frps
6. 防火墙开放端口
防火墙开放TCP7000,UDP7001,主程序流量。业务流量开放10000-10009端口(假设10个端口够用),最后重启防火墙。
CentOS 7和CentOS 8的防火墙设置如下:
firewall-cmd --zone=public --add-port=7000/tcp --permanent
firewall-cmd --zone=public --add-port=7001/udp --permanent
firewall-cmd --zone=public --add-port=10000-10009/tcp --permanent
firewall-cmd --reload
7. 设置客户端
7.1 Linux客户端
按上面的教程下载和解压frp
安装frp客户端,主程序为frpc
复制frp客户端主程序frpc到/usr/bin/,复制frp客户端服务配置文件到/etc/systemd/system
cd /opt/frp/`ls /opt/frp/` && cp frpc /usr/bin/ && chmod +x /usr/bin/frpc && cp systemd/frpc* /etc/systemd/system
创建目录/etc/frpc,编辑frp客户端的配置文件:
mkdir /etc/frpc && vi /etc/frp/frpc.ini
实用案例:穿透ssh服务(命令行界面)与VNC服务(图形界面)
添加以下配置内容,设置好你的frp服务器地址或者域名信息,设置frp密码,与服务器一致:
[common]
server_addr = 你的frp服务器IP或者域名
server_port = 7000
authenticate_heartbeats = false
authenticate_new_work_conns = false
token = frp密码
[ssh_host01]
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 10000
[vnc_host01]
type = tcp
local_ip = 127.0.0.1
local_port = 5900
remote_port = 10001
测试frpc服务:
frpc -c /etc/frp/frpc.ini
提示以下结果表示成功启动
2021/01/11 11:13:23 [I] [service.go:288] [a3817b] login to server success, get run id [a3817b], server udp port [7000]
2021/01/11 11:13:23 [I] [proxy_manager.go:144] [a3817b] proxy added: [ssh_host01 vnc_host01]
2021/01/11 11:13:23 [I] [control.go:180] [a3817b] [ssh_host01] start proxy success
2021/01/11 11:13:23 [I] [control.go:180] [a3817b] [vnc_host01] start proxy success
按下Ctrl+c结束测试
设置frps开机启动和启动frps服务
systemctl enable frpc
systemctl start frpc
在其它可以连接互联网的终端上试试使用ssh协议连接到frp服务器的IP或者域名,端口号10000。应该可以跳转到frp客户端这台Linux上。
使用终端软件连接ssh协议
7.2 Windows客户端
在github上找到frp的压缩包:frp_version_windows_amd64.zip
实用案例:映射远程桌面RDP服务
解压frp,然后新建文件夹命名为frp,把frpc.exe和frpc.ini 2个文件复制到frp文件夹中。修改frpc.ini为以下内容
[common]
server_addr = 你的frp服务器IP或者域名
server_port = 7000
authenticate_heartbeats = false
authenticate_new_work_conns = false
token = frp密码
[rdp_host02]
type = tcp
local_ip = 127.0.0.1
local_port = 3389
remote_port = 10002
添加2个文件
新建记事本写入内容:
"C:\Windows\SysWOW64\frp\frpc.exe" -c "C:\Windows\SysWOW64\frp\frpc.ini"
另存为run_frpc.bat
目前文件夹里有3个文件,分别是frpc.exe,frpc.ini和run_frpc.bat。
把frp这个文件夹复制到C:\Windows\SysWOW64里,双击run_frpc.bat。
试试在另一台连接互联网的Windows上远程桌面到frp客户端(Windows系统),地址为frp服务器IP或者域名,端口号为10002。
使用Windows远程桌面连接RDP协议
Windows如何设置开机自启动frpc客户端?
新建记事本写入内容:
set ws=WScript.CreateObject("WScript.Shell")
ws.Run "C:\Windows\SysWOW64\frp\run_frpc.bat /start",0
文件名另存为run_frpc.vbs复制到C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp
即可。
8. 总结
如何穿透NAT内网服务器,除了NAT端口映射的方法外,本文或者能给你带来另一种更实用方法,该方法的特点是无须做NAT端口映射,但缺点是你需要部署一台公网服务器。如果大规模商业使用,推荐使用自主搭建的frp服务。
更多功能请参考frp官方中文文档:
https://gofrp.org/docs/
评论前必须登录!
注册