运维

frp内网穿透端口映射教程

MarginNote 3 - Mac端PDF阅读批注工具 激活码价格:¥69.00
赤友 NTFS for Mac 助手 -  磁盘硬盘格式读写软件注册激活码价格:¥35.00
虫洞 -  iPhone安卓投屏操控 电脑手机多屏协同,价格:¥45.00
namesilo全网最便宜域名注册商,输入折扣码:nsilo20立减1美元!

frp内网穿透端口映射教程

frp是一个高性能的反向代理应用,可以轻松地进行内网穿透,对外网提供服务,支持 TCPUDPHTTPHTTPS 等协议类型,并且web服务支持根据域名进行路由转发。
Githubfrp Releases

可以直接下载编译好的压缩包,在Releases页面中找到对应平台的压缩包,解压后就可以直接用,或者自己下载源码编译。为了表示对作者的尊敬,我们决定用GO编译。

安装依赖

# Ubuntu
$ sudo apt-get install bison ed gawk gcc libc6-dev make
# CentOS
$ sudo yum install gcc

下载go支持包

官方网站
$ wget https://dl.google.com/go/go1.14.linux-amd64.tar.gz

解压go包

$ sudo tar -C /usr/local -xzf go1.14.linux-amd64.tar.gz

添加环境变量和go工作区

$ vim /etc/profile

在文件的底部添加以下两行:

export PATH=$PATH:/usr/local/go/bin  
export GOPATH=/usr/local/gopath

:wq保存退出后,重新加载环境变量

$ source /etc/profile

测试

$ mkdir -p /usr/local/gopath && cd /usr/local/gopath
$ vim test.go

简单的打印测试:

package main
import "fmt"
func main() {
   fmt.Println("Hello World!")  
}

使用go编译运行:

$ go run test.go
Hello World!

至此,go环境搭建完毕。

$ go get github.com/fatedier/frp 
$ cd /usr/local/gopath/src/github.com/fatedier/frp/
$ make

404页面在源码路径utils/vhost/resource.go文件里,
更改部分如图frp内网穿透端口映射教程404源码示例1






 

 

 

哎呀迷路了...

 

 

可能的原因:

 

    • frpc没有启动成功

 

    • 域名不正确

 

    • 内网端不存在该页面

 

    • 我们的服务器被外星人劫持了

 

 

 

 

frp内网穿透服务

 

 

404源码示例2



 

 

 

 

对不起,您请求的页面不存在、或已被删除、或暂时不可用

 

可能的原因:

 

1、frpc没有启动成功;

 

2、域名不正确;

 

3、内网端不存在该网页;

 

4、frp服务器被外星人劫持了。

 

 

 

frp内网穿透服务     Powered by podipod软库网

 

 

 


你可以自行更改后再编译,就可以了

创建frps配置文件

make 编译完成后,frp里会多出一个bin目录,放着frpcfrps,对应客户端和服务端的可执行文件。服务端上只需要用到 frps,可以删掉 frpc,客户端则相反。除此之外,还需要一个配置文件。

$ rm -rf frpc
$ vim frps.ini

详细的配置请看 frp说明文件官方的 README 介绍得非常详细。我再怎么写也没有官方的介绍更详细,这里直接贴我的配置。

# frps.ini
[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

搭建详细服务端配置参考说明:

[common]
bind_addr = 0.0.0.0
#服务器IP,0.0.0.0为服务器全局所有IP可用,假如你的服务器有多个IP则可以这样做,或者填写为指定其中的一个服务器IP,支持IPV6
bind_port = 7000
#通讯端口,用于和客户端内网穿透传输数据的端口,可自定义
bind_udp_port = 7001
#UDP通讯端口,用于点对点内网穿透
kcp_bind_port = 7000
#用于KCP协议UDP通讯端口,在弱网环境下传输效率提升明显,但是会有一些额外的流量消耗。设置后frpc客户端须设置protocol = kcp
vhost_http_port = 80
#http监听端口,注意可能和服务器上其他服务用的80冲突,比如centos有些默认有Apache,可自定义
vhost_https_port = 443
#https监听端口,可自定义
dashboard_port = 7500
#通过浏览器查看 frp 的状态以及代理统计信息展示端口,可自定义
dashboard_user = admin
#信息展示面板用户名
dashboard_pwd = admin
#信息展示面板密码
log_max_days = 7
#最多保存多少天日志
privilege_token = frp888
#特权模式认证密钥
privilege_allow_ports = 1-65535
#端口白名单,为了防止端口被滥用,可以手动指定允许哪些端口被使用
max_pool_count = 100
#每个内网穿透服务限制最大连接池上限,避免大量资源占用,可自定义
authentication_timeout = 0
#frpc 所在机器和 frps 所在机器的时间相差不能超过 15 分钟,因为时间戳会被用于加密验证中,防止报文被劫持后被其他人利用,单位为秒,默认值为 900,即 15 分钟。如果修改为 0,则 frps 将不对身份验证报文的时间戳进行超时校验。国外服务器由于时区的不同,时间会相差非常大,这里需要注意同步时间或者设置此值为0
log_file = frps.log
log_level = info

我开启了privilege_mode,也就是开启了特权模式,这样服务端就不再需要配置每一条诸如 tcp、http 等的隧道,只需要把这个 frps 服务启动即可。

运行服务端

$ ./frps -c frps.ini
2020/03/30 17:28:00 [I] [service.go:83] frps tcp listen on 0.0.0.0:7001
2020/03/30 17:28:00 [I] [service.go:108] http service listen on 0.0.0.0:6666
2020/03/30 17:28:00 [I] [service.go:134] Dashboard listen on 0.0.0.0:7501
2020/03/30 17:28:00 [I] [main.go:112] Start frps success
2020/03/30 17:28:00 [I] [main.go:114] PrivilegeMode is enabled, you should pay more attention to security issues

一般会挂在后台运行这个服务,可以用nohup:

$ sudo nohup ./frps -c frps.ini >/dev/null 2>&1 &

强迫症讨厌生成的nohup.out,所以使用>/dev/null 2>&1来避免shell命令运行中有内容输出。把frps服务跑起来后,公网服务器的配置就全部搞完了,让服务器开机自动启动这个服务,否则服务器重启就断开了。这NAT客户端上也是一样的。

创建frpc配置文件

接下来,需要在内网中的客户端做同样的操作,搭建go环境(如果你有兴趣的话)、下载编译frp,唯一不同的就是反过来删除frps,保留 frpc

$ rm -rf frps
$ vim frpc.ini

搭建详细客户端配置参考说明:

[common]
server_addr = freenat.bid
#frps服务端地址
server_port = 7000
#frps服务端通讯端口,客户端连接到服务端内网穿透传输数据的端口
privilege_token = frp888
#特权模式密钥,客户端连接到FRPS服务端的验证密钥
log_file = frpc.log
#日志存放路径
log_level = info
#日志记录类别,可选:trace, debug, info, warn, error
log_max_days = 7
#日志保存天数
login_fail_exit = false
#设置为false,frpc连接frps失败后重连,默认为true不重连
protocol = kcp
#如连接报错,则去掉
#KCP协议在弱网环境下传输效率提升明显,但是对frps会有一些额外的流量消耗。服务端须先设置kcp_bind_port = 7000,freenat.bid服务端已设置支持

[http_dsm]
#穿透服务名称,不能和其他已建立的相同,使用公共服务器的建议修改成复杂一点的名称,避免与其他人冲突,很多路由器内置frpc的默认服务名称为[web],很容易很其他人冲突
type = http
#穿透协议类型,可选:tcp,udp,http,https,stcp,xtcp,这个设置之前必须自行搞清楚应该是什么
local_ip = 192.168.1.2
#本地监听IP,可以是本机IP,也可以是本地的局域网内某IP,例如你的局域网是互通的,你可以在路由器上安装frpc,然后local_ip填的群晖的ip,这样也可以把群晖穿透出去
local_port = 5000
#本地监听端口,通常有ssh端口22,远程桌面3389等等
use_compression = true
#对传输内容进行压缩,可以有效减小 frpc 与 frps 之间的网络流量,加快流量转发速度,但是会额外消耗一些 cpu 资源
use_encryption = true
#将 frpc 与 frps 之间的通信内容加密传输
custom_domains = dsm.freenat.bid
#自定义域名访问穿透服务,一般域名设置了二级域名泛解析以后,这里填*.freenat.bid即可,*自定义,如果不想用域名或者自行搭建frps没有域名,则穿透协议类型选择tcp,见以下tcp部分详解
#通过app访问群晖的注意,DS file,DS video,DS audio,DS finder里地址栏默认都是5000端口,穿透后地址栏须填写为【穿透域名:80】,DS photo由于本地local_port为80,穿透后也为80的话直接写域名地址即可

[https_dsm]
type = https
local_ip = 192.168.1.2
local_port = 5001
use_compression = true
use_encryption = true
custom_domains = dsm.freenat.bid
#以上https配置同http,群晖注意开启https(默认5001端口),证书在客户端即群晖端配置,无证书的注意浏览器访问时添加信任

[http_transmission]
type = http
local_ip = 192.168.1.2
local_port = 9091
use_compression = true
use_encryption = true
custom_domains = tr.freenat.bid
#transmission下载客户端

[http_rutorrent]
type = http
local_ip = 192.168.1.2
local_port = 80
use_compression = true
use_encryption = true
custom_domains = rt.freenat.bid
#rutorrent下载客户端,用Download Station的类似,注意端口


[http_blog]
type = http
local_ip = 192.168.1.2
local_port = 80
use_compression = true
use_encryption = true
custom_domains = blog.freenat.bid
#群晖里的web搭建的博客,怎么搭建百度去

[http_plex]
type = http
local_ip = 192.168.1.2
local_port = 32400
use_compression = true
use_encryption = true
custom_domains = plex.freenat.bid
#plex视频服务器,外面直接通过plex看群晖内视频

[https_feixun]
privilege_mode = true
type = http
local_ip = 192.168.1.1
#路由器ip
local_port = 80
use_compression = true
use_encryption = true
authentication_timeout = 0
custom_domains = feixun.freenat.bid
#穿透路由器


[tcp_ssh]
#群晖ssh连接
type = tcp
local_ip = 192.168.1.2
local_port = 22
use_compression = true
use_encryption = true
remote_port = 3463
#远程端口,一般tcp和udp需要设置,不需要设置custom_domain,访问时为【frps服务器地址+远程端口】,没有域名的用这种方式通过【frps服务器地址+远程端口】即可实现访问

[udp]
type = udp
local_ip = 192.168.1.2
local_port = 53
use_compression = true
use_encryption = true
remote_port = 3453
#访问时为【frps服务器地址+远程端口】

由于开启了特权模式,所以,所有的隧道都可以直接在frpc.ini里配置。同样,直接贴上配置供大家参考。

# frpc.ini
[common]
server_addr = 120.76.207.187
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服务即可。

运行客户端

$ sudo nohup ./frpc -c frpc.ini >/dev/null 2>&1 &

设置frp服务开机自启

只需要在/etc/rc.local文件的最后,添加frp服务的启动命令即可。

$ vim /etc/rc.local

exit 0是脚本退出的意思,只要将命令加在exit 0之前就可以开机启动了。
1、服务端,设置开机自启frps服务。

...
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

2、客户端,设置开机自启frpc服务。

...
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 服务已经自动启动了。

$ 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 服务。

$ curl https://pi.bingo.ren
<html>
    <head>
	<meta charset="utf-8"/>
    </head>
    <body>
       <h1>This is index page of Bingo's Raspberry PI. ? </h1>
    </body>
</html>

也可以在任何设备上通过 3692 端口连上内网的 sshd 服务。

$ ssh -p 3692 [email protected]
Linux bingo 4.9.41-v7+ #1023 SMP Tue Aug 8 16:00:15 BST 2017 armv7l
Last login: Sat Sep 23 17:23:29 2017 from 127.0.0.1
root@bingo:~#

如果穿透失败,请优先检查两台服务器上的 iptables,看是否有端口没有开放。确定不是防火墙的问题后,再一步一步排查问题。

贴一下 Nginx 的配置。

# pi.bingo.ren.conf
server {
  listen 80;
  listen 443 ssl http2;
  ssl_certificate /usr/local/nginx/conf/ssl/pi.bingo.ren.crt;
  ssl_certificate_key /usr/local/nginx/conf/ssl/pi.bingo.ren.key;
  ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
  ssl_ciphers EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
  ssl_prefer_server_ciphers on;
  ssl_session_timeout 10m;
  ssl_session_cache builtin:1000 shared:SSL:10m;
  ssl_buffer_size 1400;
  add_header Strict-Transport-Security max-age=15768000;
  ssl_stapling on;
  ssl_stapling_verify on;
  server_name pi.bingo.ren;
  access_log /data/wwwlogs/pi.bingo.ren_nginx.log combined;
  index index.html index.htm index.jsp;
  root /data/wwwroot/pi.bingo.ren;
  location ~ {
    proxy_pass http://127.0.0.1:6666;
    include proxy.conf;
  }

Nginx 反向代理了 frphttp 服务,转发到 frps.ini 中配置的 vhost_http_port 6666 端口。
遇到了一个坑,我在 README 中看到了 vhost_https_port,以为 HTTP 请求全部走 vhost_http_port 端口,而 HTTPS 请求需要走 vhost_https_port 端口。
于是,在配置 Nginx 的时候就把 listen 80 和 listen 443 写成两个 server80 端口的请求转发到 http://127.0.0.1:6666,443 端口的请求转发到 https://127.0.0.1:8443。
理论上似乎可行,但运行起来后, HTTPS 穿透失败了,一直都出现 502 异常。Github 上的 关于「nginx 反代 frp Https 502」的 issues 有好几个,但都没有解决的方案。作者认为,不使用 Nginx 直接请求 frpshttps 端口是正常的,所以问题应该是在 nginx 那边,他似乎对很多人提这个 issues 感到很反感和无奈。
后面想到 Nginx502有可能是 SSL 证书的问题,Nginx 会验证被反代网站的证书。试了一下反代12306同样出现502,而换成百度就可以成功访问。成功锁定问题,就是内网的那台设备没有 SSL 证书。
于是试了一下自签,仍然会出现502。看来自签也不行,估计 Nginx 还会验 CA 证书,只有权威机构颁发的才能验证通过。
正当想用 Let’s Encrypt,分一个域名去签的 SSL 证书的时候,突然发现,我的公网服务器已经签了一个证书了,为什么我的内网服务器还要再签一个?frpsfrpc 的连接通讯应该不需要 HTTPS 了,又不是直接暴露的。
只要公网的域名上了 SSL 就够了,不管访问公网服务器的时候是 http 还是 https 请求,统一走 frphttp 隧道即可。

(0)

本文由 podipod软库网 作者:DevOps 发表,转载请注明来源!

关键词:,
ToDesk - 安全好用流畅远程控制软件 替代TeamViewer,价格:¥108.00
Eagle - 图片收集管理必备软件 激活码价格:¥119.00
PDF Expert 2 - Mac上优秀的PDF阅读编辑工具,价格:¥119.00

热评文章

发表评论