首页 在NAT 1内网IP宽带上部署Web服务并使用CloudFlare进行重定向
文章
取消

在NAT 1内网IP宽带上部署Web服务并使用CloudFlare进行重定向

NATMap 是什么

NATMap 能实现与拥有动态公网IP同等的访问效果,它通过打通完全锥型(Full cone)类型NAT的TCP、UDP端口,实现访问侧任意主机在无需客户端的情况下进行直连访问。

你可以在 这里 查看它的原理

总目录

需要准备的东西

  • 一个 CloudFlare 账号
  • 一个域名并托管到 CloudFlare
  • 网络的 NAT 类型为 NAT-1,可以用 NatTypeTester 进行测试
  • 一台刷了 OpenWrt 的软/硬路由

安装 NATMap

  • 如果你的 OpenWrt 版本为 19.07 及以上,可以安装 Luci 版本
  • 如果你的 OpenWrt 版本低于 19.07 或者安装 Luci 版本并重启路由器后无法在服务选项找到 NATMap,请前往 NATMap 的 Release 下载对应架构的版本,下载并解压到路由器任意目录

由于我的路由器 OpenWrt 版本低于 19.07,下面会使用 NATMap 的命令行版本进行演示,使用 Luci 的可以参考 NATMap WIKI 的步骤

获取 CloudFlare ID

因为脚本使用到 Cloudflare API 来实现 DDNS 和自动修改端口,所以需要获取多个 ID

  • 先创建一个笔记本将以下内容填入
    1
    2
    3
    4
    5
    6
    7
    
    ZONE=''
    RECORD=''
    RULE=''
    EMAIL=''
    AUTH=''
    DOMAIN=''
    REDIRECT_DOMAIN=''
    
  • 手动创建两个 A 类型的 DNS 记录,IP 地址随便填,其中你访问的域名需要开启小云朵 (DNS 代理)

DNS 记录
其中将你浏览器输入并访问的域名填入上面的 DOMAIN 中,访问后跳转的域名填入 REDIRECT_DOMAIN,如图例我需要这样填

1
2
DOMAIN='test.xxx.com'
REDIRECT_DOMAIN='redirect.xxx.com'

获取 ZONE_ID

在你的域名概览页面左下角可以找到 区域 ID 字样,复制下来并填入

1
ZONE='xxxxxxxxxxxxxxxx'

ZONE ID

获取子域名的 RECORD_ID

进入域名的 DNS 页面,按下 F12 ,切换到网络页面,此时刷新网页,在过滤那里填入dns_records,过滤后应该只剩下一个结果,点击它并切换到预览页面,点击 result 左边的三角展开,展开后 id:"xxxxxx" 即是你的子域名的 RECORD_ID , 数字的顺序即网页中子域名的排序,复制跳转的域名的 RECORD_ID 并填入

1
RECORD='ec55xxxxxxxxxxx'

这里需要获取的是跳转后的域名的 RECORD_ID,即 REDIRECT_DOMAINRECORD_ID,并非你浏览器输入的域名,看清楚不要弄错了

RECORD_ID

获取 RULE_ID

点击 规则 - 重定向规则 - 创建规则 RULE_ID

名称填入 natmap (不能填其它,如填了其它下方脚本 # Redirect rule 处需要修改),下面两个用红框圈起来的也可以先随便填,完成后点击部署 RULE_ID2

在上一步点击部署后会回到重定向规则页面,此时按 F12 打开开发者工具,点击一遍你创建的规则进入编辑页面,点击后右边名称会多出来一个 entrypoint,点击它并切换到 预览 页面,result后面的 id:"xxxxxx" 即是你规则的 RULE_ID,复制下来并填入

1
RULE='b0516xxxxxxxxxx'

RULE_ID3

创建 Cloudflare API

在右上角点击我的个人资料,点击 API 令牌,创建令牌,在最下面找到创建自定义令牌 AUTH

令牌名称可以随便取,权限必须有 区域 - 动态重定向 - 编辑区域 - DNS - 编辑 这两个权限,确认无误后在页面最底部点击继续以显示摘要 AUTH2

将令牌复制下来并填入

1
AUTH='7PXvwdxxxxxxxxxxx'

AUTH3

在 OpenWrt 上创建脚本

输入 vi/vim/nano wdns 命令将脚本创建在路由器的任意位置,将 刚刚 获取到的一一填入,EMAIL 填入你 CloudFlare 的注册邮箱,最后 chmod +x wdns

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
#!/bin/sh
ZONE=''
RECORD=''
RULE=''
EMAIL=''
AUTH=''
DOMAIN=''
REDIRECT_DOMAIN=''

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\":\"${REDIRECT_DOMAIN}\",\"content\":\"${ADDR}\",\"ttl\":60,\"proxied\":false}" > /dev/null 2> /dev/null
    if [ $? -eq 0 ]; then
        break
    fi
done

# Redirect 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 "{\"name\":\"default\",\"kind\":\"zone\",\"phase\":\"http_request_dynamic_redirect\",\"rules\":[{\"expression\":\"(http.host eq \\\"${DOMAIN}\\\")\",\"description\":\"natmap\",\"action\":\"redirect\",\"action_parameters\":{\"from_value\":{\"target_url\":{\"value\":\"http://${REDIRECT_DOMAIN}:${PORT}\"},\"status_code\":301,\"preserve_query_string\":false}}}]}" > /dev/null 2> /dev/null
    if [ $? -eq 0 ]; then
        break
    fi
done

运行脚本

进入 natmap 存放的目录,运行命令

1
./natmap -d -i eth1 -s stunserver.stunprotocol.org -h qq.com -b 6336 -t 192.168.0.102 -p 8000 -e /root/wdns

eth1 为你的接口名称,请根据自己的情况进行修改
6336 可以随便选一个你没有在使用使用的端口
192.168.0.102 为你的内网主机
8000 为你的 Web 服务端口
/root/wdns 为脚本存放位置

网页打开测试

浏览器地址输入你填入的 DOMAIN,此时应该会跳转到 REDIRECT_DOMAIN:PORT,如可以访问则部署成功,当网络重新拨号时 NATMap 会自动重新打洞并自动修改端口,成功运行一次后无需人工干预

设置路由器开机运行

刚刚的 命令写入 /etc/rc.local 即可

参考

本文由作者按照 CC BY 4.0 进行授权

-

-

热门标签