配置frp实现内网穿透工具-FRP小白教程-拯救没有公网IP的你

2018 年 7 月 30 日 4 条评论 28.93k 次阅读 11 人点赞

目前来说,各大运营商都在减少对个人用户提供公网IP,这已经是一个趋势,估计在IPv6普及前不会有好转。虽然可以通过客服要回公网ip,但是难度太大了,就算能要到运营商也得恶心恶心你,所以目前外网访问家里路由器、NAS、智能家居等成了问题。

对于没有公网IP的解决办法也有很多:群晖的Anyconnect、花生壳、Ngrok、Frp等。从效果来看Frp效果最好,所以本文重点写这个教程。

一、frp的作用
利用处于内网或防火墙后的机器,对外网环境提供 http 或 https 服务。
对于 http, https 服务支持基于域名的虚拟主机,支持自定义域名绑定,使多个域名可以共用一个80端口。
利用处于内网或防火墙后的机器,对外网环境提供 tcp 和 udp 服务,例如在家里通过 ssh 访问处于公司内网环境内的主机。

二、配置说明
1、实现功能
(1)外网通过ssh访问内网机器
(2)自定义绑定域名访问内网web服务
2、配置前准备
(1)公网服务器1台
(2)内网服务器1台(我这里演示的是linux环境 Ubuntu 14.04.2 LTS)
(3)公网服务器绑定域名1个(实现二1中(1)功能不需要公网服务器绑定域名,二1中(2)功能必须需要公网服务器绑定域名)
(4)内网服务器部署一个web服务,可以用tomcat模拟,这里就不演示了

三、安装frp服务端
1、公网服务器与内网服务器都需要下载frp进行安装,公网服务器(安装服务端),内网服务器(安装客户端)
安装服务端:
服务端(阿里云 Ubuntu 14.04.2 LTS)
输入以下命令,一次一条,一共四条:

apt-get update
wget --no-check-certificate https://raw.githubusercontent.com/clangcn/onekey-install-shell/master/frps/install-frps.sh -O ./install-frps.sh
chmod 700 ./install-frps.sh
./install-frps.sh install

之后他会让你输一些参数,全部参数都有默认值,直接回车就是输入默认值:

Please input frps bind_port [1-65535](Default Server Port: 5443): #输入frp提供服务的端口,用于服务器端和客户端通信,默认即可

Please input frps vhost_http_port [1-65535](Default vhost_http_port: 80): #输入frp进行http穿透的http服务端口,建议选择其他端口,默认的80端口给Nignx,然后用Nginx代理frp的http端口

Please input frps vhost_https_port [1-65535](Default vhost_https_port: 443): #输入frp进行https穿透的https服务端口,同上面的80端口类似,建议分配其他端口,然后通过Nginx代理此端口

Please input frps dashboard_port [1-65535](Default dashboard_port: 6443):#输入frp的控制台服务端口,用于查看frp工作状态,默认即可

Please input dashboard_user (Default: admin):#登录控制台的用户名,默认即可
Please input dashboard_pwd (Default: kpkpM7VZ):#登录控制台的密码,如果记不住默认的建议修改

Please input privilege_token (Default: 9m2UAOWa6hx5Eise):#输入frp服务器和客户端通信的密码,默认是随机生成的,默认即可
Please input frps max_pool_count [1-200](Default max_pool_count: 50):#设置每个代理可以创建的连接池上限,默认50

##### Please select log_level #####
1: info
2: warn
3: error
4: debug
#####################################################
Enter your choice (1, 2, 3, 4 or exit. default [1]): 默认即可
Please input frps log_max_days [1-30](Default log_max_days: 3 day):
##### Please select log_file #####
1: enable
2: disable
#####################################################
Enter your choice (1, 2 or exit. default [1]):默认即可

安装完毕后会弹出以下内容,标明了具体信息,到此服务端操作全部完成。


Congratulations, frps install completed!
==============================================
You Server IP      : 180.28.83.22
Bind port          : 5443
KCP support        : true
vhost http port    : 9080
vhost https port   : 9043
Dashboard port     : 6443
token              : LnDeMkeiIedDeDw
tcp_mux            : true
Max Pool count     : 50
Log level          : info
Log max days       : 3
Log file           : enable
==============================================
frps Dashboard     : http://180.28.83.22:6443/
Dashboard user     : admin
Dashboard password : admin
==============================================

frps status manage : frps {start|stop|restart|status|config|version}
/etc/init.d/frps {start|stop|restart|status|config|version}

Example:
  start: frps start
   stop: frps stop
restart: frps restart

至此,安装完成,可以访问ip地址+控制台端口查看(如果是阿里云,或者腾讯云 的服务器记得在安全组放行以上的配置的端口,否则无法访问)由于目前没有建立穿透连接,所以都是空的。

四、安装frp客户端
安装客户端:
下载客户端软件:
Mac版本
https://github.com/fatedier/frp/releases/download/v0.20.0/frp_0.20.0_darwin_amd64.tar.gz

Win版本
https://github.com/fatedier/frp/releases/download/v0.20.0/frp_0.20.0_windows_386.zip

下载完成后解压,找到 frpc.ini 文件
修改 frpc.ini 文件,假设 frps 所在的服务器的 IP 为 180.28.83.22,local_port 为本地机器上 web 服务对应的端口, 绑定自定义域名 web.frp.auan.cn



[common]
server_addr = 180.28.83.22 #这里是服务器的IP
server_port = 5443 #服务器的连接端口
token = LnDeMkeiIedDeDw #服务器的连接Token

[web]
type = http
local_ip = 127.0.0.1
local_port = 8080
custom_domains = web.frp.auan.cn

[web1]
type = http
local_ip = 127.0.0.1
local_port = 8181
custom_domains = web2.frp.auan.cn

修改完成后,保存。然后启动 frpc
我是Mac系统 所以执行 ./frpc -c ./frpc.ini
如果是Win的话,要用命令行进入到 客户端解压的文件夹,执行 frpc.exe -c frpc.ini

将 web.frp.auan.cn 的域名 A 记录解析到 IP 180.28.83.22(此处更改为你的服务器公网IP),如果服务器已经有对应的域名,也可以将 CNAME 记录解析到服务器原先的域名。

通过浏览器访问 http://web.frp.auan.cn:9080 即可访问到处于内网机器上的 web 服务。

我们通过服务器控制台就可以看到有客户端已经连接了。

到此就完成了frp的客户端搭建和连接,完成了内网穿透服务。

Linux下添加frp内网穿透工具开机启动

在/etc/rc.local里面添加/home/frp/frps -c /home/frp/frps.ini (文件的具体路径根据实际情况填写),终端里面输入下面的命令,或者把文件下载回本地修改后重新上传覆盖源文件。

vi /etc/rc.local

Windows系统下添加frp内网穿透工具为开机启动项

因为Windows系统下从命令行启动frp内网穿透工具后,如果关闭命令行的黑窗口,frp内网穿透服务就停止了,并且任务栏上一直有个命令行窗口也很不方便,所以要开机后启动并且要隐藏frp内网穿透工具的窗口,方法是这样的:新建一个文本文件,文件内写入如下内容,frp的文件路径根据自己的实际情况修改,然后重命名这个文本文件为frp.vbs ,注意txt的扩展名也要改为vbs,然后把这个frp.vbs放到Windows的启动目录里面。   Windows的启动目录位于“C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp”(如果找不到这个目录可以在运行里面输入:     “shell:startup” 或者输入“%programdata%\Microsoft\Windows\Start Menu\Programs\Startup”)

set ws=WScript.CreateObject("WScript.Shell") 
ws.Run "d:\frpc.exe -c d:\frpc_net.ini",0

 

Mac系统下使用PM2来后台运行frp
使用PM2首先得有NodeJS和NPM环境,去node官网下载mac的node安装包,傻瓜式安装,安装完毕后会自带npm。然后使用如下命令

sudo npm install pm2 -g

来进行全局安装pm2,安装完成后,进入到frp的客户端目录。执行命令

pm2 start -x './frpc' -n frp -- -c ./frpc.ini

就可以在后台启用frp,丢掉讨厌的命令行窗口了。

 

五、自定义域名访问
但是我们发现连接内网还是需要 输入 9080端口,而且域名是nginx上配置的三级域名,其实我们可以通过Nginx来反向代理一下,这样就可以自己的顶级域名,并通过80端口来访问了。

服务器安装 Nginx 的过程,请自行百度,假设你的服务器上已经安装好了Nginx

1、Nginx新建一个虚拟主机配置,或者直接改默认的主机配置也可以
在Nignx 的listen 后 增加 default_server 配置,用来监听默认情况下所有来自解析到该服务器的域名
然后在 server 段内增加 反向代理配置


listen 80 default_server;

#frp proxy
location / {
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://127.0.0.1:9080;
}

这样Nginx 将接管域名的绑定工作,监听到80端口的网站后,会将网站转发到 本机的frp 9080 端口
这时候,将 frp 的客户端配置文件改成如下:

[web]
type = http
local_ip = 127.0.0.1
local_port = 8080
custom_domains = xxx.com #此处填写你的顶级域名(该顶级域名解析到服务器的IP上)

然后启动客户端 ./frpc -c ./frpc.ini
这时候就可以通过 xxx.com 来访问你内网的网站了。

六、frp 进阶配置
1、转发 DNS 查询请求
DNS 查询请求通常使用 UDP 协议,frp 支持对内网 UDP 服务的穿透,配置方式和 TCP 基本一致。
修改 frpc.ini 文件

[common]
server_addr = 180.28.83.22 #这里是服务器的IP
server_port = 5443 #服务器的连接端口
token = LnDeMkeiIedDeDw #服务器的连接Token

[dns]
type = udp
local_ip = 8.8.8.8
local_port = 53
remote_port = 6000

2、转发 Unix域套接字
通过 tcp 端口访问内网的 unix域套接字(例如和 docker daemon 通信)。
frps 的部署步骤同上。
启动 frpc,启用 unix_domain_socket 插件,配置如下:

[common]
server_addr = 180.28.83.22 #这里是服务器的IP
server_port = 5443 #服务器的连接端口
token = LnDeMkeiIedDeDw #服务器的连接Token

[unix_domain_socket]
type = tcp
remote_port = 6000
plugin = unix_domain_socket
plugin_unix_path = /var/run/docker.sock

通过 curl 命令查看 docker 版本信息
curl http://x.x.x.x:6000/version

3、win系统远程桌面
通过tcp 来连接位于内网中的电脑

[common]
server_addr = 180.28.83.22 #这里是服务器的IP
server_port = 5443 #服务器的连接端口
token = LnDeMkeiIedDeDw #服务器的连接Token

[dns]
type = tcp
local_ip = 127.0.0.1
local_port = 3389
remote_port = 33890

然后通过 mstsc -v 180.28.83.22:33890 就可以远程桌面到内网。

 

最近有很多小朋友吐槽(有的直接破口开骂、真不知道你妈妈有没有教育你怎么做人),都有公网IP了,还用这个干嘛。此公网IP是服务器的公网IP,不是你当前使用的网络的公网IP,部分运营商已经不给分配公网IP了。而且现在网上有很多免费的FRP服务器,直接都可以拿来用的。
frp是用来链接你内网的电脑的,比如你调试一个项目,不需要把项目打包到公网服务器上就可以本地调试,比如微信支付,支付宝支付等的异步通知。
另外,有公网服务器并不是说支持所有类型的应用,比如我公网的服务器只支持php,但是我要调试Java程序,那就可以映射到本地来跑。
比如说远程连接,也可以通过公网服务器来做跳板,连接你处于内网的个人电脑,即使你用的是手机热点都可以。

雷雷

这个人太懒什么东西都没留下

文章评论(4)

  • 感谢你的分享!

    2019 年 2 月 12 日
  • 楼主帅气

    你好,请问下 我有2个外网IP地址, 怎么用一台电脑 4口网卡 插了2条线 (windows系统) 做2个FRP服务器 用来不同的场景 当然 windows下可以再跑一个虚拟机 再装一个FRP 可以实现但是机子比较渣渣跑不动虚拟机

    2021 年 1 月 3 日
  • 沙雕

    都有了公网服务器难道还没有公网IP? 如果服务器没有公网 IP 你也开不了FRP,

    2022 年 6 月 21 日
    • 雷雷

      @沙雕 FRP是用来内网穿透的,大多数情况是家用的。有公网服务器,不代表家里的宽带有公网IP。

      2022 年 7 月 4 日
  • (Spamcheck Enabled)