内网穿透frp使用方法

警告
本文最后更新于 2021-12-12,文中内容可能已过时。

由于现在大部分宽带服务商并不提供公网IP服务,导致我们现在无法在外面通过IP来访问家中电脑,为了解决这个问题,我们可以使用内网穿透服务来解决这类问题

介绍

首先给大家介绍一下电脑与电脑是如何进行通信的。

简单的来说,电脑通过绑定的IP来进行连接的,目前使用最多的是IPV4,而IPV4的数量并不多,因此就有了IPV6,IPV6的数量可以满足目前所有设备的连接,但是在推行IPV6的进程中,运营商并不积极,所以目前的解决方案是通过将一个地区的用户转为局域网内,然后通过一个公网IP的地址去进行转发。这样就导致了大量用户共用一个公网IP,而且这个公网IP是经常变化的。这就导致了用户之间无法通过IP来进行通信,因为IP的另一端有大量的用户,而我们并不知道是哪一台。

所以我们需要内网穿透的服务。第三方内网穿透服务类似有花生壳、nat123、 金万维、等等,但是使用第三方服务要么价格昂贵,要么带宽较小。而frp是一个专注于内网穿透的高性能的反向代理应用,由于它是开源软件,因此可以免费使用,只需要自己有一台公网的服务器就可以了.

frp还支持支持 TCP、UDP、HTTP、HTTPS 等多种协议。可以将内网服务以安全、便捷的方式通过具有公网 IP 节点的中转暴露到公网。

对于服务器的要求就是要在资金允许的情况下尽量选择大带宽,否则在使用时会因为带宽太小导致卡顿。

安装

通过下载链接去下载合适自己的版本

解压缩下载的压缩包,我们需要关注以下几个文件

  • frps

  • frps.ini

  • frpc

  • frcp.ini

其中的frpc类的文件是客户端所需要的程序和配置文件,frps类的文件是服务端所需要的文件。

原理

我们们先理解一下内网转发的原理。

如果计算机A要想连接计算机B,此时由于两者都没有公网,我们无法通过IP来相互连接,这是我们需要一个拥有公网的服务器来做转发,通过计算机A与服务器连接,服务器再与计算机B连接,这样数据就可以通过计算机A–>服务器–>计算机B的方式进行传输了

服务端

我们先来配置服务端,首先配置frps.ini

1
2
3
4
5
6
[common]
bind_port = 7000
dashboard_port = 7500
token = 12345678
dashboard_user = admin
dashboard_pwd = admin

如果没有必要,端口均可使用默认值,token、user和password项请自行设置。

  • bind_port表示用于客户端和服务端连接的端口,这个端口号我们之后在配置客户端的时候要用到。
  • dashboard_port是服务端仪表板的端口,若使用7500端口,在配置完成服务启动后可以通过浏览器访问 x.x.x.x:7500 (其中x.x.x.x为云服务器的公网IP)查看frp服务运行信息。
  • token是用于客户端和服务端连接的口令,请自行设置并记录,稍后会用到。
  • dashboard_userdashboard_pwd表示打开仪表板页面登录的用户名和密码,自行设置即可。

配置完成之后,我们就可以运行服务端了,启动命令:./frps -c frps.ini

如果出现Start frps success说明运行成功

此时,通过访问x.x.x.x:7500并使用自己设置的用户名密码登录,即可看到仪表板界面。

后台运行及开机自启

由于我们的服务目前运行在前台,当我们关闭ssh窗口或者Ctrl+C停止时,frps程序也会停止,因此我们需要将其运行在后台

  1. 使用nohup命令 :nohup ./frps -c frps.ini &,但是并没有自启的方式

  2. 使用systemd启动,有自启方式

    1. 创建软路由,这里需要根据你所存放的目录来配置,将frps执行文件放在/usr/bin目录下,命令:ln -s /opt/frp/frps /usr/bin/frps

    2. 编辑文件:vim /usr/lib/systemd/system/frps.service

    3.  1
       2
       3
       4
       5
       6
       7
       8
       9
      10
      11
      12
      13
      14
      
      [Unit]
      Description=Frp Server Service
      After=network.target
      
      [Service]
      Type=simple
      User=nobody
      Restart=on-failure
      RestartSec=5s
      # 这里的frps.ini配置文件也需要根据自己所放的位置来进行填写
      ExecStart=/usr/bin/frps -c /etc/frp/frps.ini
      
      [Install]
      WantedBy=multi-user.target
    4. 开机自启:systemctl enable frps.service

    5. 后台启动:systemctl start frps.service

通过ps -ef |grep frps,如果查询到进程,则说明程序后台运行成功,此时你就可以关闭ssh窗口了

客户端

接着我们配置客户端的基础配置,我们以windows的远程连接和linux的ssh连接为例,首先需要测试是否可以在本地连接,测试成功后再配置文件。

打开文件frpc.ini,进行以下配置

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# 与服务端连接的配置
[common]
# 这里填写服务器的公网IP,也可以配置指向服务器的域名
server_addr=服务器公网IP
# 服务器制定的地址
server_port = 7000
# 与服务端相同的token
token = 12345678

# 远程连接配置
[Remote Desktop]
type = tcp
# 本机地址,可以是127.0.0.1或者0.0.0.0
local_ip = 0.0.0.0
# 本机应用端口,windows的远程连接端口为3389
local_port = 3389
# 在服务端开放的端口号,自己填写并记录即可,这里我选择与windows远程连接应用端口相同的3389
remote_port = 3389

# 配置ssh
[SSH]
type = tcp
local_ip = 0.0.0.0
# 本机应用端口,linux的远程连接端口为22
local_port = 22
# 在服务端开放的端口号,自己填写并记录即可,这里我选择了6922,因为服务器使用的是linux系统,如果使用22端口,会和服务器中的ssh的22端口冲突
remote_port = 6922

配置完成之后,打开终端,使用命令./frpc -c frpc.ini,即可在终端中运行,如果出现success,则说明运行成功。

此时我们就可以通过公网IP加上设置的remote_port就可以访问了

frpc程序在windows中不能直接双击运行!双击后并不会有任何反应!

后台运行及开机自启

同样,此时关闭终端后会导致程序停止,为了让其在后台运行,并且能开启自启动,我们需要进行优化。

由于windows中的后台运行及开机自启并不熟悉,这里大家可以自己上网搜索解决方法,这里只讲述linux的。

方法与服务器的配置类似,只是frps改为frps,其他没什么变化

高阶

现在我们已经学会的基本的配置,但是现在我们只能通过公网IP的方式去访问,这显得很不优雅,最好的方式是通过域名的方式去访问。

接下来我们学习一下域名的配置方法,首先需要一个自己的域名,然后需要配置好dns解析。

服务端

首先需要增加frps的配置,打开frps.ini,并按照以下配置

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
[common]
bind_port = 7000           #服务端连接客户端的端口
#服务端仪表板面板的端口
dashboard_port = 7500
#服务端连接客户端的口令
token = 12345678
#仪表板页面登录的用户名
dashboard_user = admin
#仪表板页面登录的密码
dashboard_pwd = admin
# 设定的http访问端口
vhost_http_port = 6080

我们这里考虑的是单服务器配置多个域名的情况,因此需要配置nginx来做反向代理。又因为我不想看到不安全信息,所以使用的是https协议。

我们以plex为例,关于plex是什么,大家可以自行百度。

./nginx/conf.d文件中创建plex.conf,并按照以下配置

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
server {
    listen 80;
    server_name plex.hikoutei.cn;
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl http2;
    server_name plex.hikoutei.cn;

    ssl_certificate /data/cert/plex.hikoutei.cn.pem;
    ssl_certificate_key /data/cert/plex.hikoutei.cn.key;

    client_max_body_size 50m;
    client_body_buffer_size 256k;
    client_header_timeout 3m;
    client_body_timeout 3m;
    send_timeout 3m;
    proxy_connect_timeout 300s;
    proxy_read_timeout 300s;
    proxy_send_timeout 300s;
    proxy_buffer_size 64k;
    proxy_buffers 4 32k;
    proxy_busy_buffers_size 64k;
    proxy_temp_file_write_size 64k;
    proxy_ignore_client_abort on;

    location / {
        proxy_pass http://127.0.0.1:6080;
        proxy_redirect off;
        proxy_set_header Host $host:80;
        proxy_ssl_server_name on;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

配置完成之后,凡事访问的域名为plex.hikoutei.cn都会通过HTTPS协议进入,最终都会访问本机的6080端口,而6080端口则是我们刚才配置的frp的服务器的http的端口。

然后重启就可以了:systemctl restart frps.service

客户端

首先需要安装plex的服务端并且能正常运行。

接着,配置frcp.ini

1
2
3
4
5
6
7
# 配置页面
[raspberrypi plex]
type = http
local_ip = 0.0.0.0
# plex的端口为6400
local_port = 6400
custom_domains = plex.hikoutei.cn

重启frpc之后,便可通过官网访问。

需要注意如果使用的是云服务器记得将那些服务器的端口给开着,否则会无法访问。

0%