frp是什么?

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

frp作用

  • 利用处于内网或防火墙后的机器,对外网环境提供 http 或 https 服务。

  • 对于 http 服务支持基于域名的虚拟主机,支持自定义域名绑定,使多个域名可以共用一个80端口。

  • 利用处于内网或防火墙后的机器,对外网环境提供 tcp 服务,例如在家里通过 ssh 访问处于公司内网环境内的主机。

frp原理

准备工作

  • 首先要使用frp进行内网穿透,就必须要一台带公网IP的服务器。
  • 然后根据对应的操作系统及架构,从 Release 页面下载最新版本的程序。
    将 frps 及 frps.ini 放到具有公网 IP 的机器上。(服务器:frp_0.33.0_linux_amd64.tar.gz)
    将 frpc 及 frpc.ini 放到处于内网环境的机器上。(树莓派:frp_0.33.0_linux_arm.tar.gz)

服务器

获取frp

[root@localhost ~]# mkdir frps
[root@localhost ~]# cd frps/
[root@localhost frps]# wget https://github.com/fatedier/frp/releases/download/v0.33.0/frp_0.33.0_linux_amd64.tar.gz
[root@localhost frps]# tar -zxvf frp_0.33.0_linux_amd64.tar.gz
[root@localhost frps]# mv frp_0.33.0_linux_amd64/* .

配置frps.ini

[root@localhost frps]# vim frps.ini

[common]
bind_port = 7000
vhost_http_port = 8080
vhost_https_port = 4433

# 验证口令
token = xxxxxxxxxx

# frp仪表盘
dashboard_port = 7500
dashboard_user = xxxx
dashboard_pwd = xxxxxx

启动frps

[root@localhost frps]# ./frps -c ./frps.ini
# 放入后台运行
[root@localhost frps]# nohup ./frps -c ./frps.ini &

将frps加入系统服务

[root@shuai ~]# cd frp/systemd/
[root@shuai systemd]# cp frps.service /usr/lib/systemd/system/frp.service
[root@shuai systemd]# vim /usr/lib/systemd/system/frp.service

[Unit]
Description=Frp Server Service
After=network.target

[Service]
Type=simple
User=nobody
Restart=on-failure
RestartSec=5s
ExecStart=/root/frp/frps -c /root/frp/frps.ini

[Install]
WantedBy=multi-user.target

# 加入开机自启
[root@shuai systemd]#systemctl enable frp

树莓派

获取frp

pi@raspberrypi:~ $ mkdir frpc
pi@raspberrypi:~ $ cd frpc/
pi@raspberrypi:~/frpc $ wget https://github.com/fatedier/frp/releases/download/v0.33.0/frp_0.33.0_linux_arm.tar.gz
pi@raspberrypi:~/frpc $ tar -zxvf frp_0.33.0_linux_arm.tar.gz
pi@raspberrypi:~/frpc $ mv frp_0.33.0_linux_arm/* .

配置frpc.ini

pi@raspberrypi:~/frpc $ vim frpc.ini

[common]
server_addr = Server_IP
server_port = 7000
token = xxxxxxxxxx

[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 2222

[web]
type = http
local_port = 80
custom_domains = pi.shuaiguoer.com

启动frpc

pi@raspberrypi:~/frpc $ ./frpc -c ./frpc.ini
# 放入后台运行
pi@raspberrypi:~/frpc $ nohup ./frpc -c ./frpc.ini &

将frpc加入系统服务

pi@raspberrypi:~ $ cd frpc/systemd/
pi@raspberrypi:~/frpc/systemd $ sudo cp frpc.service /usr/lib/systemd/system/frp.service
pi@raspberrypi:~/frpc/systemd $ sudo vim /usr/lib/systemd/system/frp.service

[Unit]
Description=Frp Client Service
After=network.target

[Service]
Type=simple
User=nobody
Restart=on-failure
RestartSec=5s
ExecStart=/home/pi/frpc/frpc -c /home/pi/frpc/frpc.ini
ExecReload=/home/pi/frpc/frpc reload -c /home/pi/frpc/frpc.ini

[Install]
WantedBy=multi-user.target

# 加入开机自启
pi@raspberrypi:~/frpc/systemd $ systemctl enable frp.service

域名解析

pi.shuaiguoer.com 的域名 A 记录解析到 IP x.x.x.x

内网穿透测试

WEB

通过浏览器访问 http://pi.shuaiguoer.com:8080
即可访问到处于内网机器上的 web 服务。

SSH

通过ssh连接:ssh 用户@服务器IP -p 2222

给网站配置HTTPS

获取SSL证书

可以通过 点我 获取免费SSL证书

服务器

因为是通过frp访问树莓派内部的Web服务,所以这里需要通过nginx的反向代理来实现https的配置

配置nginx

[root@shuai nginx]# vim pi.shuaiguoer.com.conf
server{
    listen  80;
    listen  443 ssl;
    ssl_certificate  /root/.acme.sh/pi.shuaiguoer.com/pi.shuaiguoer.com.cer;        # 证书存放位置
    ssl_certificate_key  /root/.acme.sh/pi.shuaiguoer.com/pi.shuaiguoer.com.key;    # 私钥存放位置
    server_name  *.shuaiguoer.com;      # 泛解析
    ssl_session_timeout  5m;
    ssl_protocols  TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers  ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
    ssl_prefer_server_ciphers  on;

    location / {
        proxy_pass  http://pi.shuaiguoer.com:8080;      # 注意:映射的是frp服务端的 vhost_http_port 端口
        proxy_set_header Host $http_host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-NginX-Proxy true;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_max_temp_file_size 0;
        proxy_redirect off;
        proxy_read_timeout 240s;
    }
}

# 强制HTTPS
server{
    listen  80;
    server_name  pi.shuaiguoer.com;
    return 301 https://pi.shuaiguoer.com$request_uri;
}

最后别忘了重载nginx配置文件

sudo nginx -s reload

访问 https://pi.shuaiguoer.com/ 就可以看见自己的网站了 :blush:

Last modification:August 26th, 2020 at 07:07 pm
如果觉得我的文章对你有用,请随意赞赏