Natmap 公网打洞

date
Dec 4, 2023
slug
natmap-passthrough
status
Published
tags
Linux
路由器
summary
natmap 打洞解决PT无上传问题,以及随时访问家中Nas
type
Post
最近玩Nas和PT,发现家中的联通宽带没有上传速度,PT站点也显示未连接,遂查了下资料,发现了Natmap 项目可以通过打洞的方式让PT上传满速,并且还能够动态访问到家中的Nas。

Nat

💡
随着网络应用的增多,IPv4地址枯竭的问题越来越严重。尽管IPv6可以从根本上解决IPv4地址空间不足问题,但目前众多网络设备和网络应用大多是基于IPv4的,因此在IPv6广泛应用之前,使用一些过渡技术(如CIDR、私网地址等)是解决这个问题的主要方式,NAT就是这众多过渡技术中的一种。
由于ipv4地址是有限的,国内的ISP基本都只会分配一个局域网IP,通过Nat技术节省了大量的公网IP,下面简单科普下4种典型的Nat实现。
notion image

Full Cone Nat (完全锥型NAT)

所有从同一个私网IP地址和端口(IP1:Port1)发送过来的请求都会被映射成同一个公网IP地址和端口(IP:Port)。并且,任何外部主机通过向映射的公网IP地址和端口发送报文,都可以实现和内部主机进行通信。
这是一种比较宽松的策略,只要建立了私网IP地址和端口与公网IP地址和端口的映射关系,所有的Internet上的主机都可以访问该NAT之后的主机。

Restricted Cone NAT(限制锥型NAT)

所有从同一个私网IP地址和端口(IP1:Port1)发送过来的请求都会被映射成同一个公网IP和端口号(IP:Port)。与完全锥型NAT不同的是,当且仅当内部主机之前已经向公网主机发送过报文,此时公网主机才能向私网主机发送报文。

Port Restricted Cone NAT(端口限制锥型NAT)

与限制锥型NAT很相似,只不过它包括端口号。也就是说,一台公网主机(IP2:Port2)想给私网主机发送报文,必须是这台私网主机先前已经给这个IP地址和端口发送过报文。

Symmetric NAT(对称NAT)

所有从同一个私网IP地址和端口发送到一个特定的目的IP地址和端口的请求,都会被映射到同一个IP地址和端口。如果同一台主机使用相同的源地址和端口号发送报文,但是发往不同的目的地,NAT将会使用不同的映射。此外,只有收到数据的公网主机才可以反过来向私网主机发送报文。
这和端口限制锥型NAT不同,端口限制锥型NAT是所有请求映射到相同的公网IP地址和端口,而对称NAT是不同的请求有不同的映射。

natmap

💡
作者项目的介绍如下:该项目用于建立从ISP NAT公网地址到本地私网地址的TCP/UDP端口映射。如果NAT的所有层都是全锥(NAT-1),则任何主机都可以通过映射的公网地址访问内部业务。在绑定模式下,所有流量都不会经过此程序。
此项目需要网络类型是Full Cone Nat ,具体的检测方式如下:
  • Windows系统可以使用nattypetester,如果软件默认的STUN server地址不可用,可以填写国内小米的服务器stun.miwifi.com。点击Test按钮然后在RFC 3489可以看到NAT类型数据。
  • Linux或Mac系统,可以用 pystun3检测。
家用宽带一般都满足Full Cone Nat 的要求,请务必使用光猫桥接路由器拨号的方式使用宽带。 我所使用联通家宽,默认是光猫拨号,直接打电话给客服5分钟就改好了桥接方式,用自己的Openwrt路由器拨号,设置好upnp 和 DMZ,这样网络类型修改好了,而且还获得了公网IPV6地址。
网络类型没问题了,接下来就是使用natmap,一共有两种模式,一种是绑定模式,一种是转发模式,可以直接参考项目介绍,已经很详细了,我是在Nas上安装natmap服务,使用转发模式,打通qbittorrent服务,使其动态修改端口为公网映射的端口号,达到满速上传。

qbittorrent

先下载编译好的natmap可执行二进制文件,请根据系统架构选择,我选择的是natmap-linux_x86_64
放在nas的目录下,重命名为natmap,同目录下新建一个脚本文件update.sh,内容如下
然后运行下面指令即可

Nas ddns设置

群晖的管理页面端口服务为5000,可以通过转发模式获取到对应的公网IP和端口,直接拿公网IP:端口访问Nas,但是IP和Port都是动态的,也不容易记住,这里就用到了DDNS。可以通过域名去动态解析访问Nas。
cloudflare控制台选DNS,先新建两条A记录,一条记录用于代理,一条用于dns解析,分别命名为a 和 b,内容填写1.1.1.1 即可。
然后在规则中创建一条重定向规则,随便填写什么都可以。
然后在我的个人资料中选择API令牌,创建一个区域,权限设置如下
notion image
准备工作到此为止,接下来是修改更新脚本cloudflare.sh中的内容
然后执行
最后访问a.xxx.com 即可实现动态访问家中的nas了!
 

展望

natmap打洞的可玩性很高,能够有效利用宽带的上传速度,可以实现动态IP访问Nas以及Nas上的Emby等服务,结合cloudflare 可玩性将更高。
 

参考

 
 
 
 

© hack-fang 1995 - 2024