前言

在没有公网IP的情况下,很难从其他网络环境中直接访问到部署在本地的web服务,这时候就需要通过内网穿透的方式来实现。而对于内网穿透,有着很多的实现方式,最为常见的就是通过云服务器搭建和使用别人提供的服务

自建内网穿透服务

服务端配置

  1. 编辑frps.ini文件

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    [common]
    # frp监听的端口,默认是7000,可以改成其他的
    bind_port = 7000
    # 授权码,需要与客户端一致,请改为更复杂的
    token = aaaaaa

    # frp管理后台端口,请按自己需求更改
    dashboard_port = 7500
    # frp管理后台用户名和密码,请改成自己的
    dashboard_user = Mango
    dashboard_pwd = 12345678
    enable_prometheus = true
    # http 端口可更改
    vhost_http_port = 8090
    # https 端口可更改
    vhost_https_port= 8081
    #vhost_https_port = 8080
    # frp日志配置 路径根据自己需求更改
    log_file = /root/frp/.frps.log
    log_level = error
    log_max_days = 3
  2. 配置systemd守护进程便于管理

    1
    vim /etc/systemd/system/frps.service

    输入以下内容并保存

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    [Unit]
    Description=fraps service
    After=network.target syslog.target
    Wants=network.target

    [Service]
    Type=simple
    #启动服务的命令(此处写你的frps的实际安装目录)
    ExecStart=/root/frp/frps -c /root/frp/frps.ini

    [Install]
    WantedBy=multi-user.target

    启动frps并设置开机自启

    1
    2
    3
    systemctl daemon-reload
    systemctl start frps
    systemctl enable frps
  3. 配置nginx

    如果没有nginx先安装

    1
    2
    apt update
    apt install nginx

    编辑配置文件

    1
    2
    3
    4
    5
    vim /etc/nginx/sites-enabled/nextcloud

    # 也可以不新建nextcloud文件,直接配置默认文件

    vim /etc/nginx/sites-enabled/default

    nginx代理frps配置文件参考

    可配置SSL开启https

    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
    server{
    listen 80;
    listen 443 ssl;
    #对应你的域名
    server_name xxx.xxx.cn;
    # https 域名证书相关配置
    # ssl证书存储路径,根据个人存储路径设置,我的被存在了 /etc/nginx/ssl/ 文件夹下面
    ssl_certificate /etc/nginx/ssl/xxx.mstzf.cn.pem;
    ssl_certificate_key /etc/nginx/ssl/xxx.mstzf.cn.key;
    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://127.0.0.1:8090; # 映射的frp服务端frps.ini的 vhost_http_port端口
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    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;
    client_max_body_size 0;
    }
    }
    }

    重启nginx服务

    1
    systemctl restart nginx

客户端配置

  1. 编辑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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    [common]
    # 远程服务器地址
    # 替换为自己的域名
    server_addr = 0.0.0.0
    # 远程服务器监听端口
    # 和服务端 bind_port 相同
    server_port = 7000
    # 连接密钥
    # 必须和服务端配置相同
    token = aaaaaa

    # 配置日志文件
    # 日志级别:trace, debug, info, warn, error
    # 日志保存路径根据需求修改
    log_file = /home/zh/frp/log/.log
    log_level = error
    log_max_days = 3

    # 客户端管理配置
    admin_addr = 127.0.0.1
    admin_port = 7500
    admin_user = Mango
    admin_pwd = 12345678

    # 代理端口配置 模板
    # [内容随意 如ssh]
    # type = 连接类型 如 tcp
    # local_ip = 127.0.0.1
    # local_port = 22 本地需要代理的端口
    # remote_port = 2222 将本地22端口代理为远程的2222端口
    # 该配置下,可用远程 ip 的 2222 端口访问到本地的 22 端口服务

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

    [rdp]
    type=tcp
    local_ip = 127.0.0.1
    local_port=3389
    remote_port=3389

    [nx]
    type=tcp
    local_ip=127.0.0.1
    local_port=4000
    remote_port=4000

    [web]
    type = http
    local_ip = 127.0.0.1
    local_port = 80
    #subdomain = root
    # 绑定的域名 和nginx配置下的 server_name 相同
    custom_domains = xxx.mstzf.cn
  2. 为frpc配置systemd守护进程便于管理

    编辑文件

    1
    vim /etc/systemd/system/frpc.service

    输入以下内容

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    [Unit]
    Description=Frp Client Service
    After=network.target

    [Service]
    Type=simple
    User=root
    Restart=on-failure
    RestartSec=5s
    # 根据frp所在位置设置
    ExecStart=/home/zh/frp/frpc -c /home/zh/frp/frpc.ini
    LimitNOFILE=1048576

    [Install]
    WantedBy=multi-user.target

    启动frpc并配置开机自启

    1
    2
    3
    4
    5
    systemctl daemon-reload

    systemctl start frpc

    systemctl enable frpc

使用第三方服务

我个人使用的是Sakura Frp,有能够满足基本需求的免费套餐,vip套餐也很划算,已经能够满足我的基本需求

  1. 注册账号

  2. 完善个人信息

    如果有建站需求想要使用国内站点,需要完成实名认证和有备案域名,否则只能使用国外的站点来搭建

  3. 在客户端安装frp软件

    这一部分官网中已经介绍得十分的详细,这里只有几个关键命令,具体可到官网查看

    确认系统架构

    1
    uname -m

    获取软件链接

    安装

    1
    2
    3
    4
    5
    cd /usr/local/bin

    wget -O frpc <下载地址>

    chmod 755 frpc
  4. 配置守护进程(systemd)

    具体操作可去指导文档查看

    添加工作目录

    1
    mkdir -p /usr/local/etc/natfrp

    编辑配置文件

    1
    vim /etc/systemd/system/frpc@.service

    输入配置内容

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    [Unit]
    Description=SakuraFrp Service
    After=network.target

    [Service]
    Type=idle
    #DynamicUser=yes
    Restart=on-failure
    RestartSec=60s
    ExecStart=/usr/local/bin/frpc -f %i
    WorkingDirectory=/usr/local/etc/natfrp

    [Install]
    WantedBy=multi-user.target

    重载systemd

    1
    systemctl daemon-reload
  5. 新建隧道

    对于远程访问网页的,需要选择可建站的节点;至于选择国内还是国外要先看自己的域名是否已经备过案,备案过的域名可以使用国内节点,国内节点在各方面都要优于国外。如果没有备案域名,就只能使用国外节点。

    image-20231114121753361

    image-20231114121907030

    端口根据本地网页端口配置

    在绑定域名和自动HTTPS中一定要输入自己需要使用的域名

  6. 配置DSN解析

    动画

    复制节点域名,到域名服务商处配置DNS解析,将自己的域名CNAME到复制的节点域名上

    image-20231114122333951
    • 记录类型选择CNAME
    • 记录值选择选择节点所绑定域名
  7. 配置SSL证书

    从服务商下载域名SSL证书选择Nginx,将证书重命名为 将其中 扩展名为pem的直接将扩展名修改为crt 并只保留域名和扩展名 即 如 nextcloud.mstzf.cn.key 的形式

    将证书移动到之前配置的工作目录中 /usr/local/etc/natfrp

  8. 启动隧道

    1
    2
    systemctl <start|stop> <Unit名称>
    # <Unit名称> 即下图 -f 之后 红色框部分
    image-20231114122904937