使用 frp 搭建内网穿透服务(树莓派、香橙派折腾系列)

2,076 阅读3分钟

frp 介绍

内网穿透简单来讲就是:使内网设备能够在外网被访问。 而 frp 是个实现了这一功能的一个开源项目,我们可以通过frp来搭建内网穿透服务。

image.png

1. 资源准备

a.云服务器(vps)一台(腾讯云最近有超高优惠哦🙂)

b.能上网的本地设备(树莓派、香橙派、手机、电脑均可)一台

2. 下载软件 frps(服务端)、frpc(客户端)

资源地址:github.com/fatedier/fr…

frp对应的系统:

  • xxx_darwin_amd64.tar.gz    #Mac OS系统
  • xxx_freebsd_386.tar.gz     #FreeBSD 32位系统
  • xxx_freebsd_amd64.tar.gz   #FreeBSD 64位系统
  • xxx_linux_386.tar.gz       #Linux 32位系统
  • xxx_linux_amd64.tar.gz     #Linux 64位系统
  • xxx_linux_arm.tar.gz    #Linux 32位嵌入式系统
  • xxx_linux_arm64.tar.gz    #Linux 64位嵌入式系统
  • xxx_windows_386.zip        #Windows 32位系统
  • xxx_windows_amd64.zip      #Windows 64位系统

3. 配置服务端(vps):

frps.ini

[common]
#内网穿透服务器监听的IP地址,可以省略,默认为127.0.0.1
bind_addr = 0.0.0.0
#服务器端监听的端口,默认是7000,自定义
bind_port = 7001
#token是用于安全验证,不加会导致任何机器穿透一定要加一个自己才知道的。
token = xxx

nginx.conf

    #frps web服务配置例子
    server {
        listen       80;
        server_name  web.frp.xxx.com; #自己的域名
        location / {
        proxy_pass http://127.0.0.1:30011; #记住这个端口,这是frpc映射过来的(HTTP web server)
                proxy_connect_timeout 30s;
                proxy_send_timeout   90;
                proxy_read_timeout   90;
                proxy_buffer_size    32k;
                proxy_buffers     4 32k;
                proxy_busy_buffers_size 64k;
                proxy_redirect     off;
                proxy_hide_header  Vary;
                proxy_set_header   Accept-Encoding '';
                proxy_set_header   Host   $host;
                proxy_set_header   Referer $http_referer;
                proxy_set_header   Cookie $http_cookie;
                proxy_set_header   X-Real-IP  $remote_addr;
        }
    }
    
    #frps 文件服务配置例子
    server {
        listen       80;
        server_name  file.frp.xxx.com; #自己的域名
        location / {
        proxy_pass http://127.0.0.1:30012; #记住这个端口,这是frpc映射过来的 (HTTP file server)
                proxy_connect_timeout 30s;
                proxy_send_timeout   90;
                proxy_read_timeout   90;
                proxy_buffer_size    32k;
                proxy_buffers     4 32k;
                proxy_busy_buffers_size 64k;
                proxy_redirect     off;
                proxy_hide_header  Vary;
                proxy_set_header   Accept-Encoding '';
                proxy_set_header   Host   $host;
                proxy_set_header   Referer $http_referer;
                proxy_set_header   Cookie $http_cookie;
                proxy_set_header   X-Real-IP  $remote_addr;
        }
    }

    #frps ssh服务配置例子
    server {
        listen       80;
        server_name  ssh.frp.xxx.com; #自己的域名
        location / {
        proxy_pass http://127.0.0.1:30013; #记住这个端口,这是frpc映射过来的 (ssh server)
                proxy_connect_timeout 30s;
                proxy_send_timeout   90;
                proxy_read_timeout   90;
                proxy_buffer_size    32k;
                proxy_buffers     4 32k;
                proxy_busy_buffers_size 64k;
                proxy_redirect     off;
                proxy_hide_header  Vary;
                proxy_set_header   Accept-Encoding '';
                proxy_set_header   Host   $host;
                proxy_set_header   Referer $http_referer;
                proxy_set_header   Cookie $http_cookie;
                proxy_set_header   X-Real-IP  $remote_addr;
        }
    }

4. 配置客户端(pc)

frpc.ini

[common]
#外网-服务器端ip 自己服务器的ip
server_addr = 11.22.33.44
#外网-服务器端监听的端口(必须与frps.ini中的配置一致)
server_port = 7001
#token要和服务器上 frps.ini 里对应的token保持一致
token = xxx

#frpc web服务配置例子
[web]
type = tcp
local_ip = 127.0.0.1
#本地开的端口
local_port = 80
#frpc映射成的远端端口
remote_port = 30011

#frpc 简单的网络文件服务配置例子
[file]
type = tcp
remote_port = 30012
plugin = static_file
#本地目录
plugin_local_path = /media/frpfile
#访问的子目录(可选)
#plugin_strip_prefix = static
#访问账号
plugin_http_user = abc
#访问密码
plugin_http_passwd = abc

#frpc ssh服务配置例子
[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
#frpc映射成的远端端口 (远端需要开放此端口) ssh username@xxx.xxx.com -p 30013
remote_port = 30013 

nginx.conf:

server {
    listen       80 default_server;
    listen       [::]:80 default_server;
    server_name  localhost;

    # 项目路径 * 关键 *
    root  /xxx/xxx/xxx;

    # Load configuration files for the default server block.
    #include /etc/nginx/default.d/*.conf;

    location / {
        index  index.html index.htm;
    }
}

5. 运行

先服务端运行命令 $ /xxx/frps -c frps.ini

后客户端运行命令 $ /xxx/frpc -c frpc.ini

(-bash: ./frpc: 权限不够: chmod 777 frpc)

6. 访问方式

a.web

浏览器里输入:web.frp.xxx.com (按下enter键直接访问)

b.简单的网络文件服务

浏览器里输入:file.frp.xxx.com (输入完地址后按下enter键,会弹出需要填写账号密码,输入前面 frpc.ini 里配置的账号密码即可 )

c.ssh

命令行工具里输入:$ ssh username@ssh.frp.xxx.com -p 30013 (username是你本地设备的用户名,按下enter键后根据提示输入相应的密码即可)

7. 设置frpc开机启动

a.为frpc配置systemd的service文件:

$ vi /usr/lib/systemd/system/frpc.service

frpc.service

[Unit]
Description=frpc
After=multi-user.target

[Service]
ExecStart=/xxx/frpc -c /xxx/frpc.ini
ExecStop=/bin/kill $MAINPID

#防止无网、开机10秒后重新启动服务
Restart=always 
RestartSec=10 
StartLimitInterval=0

[Install]
WantedBy=multi-user.target

b. 启动:

$ systemctl start frpc

c. 开启自启动

$ systemctl enable frpc

d. 重启

$ systemctl restart frpc

e. 查看服务是否生效命令

$ sstemctl list-units |grep frpc

f. 查看日志信息命令

$ systemctl status frpc

8.注意事项:

a. 检查配置云服务器的先关端口是否开放

b. 本文涉及到nginx相关的配置可以在网上找到很多这里不展开讲