更新于 

Linux搭建frp服务(内网穿透)

因为要将内网的服务暴露在外网进行访问,需要使用Frp来做内网穿透。

记录一下搭建过程

服务器环境

腾讯云

操作系统:TencentOS Server 2.4

CPU:1核

内存:2G

公网带宽:1Mbps

搭建过程

官方文档:https://gofrp.org/docs/

frp 是一个专注于内网穿透的高性能的反向代理应用,支持 TCP、UDP、HTTP、HTTPS 等多种协议。可以将内网服务以安全、便捷的方式通过具有公网 IP 节点的中转暴露到公网。

下载最新稳定版

release页面下载最新稳定版,将下载下来的包上传至服务器。

我选择将下载下来的包解压到/opt目录:

image-20210824215251697

观察解压后的文件

  • frps 是服务端运行文件

  • frpc是客户端运行文件

  • systemd文件夹,里面包含frps.service等文件,可用于配置systemctl启动,将frp服务设置为Linux守护线程、开机启动。

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

    [Service]
    Type=simple
    User=nobody
    Restart=on-failure
    RestartSec=5s
    ExecStart=/usr/bin/frps -c /etc/frp/frps.ini
    LimitNOFILE=1048576

    [Install]
    WantedBy=multi-user.target

执行相关命令

注意到frps.service中有这么一句:ExecStart=/usr/bin/frps -c /etc/frp/frps.ini,官方默认的执行位置在/usr/bin/frps 配置文件路径是/etc/frp/frps.ini

因此,为了方便以后升级,执行以下命令:

ln -s /opt/frp/frps /usr/bin/frps
ln -s /opt/frp/frps.ini /etc/frp/frps.ini
  • frps.service文件复制到/etc/systemd/system

  • 执行命令systemctl start frps以启动frps服务端

  • 执行命令systemctl status frps以查看运行状态

    image-20210824221506564

  • 执行命令systemctl enable frps设置开机启动

客户端frpc也是类似的配置

其他配置

通过自定义域名访问内网的 Web 服务

这个示例通过简单配置 HTTP 类型的代理让用户访问到内网的 Web 服务。

HTTP 类型的代理相比于 TCP 类型,不仅在服务端只需要监听一个额外的端口 vhost_http_port 用于接收 HTTP 请求,还额外提供了基于 HTTP 协议的诸多功能。

  1. 修改 frps.ini 文件,设置监听 HTTP 请求端口为 8080:

    [common]
    bind_port = 7000
    vhost_http_port = 8080
  2. 修改 frpc.ini 文件,假设 frps 所在的服务器的 IP 为 x.x.x.x,local_port 为本地机器上 Web 服务监听的端口, 绑定自定义域名为 custom_domains

    [common]
    server_addr = x.x.x.x
    server_port = 7000

    [web]
    type = http
    local_port = 80
    custom_domains = www.yourdomain.com

    [web2]
    type = http
    local_port = 8080
    custom_domains = www.yourdomain2.com
  3. 分别启动 frps 和 frpc。

  4. www.yourdomain.comwww.yourdomain2.com 的域名 A 记录解析到 IP x.x.x.x,如果服务器已经有对应的域名,也可以将 CNAME 记录解析到服务器原先的域名。或者可以通过修改 HTTP 请求的 Host 字段来实现同样的效果。

  5. 通过浏览器访问 http://www.yourdomain.com:8080 即可访问到处于内网机器上 80 端口的服务,访问 http://www.yourdomain2.com:8080 则访问到内网机器上 8080 端口的服务。