智传网优云课堂,专注分享IT技术
与IT技术爱好者一起共同学习进步

内网nat穿透利器之frp实战案例

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内网端口映射

内网nat穿透利器之frp实战案例

目前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

frp服务器端配置文件

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

测试frp服务器

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

修改frp客户端配置文件

测试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

测试frp客户端

按下Ctrl+c结束测试

设置frps开机启动和启动frps服务

systemctl enable frpc
systemctl start frpc

在其它可以连接互联网的终端上试试使用ssh协议连接到frp服务器的IP或者域名,端口号10000。应该可以跳转到frp客户端这台Linux上。

使用终端软件连接ssh协议

使用终端软件连接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远程桌面连接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/

无权限做NAT端口映射时如何使用frp穿透NAT内网

赞(0)
分享到: 更多 (0)

学习QQ群:557371664

关注微信公众号自助视频学习

评论 抢沙发

评论前必须登录!