cloudflared Zero Trust

openwrt 下零配置代理内网服务


Tunnel 通过在本地网络运行的一个 Cloudflare 守护程序,与 Cloudflare 云端通信,将云端请求数据转发到本地网络的 IP + 端口。

前置条件


  • 持有一个域名
  • 将域名DNS解析托管到CF
  • 内网需要穿透的HTTP服务

开始


  1. 打开Cloudflare Zero Trust工作面板

  2. 创建Cloudfare Zero Trust,选择免费计划,可以暂时不绑定信用卡

  3. 打开openwrt 通过ssh连接到后台。

  4. 安装cloudflared

    1
    2
    opkg update
    opkg install cloudflared
  5. 安装完成验证一下版本号

    1
    cloudflared --version
  6. 登录

    1
    cloudflared login

    然后将反馈的连接地址复制到浏览器打卡,选择绑定的域名进行授权。授权完成控制台会返回。

    在/root/.cloudflared/路径下生成一个文件cert.pem 授权文件

  7. 创建一个隧道

    1
    cloudflared tunnel create 隧道名字

    这里创建了一个mywork的隧道. 可以看到生成隧道ID 的json文件 记住这个id号。

  8. 新建配置文件

    /etc/cloudflared/ 路径下创建一个config.yml 文件

    编写config文件,配置文件里存放的是内网服务的与域名的映射配置。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    ## config.yml
    tunnel: 2eb55258-be2b-4511-b95e-437da8822ee6 # ← 把这行改成刚生成的 UUID
    credentials-file: /root/.cloudflared/2eb55258-be2b-4511-b95e-437da8822ee6.json ## 隧道文件的路径要与生成的一致

    ingress:
    - hostname: xxx.yourdomain.com
    service: http://localhost:5244

    - hostname: xxx.yourdomain.com
    service: http://localhost:8080

    # 继续加你想暴露的服务,格式完全一样
    # - hostname: xxx.yourdomain.com
    # service: http://127.0.0.1:端口

    - service: http_status:404 # 最后一行必须有这句兜底

    protocol: http2
  9. 测试运行

    1
    cloudflared tunnel run

    运行后查看日志,如果日志中有活动信息,那么说明它正在运行。

    1
    logread | grep cloudflared

    或者在cloudflare零配置中看网络连接器,看到你的隧道名称对应的状态是正常 绿色,就代表运行成功。

    如果报错TLS连接超时,检查防火墙,和本机的代理。存在代理将流量拦截,导致无法连接。

  10. 测试成功

    此时还无法使用子域名直接访问内网的服务。只需要在你的域名下添加对应的CNAME记录就可以了 ,名称就填写你配置的子域名的名字,内容要添加刚才生成的<隧道ID>.cfargotunnel.com

    1
    2
    3
    4

    比如我的隧道ID是 2eb55258-be2b-4511-b95e-437da8822ee6

    所以CNAME解析内容应该是2eb55258-be2b-4511-b95e-437da8822ee6.cfargotunnel.com

​ 添加完成之后就通过子域名访问内网服务了。

  1. 开机自启

    还需要创建一个开机自启服务,保证cloudflared可以后台运行

    编写/etc/init.d/cloudflared 文件

    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
    58
    59
    #!/bin/sh /etc/rc.common

    USE_PROCD=1
    START=90 ## 这是启动优先级,假如你有代理服务优先级是91 ,那让cloudflared的优先级比他大就可以先启动 保证开机重启后流量不会被代理服务拦截

    # 配置文件路径和 cloudflared 程序路径
    CONF="cloudflared"
    PROG="/usr/bin/cloudflared"

    # 这个函数是将配置文件中的参数传递给 cloudflared 启动命令
    append_param_arg() {
    local value
    config_get value "$1" "$CONF" "$2"
    [ -n "$value" ] && procd_append_param command "--$1" "$value"
    }

    start_service() {
    # 加载配置文件
    config_load "$CONF"

    # 检查是否启用 cloudflared
    local enabled
    config_get_bool enabled "$CONF" "enabled" 1
    [ "$enabled" -eq "1" ] || return 1

    # 开启 procd 实例
    procd_open_instance "$CONF"

    # 设置 cloudflared 运行的命令和参数
    procd_set_param command "$PROG" "tunnel"
    procd_append_param command "--no-autoupdate" # 禁用自动更新

    # 加载配置文件中的所有参数
    append_param_arg "config" "/etc/cloudflared/config.yml"
    append_param_arg "origincert" "/root/.cloudflared/cert.pem"
    append_param_arg "region" ""
    append_param_arg "loglevel" "debug"
    append_param_arg "logfile" "/tmp/cloudflared.log"

    # 添加其他参数
    procd_append_param command "run"
    append_param_arg "token" ""

    # 设置进程守护,重启机制
    procd_set_param respawn
    procd_set_param stderr 1

    # 关闭 procd 实例
    procd_close_instance
    }

    reload_service() {
    stop
    start
    }

    service_triggers() {
    procd_add_reload_trigger "$CONF"
    }

加入开机自启

1
/etc/init.d/cloudflared enable

开启后台运行

1
/etc/init.d/cloudflared start