openwrt使用NATMap配置cloudflare实现IPv4 web服务端口隐藏

NATMAP 配合 cloudflare origin rules 实现动态端口隐藏

openwrt安装NATMAP

在软件包界面搜索安装luci-i18n-natmap-zh-cn

在cloudflare配置origin rules

添加一条DNS记录

类型 名称 内容 代理状态 TTL
A * 当前IP 自动

然后按F12打开控制台,点击编辑--保存,查看控制台中的中的网络请求,找到一个PATCH https://dash.cloudflare.com/api/v4/zones/xxxxxx/dns_records/xxxxxxxx 的请求,最后的xxxxxxxx就是该条DNS的record id,记录下来后续填入脚本的RECORD变量中。zones/后边的xxxxxx为zone id,也是需要后续填入脚本的ZONE变量中

点击左侧 规则--概述, 点击右侧创建规则,选择源服务器规则。名称随便,字段选主机名,运算符选通配符,值填*web.xxxxxx.xyz,将xxxxxx.xyz替换为自己的域名。 目标端口选择重写到任意一个端口。(其实这里随便怎么配置都行,反正后面都会被脚本改了),点击部署。

回到列表页后点击刚刚创建的规则,然后按F12打开控制台(已经打开了就不用再按了),点击保存,在请求列表中找到一个PATCH https://dash.cloudflare.com/api/v4/zones/xxxx/rulesets/xxxx/rules/xxxx的请求,rulesets/后边的xxxx部分就是rule id,记录下来后续填入脚本的RULE变量中。zones

最后点击右上角 头像--配置文件,点击API令牌,创建令牌,选择 编辑区域DNS的模板。权限那里点击添加更多,选择 区域 OriginRules 编辑。区域资源一栏的特定区域选择自己的要生效的域名,最后保存,将令牌内容记录下来填入到脚本的AUTH变量中

编辑脚本

将以上步骤得到的信息依次填入脚本一开始的变量赋值中,记得将123613.xyz替换为自己的域名

#!/bin/sh

ZONE=''
RECORD=''
RULE=''
EMAIL=''
AUTH=''
DOMAIN='*.123613.xyz'
WILDCARD_DOMAIN='*web.123613.xyz'
ADDR=${1}
PORT=${2}

# DNS
while true; do
    curl -X PUT "https://api.cloudflare.com/client/v4/zones/${ZONE}/dns_records/${RECORD}" \
        -H "X-Auth-Email: ${EMAIL}" \
        -H "Authorization: Bearer ${AUTH}" \
        -H "Content-Type:application/json" \
        --data "{\"type\":\"A\",\"name\":\"${DOMAIN}\",\"content\":\"${ADDR}\",\"ttl\":60,\"proxied\":true}" > /dev/null 2> /dev/null
    if [ $? -eq 0 ]; then
        break
    fi
done

# Origin rule
while true; do
    curl -X PUT "https://api.cloudflare.com/client/v4/zones/${ZONE}/rulesets/${RULE}" \
        -H "Authorization: Bearer ${AUTH}" \
        -H "Content-Type:application/json" \
        --data "{\"rules\":[{\"expression\":\"(http.host wildcard \\\"${WILDCARD_DOMAIN}\\\")\",\"description\":\"natmap\",\"action\":\"route\",\"ac
    if [ $? -eq 0 ]; then
        break
    fi
done

然后在路由器中执行vim /usr/bin/wdns,将脚本内容拷贝进去保存,执行chmod +x /usr/bin/wdns增加权限

设置NATMAP规则

在openwrt管理界面中找到 服务--NATMap,添加一条记录

配置项
协议 TCP
地址族协议 仅IPv4
接口 wan
Keep-alive 间隔 留空
STUN服务器 turn.cloudflare.com
HTTP服务器 qq.com
绑定端口 10443(可自己改)
转发模式
转发目标 自己web服务器IP
转发端口 自己web服务器监听的端口
通知脚本 /usr/bin/wdns

点击保存,等个1分钟左右回来看看外部IP和外部端口是否有值,有就说明穿透成功了。

使用cloudflare的长效证书

点击cloudflare左侧的SSL/TLS,将SSL/TLS 加密改为完全

点击左侧边缘证书,右侧下拉勾选始终使用HTTPS ✅

点击左侧客户端证书,主机编辑为 *.123613.xyz 和 123613.xyz, 将123613.xyz替换为自己的域名。点击 创建证书,证书有效期选择15年,点击创建,将证书私钥和CSR内容保存到自己的web服务器中,配置使用该证书内容。

nginx proxy manager 使用参考链接利用NPM反代部分

以caddy为例,将证书内容保存到 /data/caddy/cf-ssl/123613.xyz.pem和/data/caddy/cf-ssl/123613.xyz.key中,记得替换自己的域名

然后配置Caddyfile

(tls-cf) {
        tls /data/caddy/cf-ssl/123613.xyz.pem /data/caddy/cf-ssl/123613.xyz.key
}

*.123613.xyz {
  import tls-cf

  @mt host mt.123613.xyz
  handle @mt {
    reverse_proxy 192.168.2.5:8063
  }
  @mt1 host mtweb.123613.xyz
  handle @mt1 {
    reverse_proxy 192.168.2.5:8063
  }

  @fc host fc.123613.xyz
  handle @fc {
    reverse_proxy 192.168.2.5:32818
  }
  @fc1 host fcweb.123613.xyz
  handle @fc1 {
    reverse_proxy 192.168.2.5:32818
  }
}

mt.123613.xyz为例,将mt.123613.xyz转发到服务所在ip端口,mt.123613.xyz是用于IPv6直连的,mtweb.123613.xyz是用于IPv4访问cloudflare规则后访问到stun穿透的地址的。

则访问 https://mtweb.123613.xyz 是访问穿透后的地址, https://mt.123613.xyz 则是ipv6直连。

posted @ 2025-06-27 11:45  turingguo  阅读(286)  评论(0)    收藏  举报