
前言
frp 是一个高性能的反向代理应用,可以轻松地进行内网穿透,对外网提供服务,支持 TCP、UDP、HTTP、HTTPS 等协议类型,并且 web 服务支持根据域名进行路由转发。
Github: https://github.com/fatedier/frp
安装frp
Releases: https://github.com/fatedier/frp/releases
可以直接下载编译好的压缩包,在 Releases 页面中找到对应平台的压缩包,解压后就可以直接用,或者自己下载源码编译。
为了表示对作者的尊敬,我决定用 GO 编译。
搭建GO环境
安装依赖
1
2
3
4
|
# Ubuntu
$ sudo apt-get install bison ed gawk gcc libc6-dev make
# CentOS
$ sudo yum install gcc
|
下载go支持包
各版本的下载地址 https://www.golangtc.com/static/go/,我使用的是当前最新的1.9rc2。
1
|
$ wget https://www.golangtc.com/static/go/1.9rc2/go1.9rc2.linux-amd64.tar.gz
|
解压go包
1
|
$ sudo tar -C /usr/local -xzf go1.9rc2.linux-amd64.tar.gz
|
添加环境变量和go工作区
在文件的底部添加以下两行:
1
2
|
export PATH=$PATH:/usr/local/go/bin
export GOPATH=/usr/local/gopath
|
:wq 保存退出后,重新加载环境变量
测试
1
2
|
$ mkdir -p /usr/local/gopath && cd /usr/local/gopath
$ vim test.go
|
简单的打印测试:
1
2
3
4
5
6
7
|
package main
import "fmt"
func () {
fmt.Println("Hello World!")
}
|
使用go编译运行:
1
2
|
$ go run test.go
Hello World!
|
至此,go环境搭建完毕。
下载编译frp
1
2
3
|
$ go get github.com/fatedier/frp
$ cd /usr/local/gopath/src/github.com/fatedier/frp/
$ make
|
配置
创建frps配置文件
make 编译完成后,frp里会多出一个bin目录,放着frpc和frps,对应客户端和服务端的可执行文件。服务端上只需要用到 frps,可以删掉 frpc,客户端则相反。除此之外,还需要一个配置文件。
1
2
|
$ rm -rf frpc
$ vim frps.ini
|
详细的配置请看 https://github.com/fatedier/frp/blob/master/README_zh.md,官方的 README 介绍得非常详细。我再怎么写也没有官方的介绍更详细,这里直接贴我的配置。
1
2
3
4
5
6
7
8
9
10
11
|
[common]
bind_addr = 0.0.0.0
bind_port = 7001
vhost_http_port = 6666
dashboard_port = 7501
dashboard_user = {username}
dashboard_pwd = {password}
auth_token = {token}
privilege_token = {privilege_token}
privilege_mode = true
|
我开启了privilege_mode,也就是开启了特权模式,这样服务端就不再需要配置每一条诸如 tcp、http 等的隧道,只需要把这个 frps 服务启动即可。
运行服务端
1
2
3
4
5
6
|
$ ./frps -c frps.ini
2017/09/23 17:28:00 [I] [service.go:83] frps tcp listen on 0.0.0.0:7001
2017/09/23 17:28:00 [I] [service.go:108] http service listen on 0.0.0.0:6666
2017/09/23 17:28:00 [I] [service.go:134] Dashboard listen on 0.0.0.0:7501
2017/09/23 17:28:00 [I] [main.go:112] Start frps success
2017/09/23 17:28:00 [I] [main.go:114] PrivilegeMode is enabled, you should pay more attention to security issues
|
一般会挂在后台运行这个服务,可以用 nohup:
1
|
$ sudo nohup ./frps -c frps.ini >/dev/null 2>&1 &
|
也许我有强迫症,我很讨厌生成的 nohup.out,所以使用 >/dev/null 2>&1 来避免 shell 命令运行中有内容输出。
把 frps 服务跑起来后,公网服务器的配置就全部搞完了,当然,还得搞点手脚,让服务器开机自动启动这个服务,否则服务器重启就断开了。这个在 NAT 客户端上也是一样的,放到后面讲。
创建frpc配置文件
接下来,需要在内网中的客户端做同样的操作,搭建go环境(如果你有兴趣的话)、下载编译frp,唯一不同的就是反过来删除 frps,保留 frpc。
1
2
|
$ rm -rf frps
$ vim frpc.ini
|
由于开启了特权模式,所以,所有的隧道都可以直接在 frpc.ini 里配置。同样,直接贴上我的配置。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
# frpc.ini
[common]
server_port = 7001
auth_token = {token}
privilege_token = {privilege_token}
[bingo_pi_web]
type = http
local_port = 80
remote_port = 6666
custom_domains = pi.bingo.ren
[ssh]
type = tcp
local_port = 22
remote_port = 3692
|
这里我配置了两条隧道,一条是 http 类型的,一条是 tcp 的。然后,开启 frpc 服务即可。
运行客户端
1
|
$ sudo nohup ./frpc -c frpc.ini >/dev/null 2>&1 &
|
设置frp服务开机自启
只需要在 /etc/rc.local 文件的最后,添加 frp 服务的启动命令即可。
exit 0 是脚本退出的意思,只要将命令加在 exit 0 之前就可以开机启动了。
服务端,设置开机自启 frps 服务。
1
2
3
4
5
|
...
nohup /usr/local/gopath/src/github.com/fatedier/frp/bin/frps -c /usr/local/gopath/src/github.com/fatedier/frp/bin/frps.ini >/dev/null 2>&1 &
exit 0
|
客户端,设置开机自启 frpc 服务。
1
2
3
4
5
|
...
nohup /usr/local/etc/frp_0.13.0_linux_arm/frpc -c /usr/local/etc/frp_0.13.0_linux_arm/frpc.ini >/dev/null 2>&1 &
exit 0
|
设置完 reboot 重启一下,就会发现 frp 服务已经自动启动了。
1
2
3
|
$ ps -ef | grep frp
root 570 1 0 18:29 ? 00:00:00 /usr/local/etc/frp_0.13.0_linux_arm/frpc -c /usr/local/etc/frp_0.13.0_linux_arm/frpc.ini
root 856 806 0 18:30 pts/0 00:00:00 grep --color frp
|
测试
经过以上配置,正常情况下,在任何设备上,访问 https://pi.bingo.ren,就可以访问到内网 80 端口的 HTTP 服务。
1
2
3
4
5
6
7
8
9
|
$ curl https://pi.bingo.ren
<html>
<head>
<meta charset="utf-8"/>
</head>
<body>
<h1>This is index page of Bingo's Raspberry PI.
- NAT、端口映射、内网穿透、公网IP都是啥
原文地址:https://wuter.cn/1756.html/ 一.IPv4地址 IP协议是为计算机网络相互连接进行通信而设计的协议,它是能使连接到网上的所有计算机网络实现相互通信的一套规则. 这里 ...
- ssh 端口转发实现外网 80 端口映射到内网 80 端口
开发中经常需要外网服务映射到本机内网服务的需要,便于调试. 以前都是同事帮着配,这两天自己也看了一下 ssh 端口转发. 同事分分钟钟搞定的事情,自己折腾了 2 天, 真是弱爆了. 最初老想不明白一件 ...
- 配置多层NAT和端口映射实现外网访问内网
配置多层NAT和端口映射实现外网访问内网 背景和原理 通过配置NAT可以实现内网中不能直接访问外网的主机通过NAT代理访问内网,配置方法这里不再赘述(前文有介绍).本文以两层的NAT代理做模拟,通过端 ...
- linux之frp服务部署(内网穿透)
frp服务部署(内网穿透) 目的 更快的进行内网穿透调试以及云端开发测试 服务器为CentOS 7,客户端为win11 frp介绍 frp 是一个开源项目, 采用 C/S 模式,将服务端部署在具有公网 ...
- 1.使用frp穿透内网
1.前因后果 1.1弃用ngrok 为节约服务器成本,花了500多块买了一个华为云得1G 1核心 5M得云服务器.然后用ngrok来穿透内网.一直用得还 但是今天在弄nginx得时候发现 ngrok ...
- frp穿透内网使用vsftpd服务
本篇文章将会介绍如何使用frp穿透内网以及如何在centos8环境下安装和使用vsftpd,最后在公网通过frp穿透内网使用ftp. 一.内网穿透神器frp frp 是一个专注于内网穿透的高性能的反向 ...
- C#用UPnP穿透内网
参考了网上的一篇文章,由于时间长了,具体地址不知道了. 引入了一个DLL: Interop.NATUPNPLib.dll,实现穿透局域网,进行Socket通信. using System; using ...
- FtpServer穿透内网访问配置踩笔记
FtpServer穿透内网访问配置踩笔记 引言 FtpServer是服务器文件远程管理常用方式. 以前在局域网配置Ftp服务器以及使用公网上的Ftp服务均未碰到问题,固未对Ftp传输进行深入了解. 然 ...
- Tp-link TL-WR841N无线路由器端口映射到外网如何设置
针对TP-LINK的无线路由器进行演示如何设置端口映射和访问控制,演示使用的具体型号是TP-LINK TL-WR841N 3G无线路由器如何设置端口映射. 什么是端口映射? 端口映射又称端口转发,有的 ...
随机推荐
- 学习LCA( 最近公共祖先·二)
http://poj.org/problem?id=1986 离线找u,v之间的最小距离(理解推荐) #include<iostream> #include<cstring> ...
- python XML ElementTree的增删改查
import xml.etree.ElementTree as ET """ ElementTree.write() 将构建的XML文档写入(更新)文件. Element ...
- linux下别名的设定
命令别名设定功能: (alias)假如我需要知道这个目录底下的所有文件 (包含隐藏档) 及所有的文件属性,那么我就必须要下达『 ls -al 』这样的指令串,比较麻烦,我们可以为其设定别名为lm al ...
- collection-time-os-sys-json模块
一.collections模块 美 [kə'lekʃənz] ,收集,收藏 在内置数据(dict list set tuple)的基础上,collections模块海提供了几个常用的数据类型:c ...
- 再来看看Java的新特性——其他新特性
关于剩余Java8新特性知识点总结,包含:默认方法.Optional.CompletableFuture.时间相关. 默认方法 默认方法皆在帮助Java新功能可以兼容低版本JDK已开发的程序. 比如说 ...
- 搭建Docker私有仓库&用户密码认证&web可视化界面
1.拉取镜像 docker pull hyper/docker-registry-web docker pull registry 2.安装 yum install docker-compose 3. ...
- 计算a^b==a+b在(l,r)的对数Codeforces Round #597 (Div. 2)
题:https://codeforces.com/contest/1245/problem/F 分析:转化为:求区间内满足a&b==0的对数(解释见代码) ///求满足a&b==0在区 ...
- linux配置和查看环境变量
环境变量一般是指在操作系统中用来指定操作系统运行环境的一些参数,比如临时文件夹位置和系统文件夹位置等等. 一.Linux的变量种类 按变量的生存周期来划分,Linux变量可分为两类: 1.永久的:需要 ...
- 火车进出栈 java
题目描述 一列火车n节车厢,依次编号为1,2,3,…,n.每节车厢有两种运动方式,进栈与出栈,问n节车厢出栈的可能排列方式有多少种. 输入 一个数,n(n<=60000) 输出 一个数s表示n节 ...
- 做成像的你不得不了解的真相2-灵敏度和QE
科研级相机的灵敏度由三个主要参数决定: 探测器的QE, 像元尺寸和相机噪声. 后两项我们以后再做专题讨论.这期先讲讲小编认为顶顶重要,看起来最容易理解,但是其实还有些奥妙的QE. QE-量子效率 QE ...
|