frp实现内网穿透和反向代理

/ 技术 / 1 条站内评论 / 320浏览

什么是frp?

我有一台内网服务器(树莓派),以上装了一些服务,比如私有云盘,项目等,但是只能局域网访问.

此时如果我们需要外网访问这些服务呢?

又需要外网登录树莓派呢?

这时frp可以实现内网穿透web容器,以及反向代理ssh实现外网访问树莓派.

使用场景

1.可以实现内网穿透(类似付费花生壳,小蚂蚁)

2.可以实现反向代理

以前也写过一篇反向代理实现内网穿透的文章,https://app.sanii.cn/?p=264

比ssh,autossh速度更快更稳定.

准备工作

1.一台公网服务器

2.一台内网服务器

3.备案域名(可选,如需域名绑定功能)

安装

源码地址

https://github.com/fatedier/frp/releases

下载注意事项

1.服务端(公网服务器)和客户端(内网服务器)使用的版本要保证一致

2.源码架构要与服务器一致.

正常云服务器都是AMD架构,但是树莓派是ARM架构!!!!不同架构是无法运行程序的!!!!

配置

1.配置服务端

解压后进入,修改配置文件frps.ini(s代表server)

bind_port = 7000
#与客户端绑定的进行通信的端口
vhost_http_port = 3333
#访问客户端web服务自定义的端口号

2.配置客户端

解压后进入,修改配置文件frpc.ini(c代表clien)

[common]
server_addr = 112.112.112.112(示例)
#公网服务器ip
server_port = 7000
#与服务端bind_port一致
 
#公网通过ssh访问内部服务器
[ssh]
type = tcp
#连接协议
local_ip = 127.0.0.1
#内网服务器ip
local_port = 22
#ssh默认端口号
remote_port = 2222
#自定义的访问内部ssh端口号
 
#公网访问内部web服务器以http方式
[web01]
type = http
local_ip = 127.0.0.1
#访问协议
local_port = 8000
#内网web服务的端口号
custom_domains = xx1.sanii.cn
#所绑定的公网服务器域名,一级、二级域名都可以
 
#公网访问内部web服务器以http方式 如果多web的话保证web名字不重名即可
[web02]
type = http
local_ip = 127.0.0.1
#访问协议
local_port = 8080
#内网web服务的端口号
custom_domains = xx2.sanii.cn
#所绑定的公网服务器域名,一级、二级域名都可以

启动

先启动服务端

./frps -c ./frps.ini

再启动客户端

./frpc -c ./frpc.ini

访问

ssh访问:112.112.112.112:2222

访问web1:xx1.sanii.cn:3333

访问web2:xx2.sanii.cn:3333

HTTPS

frp使用Nginx接入SSL,https让服务更安全。

   server {
    listen 443 ssl; #443端口为https
    ssl_certificate /usr/nginx/conf/1_xx.sanii.cn_bundle.crt; #证书,路径自行修改
    ssl_certificate_key /usr/nginx/conf/2_xx.sanii.cn.key;    #证书,路径自行修改
    server_name  xx.sanii.cn;#域名
        location / {
            proxy_pass http://xx.sanii.cn:3333;#原地址
            }
         }

配置完毕重启nginx服务

service restart nginx

访问:https://xx.sanii.cn 是不是高大上了许多?

开机自启

注意事项,frp只能通过systemd方式自启

我尝试过rc.local加入自启脚本均无效,搞了很久尝试systemd才成功.

进入/etc/systemd/system目录,创建一个frp.service文件

[Unit]
Description=frpc
Wants=network-online.target
After=network.target network-online.target
Requires=network-online.target

[Service]
ExecStart=/home/pi/github/frp_0.33.0_linux_arm/frpc -c /home/pi/github/frp_0.33.0_linux_arm/frpc.ini
#ExecStart=/home/pi/github/frp_0.33.0_linux_arm/run.sh
ExecStop=/bin/kill $MAINPID
Restart=always
RestartSec=5
StartLimitInterval=0

[Install]
WantedBy=multi-user.target

相关命令

#重新加载配置文件
sudo systemctl daemon-reload              #service文件改动后要重新reload一下(类似刷新到缓存里)
sudo systemctl enable frp.service         #设置开机启动
sudo systemctl status frp.service         #查询自启状态

注意两点:

Wants=network-online.target
After=network.target network-online.target
Requires=network-online.target

在网络加载完毕才执行脚本,不配置将在网络配置完成之前执行,导致报错connect: Network is unreachable.

ExecStart=/home/pi/github/frp_0.33.0_linux_arm/frpc -c /home/pi/github/frp_0.33.0_linux_arm/frpc.ini

该脚本格式为

frpc -c frpc.ini

要保证frpc和frpc.ini为绝对路径,我尝试过ExecStart=/home/pi/github/frp_0.33.0_linux_arm/run.sh

run.sh为启动脚本,实测也无法启动.

参考资料

https://www.mmuaa.com/post/537d04e936b78620.html

https://blog.csdn.net/u013144287/article/details/78589643/

  1. 111

    测试11111

    回复
琼ICP备18000156号

鄂公网安备 42011502000211号