使用frp内网穿透 让本地项目跑在”线上”环境 再也不担心不在局域网内啦

其实老早就有计划想这么搞了, 奈何没什么动力. 毕竟咋们小公司, 不都在一个局域网吗? 直到今天: 要调试支付回调, 我想, 是时候让自己的mac"暴露"在公网了!

事前准备

你需要一台拥有公网IP的服务器, 我用的是阿里云的最低配ecs(应该),ecs.t6-c2m1.large, 带宽我选的按量计费, 直接拉满80M, 因为本身使用率不高, 固定带宽既没性价比, 而且万一要传个文件之类的呢, 哭死你, 按量计费首当其冲, 最后算下来24块/月
一个域名(如果https的话需要, 或者你自己搞ip证书, 感觉挺麻烦)

建立目标

由于经常会同时调试多个项目, 显然只穿透某一个端口会有点略显鸡肋, 所以计划将6850-6900这个范围内的端口都穿透出去
目标端口: 6850-6900

然后就是https的问题, 要走https的话就不能直接使用ip:端口的方式了, 或者说可以用, 但是巨麻烦, 我这里使用的是nginx反向代理来实现
目标协议: 支持https

开始搭建服务端环境

我用到的服务端是debian系统,x86_64架构, 和ubuntu指令差不多, 默认用户root, 非root用户下, 某些指令请配合sudo使用, 比如apt-get

1.首先先安装nginx

apt-get update
apt-get install nginx -y

2.然后下载frp frp最新版本下载地址

wget https://github.com/fatedier/frp/releases/download/v0.38.0/frp_0.38.0_linux_amd64.tar.gz
tar zxvf frp_0.38.0_linux_amd64.tar.gz
cd frp_0.38.0_linux_amd64
ls

frps既是我们需要使用到的(我一般都会在服务端上删除frpc相关的文件, 因为这是客户端使用的, 客户端上同理)
其中frps_full.ini中为详细的配置说明(官方良心啊), 当然, 我也会直接告诉你足够使用的配置
编辑frpc.ini文件, 按照自己的需求修改下面的配置

    [common]
    bind_addr = 0.0.0.0
    bind_port = 7000
    bind_udp_port = 7001
    kcp_bind_port = 7000
    dashboard_addr = 0.0.0.0
    dashboard_port = 7500

    # 监控面板账号
    dashboard_user = xiaoc

    # 监控面板密码
    dashboard_pwd = password
    enable_prometheus = true
    log_file = ./frps.log
    log_level = info
    log_max_days = 3
    disable_log_color = false
    detailed_errors_to_client = true
    authentication_method = token
    authenticate_heartbeats = false
    authenticate_new_work_conns = false

    # frp连接密码
    token = passwordabc

保存, 然后执行nohup ./frps -c frps.ini & 直接运行并置于后台

至此, frp服务端相关的配置就完成了, 接下来是nginx
由于个人习惯问题, 我喜欢将nginx的配置文件放置于/etc/nginx/conf.d目录下, 所以这里都按照我自己的习惯来, 先直接mkdir -p /etc/nginx/conf.d/创建目录, 然后修改nginx的基础配置文件/etc/nginx/nginx.conf, 在http节点的任意地方加入include /etc/nginx/conf.d/*.conf;client_max_body_size 100m;, 如下示意

user www-data;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;

events {
        worker_connections 768;
        # multi_accept on;
}

http {

        sendfile on;
        tcp_nopush on;
        tcp_nodelay on;
        keepalive_timeout 65;
        types_hash_max_size 2048;

        include /etc/nginx/mime.types;
        default_type application/octet-stream;

        ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE
        ssl_prefer_server_ciphers on;

        access_log /var/log/nginx/access.log;
        error_log /var/log/nginx/error.log;

        gzip on;

                client_max_body_size 100m; # 允许最大100M文件进行POST, 看自己怎么定
        include /etc/nginx/conf.d/*.conf;

        include /etc/nginx/sites-enabled/*;
}

然后cd到/etc/nginx/conf.d/目录下, 新建配置文件mac.xiaoc.conf, 配置内容如下

server {
    listen 80;
    listen 443 ssl;

        #SSL证书请自己申请, 我这里用的是根域名证书, 既一张证书可以让这个域名下的所有下一级子域名共同使用(*.mac.xiaoc.cn)
    ssl_certificate /root/ssl/mac.xiaoc.cn/fullchain.pem;
    ssl_certificate_key /root/ssl/mac.xiaoc.cn/privkey.pem;
    ssl_session_timeout 5m;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_prefer_server_ciphers on;

    #使用泛解析的方式解析域名, 并记录下端口, 为下面的代理提供数据
  server_name ~^(?<port>.+)\.mac\.xiaoc\.cn$;

  location /{
                proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header Host $http_host;
                proxy_redirect off;
        proxy_http_version 1.1;
        proxy_buffering off;
                proxy_pass http://127.0.0.1:$port;
  }
}

好了, 泛解析nginx配置也搞定, 整个服务端的配置就到此结束, 记得使用nginx -t检验脚本, 并nginx -s reload重启以使配置生效

客户端配置

客户端配置起来就很简单, 首先还是下载对应客户端版本的frp, 下载方式就不再赘述了, 由于我是mac m1, 官方提供的linux_arm64我也用不了, 所以自己编译了下, 详情见这篇日志
下载完过后, frpc既是我们需要用到的客户端, 配置frpc.ini, 内容如下

[common]
server_addr = 服务器ip
server_port = 7000
token = 设置的token

#frp支持用减号拼接的方式直接设置多个端口, 但是名称必须使用range:开头进行标识, 否则会报错
[range:mac-debug]
type = tcp
local_ip = 127.0.0.1
local_port =6850-6900
remote_port =6850-6900

最后只需要设置一个开机启动或者每次手动运行一次nohup ./frpc -c frpc.ini &即可. 运行过后前往http://ip:7500, 点击左侧的Proxies - TCP查看, 如果出现了很多的mac-debug_, 并且右边显示绿色的online, 则为整个流程都配置成功了!

最后的最后, 为你的域名加上泛解析*.mac, 记录类型为A, 记录值为你服务器的ip, 等解析生效过后即可通过https://6850.mac.xxxx.cn正常访问到你mac本地的6850端口!

PS

阿里云, 腾讯云等大部分云服务器都有防火墙(比如阿里云的安全组), 请保证安全组内7000(TCP), 7001(UDP), 7500(TCP)和设置的6850-6900端口在白名单内, 我是简单暴力, 因为也不是什么重要的服务器, 直接所有端口全部open!

发表评论

您的电子邮箱地址不会被公开。