natmap打洞进行公网https访问
2026/9/6大约 2 分钟
前置:
- 网络环境 NAT1(full cone)
- openwrt 安装 natmap 软件包
- 配置端口和防火墙
- 打洞成功后可用使用 公网ip:端口 进行访问
- 申请并安装了tls证书,可以进行https访问(公网ip:端口,忽略证书不匹配)
natmap转发模式:需要防火墙放行wan区域至此设备(路由器)
路由器端口转发:无需额外配置防火墙,但如果转发目标只允许私有网段访问,需要进行SNAT(添加NAT规则,选择MASQUERADE操作)
SEE:【全网最细】无公网IP实现异地远程访问家里内网设备,通过stun打洞穿透运营商NAT,实现P2P直连满速下载,无需花钱搭建内网穿透,打洞通信流程分析,stun、fullcone、nat1、CGNAT
使用域名进行https访问
更新 DNS
创建一条dns记录,以 openlist 为例,解析至natmap获取的公网ip
创建重定向规则
通过 307 重定向至http服务,浏览器、request库都能自动重定向,无感访问。
注:访问
jump2.me/openlist时,会无法匹配这条规则,导致访问失败,可以通过 308 重定向,修复这个问题:
只要证书匹配 openlist.me并且受信任,跟有公网ip的区别就是端口非标,用 jump2 访问。
natmap 通知脚本实现自动更新
参数说明:
CF_TOKEN:Cloudflare API 令牌。权限: 帐户.帐户规则集, 区域.单一重定向, 区域.DNS创建用户令牌:API 令牌 | Cloudflare
DNS_PATH_ARG、RULE_PATH_ARGF12抓包看最方便请求参数中的
description字段和规则创建时一致,不然会变更,不要留空${1} ${2}时 natmap 更新时传递的 公网ip 和 端口 信息。MATCH有 URI 前缀时,可以额外创建一条 308 的重定向,解决访问jump2.me/openlist时无法重定向的bug。
#!/bin/sh
CF_TOKEN="tpxxx"
# 1. Update DNS Record
DOMAIN="openlist.me"
DNS_PATH_ARG="/zones/xxx/dns_records/xxx"
while true; do
current_datetime=$(date '+%Y-%m-%d %H:%M:%S')
curl -s -X PUT "https://api.cloudflare.com/client/v4$DNS_PATH_ARG" \
-H "Authorization: Bearer $CF_TOKEN" \
-H "Content-Type: application/json" \
--data "{\"type\":\"A\",\"name\":\"$DOMAIN\",\"content\":\"${1}\",\"comment\": \"Updated at $current_datetime\"}"
if [ $? -eq 0 ]; then
break
fi
done
# 2. Update Redirection Rule
RULE_PATH_ARG="/zones/xxx/rulesets/xxx/rules/xxx"
MATCH="*://jump2.me/openlist/*"
TARGET="\${1}://${DOMAIN}:${2}/\${2}"
#TARGET="https://${1}:${2}"
while true; do
curl -s -X PATCH "https://api.cloudflare.com/client/v4$RULE_PATH_ARG" \
-H "Authorization: Bearer $CF_TOKEN" \
-H "Content-Type: application/json" \
--data '{
"action": "redirect",
"action_parameters": {
"from_value": {
"preserve_query_string": true,
"status_code": 307,
"target_url": {
"expression": "wildcard_replace(http.request.full_uri, r\"'$MATCH'\", r\"'$TARGET'\")"
}
}
},
"description": "openlist v4",
"enabled": true,
"expression": "(http.request.full_uri wildcard r\"'$MATCH'\")"
}'
if [ $? -eq 0 ]; then
break
fi
done