frp内网穿透的搭建与使用

什么是内网穿透

内网穿透,又称为NAT穿透。
NAT穿透技术是让NAT背后的设备,先访问指定的外网服务器,由指定的外网服务器搭建桥梁,打通内、外网设备的访问通道,实现外网设备访问到内网设备。
总之就是内网可以连公网,公网可以连公网和内网,但内网和内网无法连,但在中间加一个公网的中转服就能实现穿透!

目前内网穿透技术有很多,比如收费的花生壳、向日葵、神卓互联、ngrok等等。
当然如果你不想数据掌握在别人手中,且有自己的服务器,那么可以通过开源技术自己搭建一个,比如frp

frp服务器

下载软件包

下载服务器端程序,选择合适的版本即可,

frp_0.57.0_darwin_amd64.tar.gz —— 适用于Mac OS 64位系统
frp_0.57.0_darwin_arm64.tar.gz —— 适用于Mac OS 64位嵌入式系统
frp_0.57.0_freebsd_386.tar.gz —— 适用于FreeBSD 32位系统
frp_0.57.0_freebsd_amd64.tar.gz —— 适用于FreeBSD 64位系统
frp_0.57.0_linux_386.tar.gz —— 适用于Linux 32位系统
frp_0.57.0_linux_amd64.tar.gz —— 适用于Linux 64位系统
frp_0.57.0_linux_arm.tar.gz —— 适用于Linux 32位嵌入式系统
frp_0.57.0_linux_arm64.tar.gz —— 适用于Linux 64位嵌入式系统
frp_0.57.0_linux_mips.tar.gz
frp_0.57.0_linux_mips64.tar.gz

下载到服务器之后,解压。

 tar -xzvf frp_0.57.0_linux_amd64.tar.gz

可以看到有很多文件,因为frp根据平台来区分不同版本,但是把客户端和服务端都压缩到一个文件包中了。
其中frps就是frp server端的部分;frpc 是frp client端的部分。这里我们只需要关心Server端。
可以直接删掉frpc、frpc.toml两个文件,节省硬盘空间。

find . -name 'frpc*' -exec rm {} \;

移动至 /usr/local(非必须 但是个好习惯)
在/usr/local/下创建一个frp文件夹。 /usr/local目录类似于windows系统的C:/Progrem Files/。用户自己编译的软件默认会安装到这个目录下。

mkdir /usr/local/frp

将frp_0.57.0_linux_amd64移动到 /usr/local/frp 里面

mv ./frp_0.57.0_linux_amd64/* /usr/local/frp/

配置软件

服务端配置文件:frps.toml

[common]
bindPort = 7000
vhostHTTPPort = 7003

【bindPort 】:frp server 启动时候绑定的端口
【vhostHTTPPort 】:可选,当我们访问公网服务器 7003 端口时, 转发到 frpc(即frp客户端) 的 type = "http" 的配置对应的服务。

启动

./frps -c frps.toml

测试访问:ip+vhostHTTPPort值

frp客户端

我是在windows上使用(将我window本机上的服务上传到frp服务端上,以便于其他人能访问)所以我下载对应的就行,
当然有的人服务端可能在安卓上、ios上或者linux上都有可能

下载软件包

下载window客户端 frp_0.57.0_windows_amd64.zip

配置软件

客户端配置文件:frpc.toml

serverAddr = "xx.xx.xx.xx"  #frp服务端所在的ip
serverPort = 7000 #frp服务端所在的端口

[[proxies]]
name = "web页面" #自定义代理名称
type = "http" #自定义代理类型
localIP = "127.0.0.1" #被代理的(本机)目标地址
localPort = 8888 #被代理的(本机)目标端口
customDomains = ["xx.xx.xx.xx"] # 代理到域名或服务器的公网ip (一般和serverAddr 字段一样)

启动

进入软件包中,使用命令行工具打开(比如cmd或powershell)

.\frpc.exe -c .\frpc.toml

成果

启动一个端口为8888的http服务

然后使用公网访问试试

仪表盘

如果想看当前frp服务的使用情况,请在服务端配置文件开启此功能 frps.toml

bindPort = 7000

# 后台管理服务配置
webServer.addr = "0.0.0.0"
webServer.port = 7500
webServer.user = "admin"
webServer.password = "admin"


其它

过时配置

早期的frp配置文件都是init,不过现在已经被抛弃了
WARNING: ini format is deprecated and the support will be removed in the future, please use yaml/json/toml format instead!

多个http服务

如果要起多个web服务,比如我有两个本地web服务,一个是端口8888,一个是端口9999

方式1
因为frp服务端的虚拟http服务vhostHTTPPort只能有一个。
所以需要配置nginx对frp服务端的http服务做代理,并配合frp二级域名来配置多个,比如

serverAddr = "xxx.xxx.xxx.xxx"
serverPort = 7000

[[proxies]]
name = "web页面1"
type = "http"
localIP = "127.0.0.1"
localPort = 8888
customDomains = ["a.dingshaohua.com"]


[[proxies]]
name = "web页面2"
type = "http"
localIP = "127.0.0.1"
localPort = 9999
customDomains = ["b.dingshaohua.com"]

最终 访问a.dingshaohua.com、b.dingshaohua.com即可

方式2
web服务本身就是http协议,http又是tcp的“子集”关系。

所以多起几个tcp代理即可(其实代理单个的web 也可以这么用,官方就是这么做的)
如果用这个的话 服务端的vhostHTTPPort 配置字段就可以不用了

serverAddr = "xx.xx.xx.xx"
serverPort = 7000

[[proxies]]
name = "web页面1"
type = "tcp"
localIP = "127.0.0.1"
localPort = 8888
remotePort = 7005 #代理到服务端所在服务器的哪个端口上(随意,别人访问的时候记得就行)

[[proxies]]
name = "web页面2"
type = "tcp"
localIP = "127.0.0.1"
localPort = 9999
remotePort = 7006

最终 访问xx.xx.xx.xx:7005、xx.xx.xx.xx:7006即可

以服务管理

传统的启动方式是直接敲命令:./frps -c ./frps.toml &
这么写,比较麻烦,而且如果要停止进程也比较麻烦,建议采用构建成服务的方式。
安装systemd:yum install systemd,通常情况下系统都带得有。
创建frps.service服务 vim /etc/systemd/system/frps.service,写入内容

[Unit]
# 服务名称,可自定义
Description = frp server
After = network.target syslog.target
Wants = network.target

[Service]
Type = simple
# 启动命令,改为实际存放frps的路径
ExecStart = /path/to/frps -c /path/to/frps.toml

[Install]
WantedBy = multi-user.target

之后,就以服务的方式管理frps

# 启动frp
sudo systemctl start frps
# 停止frp
sudo systemctl stop frps
# 重启frp
sudo systemctl restart frps
# 查看frp状态
sudo systemctl status frps
# 设置为开机自启
sudo systemctl enable frps

nginx代理


# frp.dingshaohua.com
server {
    listen       80;
    server_name  frp.dingshaohua.com;
    rewrite ^(.*) https://$server_name$1 permanent;
}
server {
    listen       443 ssl;
    server_name  frp.dingshaohua.com;

    ssl_certificate /etc/letsencrypt/live/dingshaohua.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/dingshaohua.com/privkey.pem;

    ssl_session_cache    shared:SSL:1m;
    ssl_session_timeout  5m;
    ssl_ciphers  HIGH:!aNULL:!MD5;
    ssl_prefer_server_ciphers  on;

    location / {
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header Range $http_range;
        proxy_set_header If-Range $http_if_range;
        proxy_redirect off;
        proxy_pass http://0.0.0.0:7500;
        client_max_body_size 20000m;
    }
}

参考

https://zhuanlan.zhihu.com/p/632560790
https://blog.csdn.net/weixin_43906500/article/details/116403724
https://zhuanlan.zhihu.com/p/612377399?utm_id=0
https://www.jianshu.com/p/65f19e1c20d9
https://blog.csdn.net/xuzhongyi103/article/details/134363523

posted @ 2023-08-16 14:36  丁少华  阅读(569)  评论(0编辑  收藏  举报