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 代理)
其中将你浏览器输入并访问的域名填入上面的 DOMAIN
中,访问后跳转的域名填入 REDIRECT_DOMAIN
,如图例我需要这样填
1
2
DOMAIN='test.xxx.com'
REDIRECT_DOMAIN='redirect.xxx.com'
获取 ZONE_ID
在你的域名概览页面左下角可以找到 区域 ID
字样,复制下来并填入
1
ZONE='xxxxxxxxxxxxxxxx'
获取子域名的 RECORD_ID
进入域名的 DNS 页面
,按下 F12 ,切换到网络页面,此时刷新网页,在过滤那里填入dns_records
,过滤后应该只剩下一个结果,点击它并切换到预览页面,点击 result
左边的三角展开,展开后 id:"xxxxxx"
即是你的子域名的 RECORD_ID
, 数字的顺序即网页中子域名的排序,复制跳转的域名的 RECORD_ID
并填入
1
RECORD='ec55xxxxxxxxxxx'
这里需要获取的是跳转后的域名的
RECORD_ID
,即REDIRECT_DOMAIN
的RECORD_ID
,并非你浏览器输入的域名,看清楚不要弄错了
获取 RULE_ID
名称填入 natmap
(不能填其它,如填了其它下方脚本 # Redirect rule
处需要修改),下面两个用红框圈起来的也可以先随便填,完成后点击部署
在上一步点击部署后会回到重定向规则页面,此时按 F12 打开开发者工具,点击一遍你创建的规则进入编辑页面,点击后右边名称会多出来一个 entrypoint
,点击它并切换到 预览
页面,result后面的 id:"xxxxxx"
即是你规则的 RULE_ID
,复制下来并填入
1
RULE='b0516xxxxxxxxxx'
创建 Cloudflare API
在右上角点击我的个人资料,点击 API 令牌,创建令牌,在最下面找到创建自定义令牌
令牌名称可以随便取,权限必须有 区域 - 动态重定向 - 编辑
和 区域 - DNS - 编辑
这两个权限,确认无误后在页面最底部点击继续以显示摘要
将令牌复制下来并填入
1
AUTH='7PXvwdxxxxxxxxxxx'
在 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
即可