侧边栏壁纸
博主头像
いちごみるく

行动起来,活在当下

  • 累计撰写 70 篇文章
  • 累计创建 48 个标签
  • 累计收到 55 条评论

目 录CONTENT

文章目录

家用宽带 80/443 入站受限时的三种访问方式

本文以自己的 HTTP/HTTPS 服务为例,三种方法的前提和协议能力不同。

家庭宽带是否屏蔽入站 80/443 端口,要从外网实测,同时检查公网地址、光猫、路由器、防火墙和端口映射。非标准端口本身不决定搜索引擎是否收录;备案与运营商服务条款也不能从“能连通”直接推断。

如果已经有可从外网访问的 HTTPS 服务,例如 origin.example.com:8443,可以在入口层使用标准 HTTPS 地址。若没有公网地址或无法接收入站连接,直接换回源端口不会解决问题,可以考虑第三种隧道方式。

一、Cloudflare Origin Rules 修改回源端口

场景:用户访问 https://app.example.com,Cloudflare 回源到同一服务的 8443,地址栏仍使用标准 443。

  1. 将 app.example.com 的 DNS 指向可达的源站地址并启用代理。
  2. 源站在 8443 提供 HTTPS,证书覆盖入口域名;TLS 模式选择 Full (strict)。
  3. 在 Origin Rules 中仅匹配这个主机,例如表达式 http.host eq "app.example.com",将 Destination port 改为 8443。
  4. 从外网检查源站端口和 Cloudflare 入口。若源站也有 AAAA,确认它的 IPv6 地址同样可达,避免只修通 IPv4。

Origin Rules 的目的端口可设置为 1–65535,这描述的是回源端口,不是 Cloudflare 对用户开放了所有访问端口。修改 Host、DNS 目标或 SNI 是其他设置,是否可用应按当前套餐核对;只改端口时不要额外把 Host 改成无关域名。Cloudflare Origin Rules

2022 年回源端口界面,当前布局可能不同

普通网站与 WebSocket 仍需验证应用自身的代理配置。gRPC 还有 443、TLS、HTTP/2 与 ALPN 等要求,不能由“允许修改回源端口”推出任意 gRPC 服务都可用;按 Cloudflare gRPC 要求 单独核对。

二、Workers 转发到固定的自有源站

Workers 适合需要控制路径或响应的 HTTP 应用。旧版代码只复制了 method 和 headers,没有转发请求 body,导致上传和 POST 失败;307 重定向会让浏览器直接访问源站,并没有补齐反向代理。

下面使用 Modules 语法,固定转发到自己的源站,保留请求方法、body、路径、查询参数和应用安全响应头。origin.example.com 必须是与 Worker 入口分开的源站域名,不能再次命中同一个 Worker。

const ORIGIN = 'https://origin.example.com:8443';

export default {
  async fetch(request) {
    const incoming = new URL(request.url);
    const target = new URL(ORIGIN);
    target.pathname = incoming.pathname;
    target.search = incoming.search;

    const forwarded = new Request(target.toString(), request);
    forwarded.headers.set('Host', target.host);
    const response = await fetch(new Request(forwarded, {
      redirect: 'manual',
      cache: 'no-store'
    }));

    // WebSocket 升级响应含运行时 webSocket 属性,直接返回。
    if (response.status === 101) return response;

    const headers = new Headers(response.headers);
    const location = headers.get('Location');
    if (location) {
      const redirectTo = new URL(location, target);
      if (redirectTo.origin === target.origin) {
        redirectTo.protocol = incoming.protocol;
        redirectTo.hostname = incoming.hostname;
        redirectTo.port = incoming.port;
        headers.set('Location', redirectTo.toString());
      }
    }
    headers.set('Cache-Control', 'private, no-store');
    return new Response(response.body, {
      status: response.status,
      statusText: response.statusText,
      headers
    });
  }
};

配置 Worker 的自定义域名,或使用覆盖完整路径的路由 app.example.com/*。源站自己的 HTTPS 证书需要被 Workers 信任;DNS only 源站不会经过 Cloudflare 橙云代理端口列表。Workers 自定义端口支持由兼容日期/flag 控制,allow_custom_ports 自 2024-09-02 起默认开启,旧兼容日期需要显式核对。Workers Request、兼容性 flags

redirect: manual 避免 Workers 自动把 Cookie、Authorization 等头带到跨域重定向目标。应用应把公开 URL 配置成 Worker 域名,否则绝对资源链接、Cookie 的 Domain、登录回调仍可能指向源站。这里不删除 CSP、不伪造 Referer/Origin,也不自动开放跨域凭据。

此示例不提供身份认证,需要在入口或源站按应用用途设置认证和访问控制。部署后分别验证 GET、带 body 的 POST/上传、重定向、登录 Cookie 和需要的 WebSocket;HTTP 请求转发代码的通过不等于所有流式协议均受支持。

三、Cloudflare Tunnel

如果家庭网络没有可用公网入站地址,可以在内网运行 cloudflared,由它主动连接 Cloudflare,将公开域名映射到自己的本地服务,例如 http://127.0.0.1:8080。这样不需要把家庭路由器的 80/443 端口映射到公网,但连接器所在网络仍要允许 Tunnel 所需的出站连接。

按 Cloudflare Tunnel 官方文档 创建 Tunnel、安装连接器、保存凭据并添加公开主机名。管理界面或仅供自己使用的应用应配置 Cloudflare Access 或应用本身的认证,再从外网核对实际访问权限。

以上三条路径分别解决回源端口、HTTP 转发逻辑和无公网入站的问题,应先确认自己的网络属于哪一种情况。

0

评论区