0%

公网IPV4的从无到有——natmap打洞

本文基于Debian而写。

不知道干什么用?使用singbox在家搭建一个ss服务端,出门在外,手机配置内网IP分流到此节点,即可畅快使用内网IP访问家中服务!

singbox服务端一键搭建点我

检测自己的nat类型

检测前一定要最大限度减少本地nat,路由器开dmz,或者直接拨号设备测试!

windows

下载 NatTypeTester,如下检测方法,结果是Full Cone则为nat1。

img

linux

使用python工具,pystun3。

pystun3是pip包管理器安装,确保本机安装好了python3和pip

1
2
3
pip install pystun3 # 安装pystun3

pystun3 # 开始测试

结果如下,显示Full Cone则为nat1。

img

安装natmap

1
wget -O /usr/bin/natmap https://github.com/heiher/natmap/releases/download/20240303/natmap-linux-arm64 && chmod +x /usr/bin/natmap

写入ddns脚本

创建并授权

1
touch /usr/bin/ddns_natmap && chmod +x /usr/bin/ddns_natmap

此ddns脚本需要使用jq

1
apt install jq

复制下方脚本内容,使用nano写入/usr/bin/ddns_natmap,需要的信息自行补充!

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
#!/bin/sh

AUTH='' # cf的授权token
DOMAIN='' # 主域名 eg:baidu.com
RECORD_NAME='' # 二级域名,这个才是实际IP更新的域名 eg:www.baidu.com 如果直接用主域名,那么直接填写主域名

IP4P=${3}

# 获取指定域名的Cloudflare区域ID
ZONE=$(curl -s -X GET "https://api.cloudflare.com/client/v4/zones?name=${DOMAIN}" \
-H "Authorization: Bearer ${AUTH}" \
-H "Content-Type: application/json" | jq -r '.result[0].id')

# 获取指定域名的DNS记录ID
RECORD=$(curl -s -X GET "https://api.cloudflare.com/client/v4/zones/${ZONE}/dns_records?type=A&name=${RECORD_NAME}" \
-H "Authorization: Bearer ${AUTH}" \
-H "Content-Type: application/json" | jq -r .result[0].id)

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

# 取消这个注释并修改[bark-key]可在ip和端口改变时获得ios的推送,需要在ios上安装bark app
#curl https://api.day.app/[bark-key]/nat穿透信息改变/${1}:${2}%0a${3}

设置natmap打洞转发

需修改一下自己的转发IP和端口,以及超时时间之类信息

-T 参数是超时时间,默认是120,这个设置其实还是比较重要的,比如通过natmap打洞的隧道连接ssh时,如果120秒空闲的话,会直接断开ssh连接,我一般设置成3600

1
2
3
4
5
6
7
8
9
10
11
12
13
cat >> /etc/systemd/system/natmap.service << EOF
[Unit]
Description=natmap server
After=network.target

[Service]
Type=simple
ExecStart=natmap -i eth0 -4 -s stunserver2024.stunprotocol.org -h qq.com -b [任意未使用端口或0(随机端口)] -t [转发的目标IP] -p [转发的目标端口] -T [超时时间秒] -e /usr/bin/ddns_natmap
Restart=on-failure

[Install]
WantedBy=multi-user.target
EOF

设置开机自启

1
2
3
systemctl daemon-reload
systemctl start natmap.service
systemctl enable natmap.service

代理app解析使用

natmap上传的是IP4P格式的IP,普通客户端无法识别,可在iOS上使用sub-store,或者服务器自建sub-store服务来达到解析IP4P的效果!sub-store可以支持几乎所有客户端的转换!

img