natmap
20240813
该项目用于建立从ISP NAT公共地址到本地私人地址的TCP/UDP端口映射。如果NAT的所有层都是全锥(NAT-1),则任何主机都可以通过映射的公共地址访问内部服务。在绑定模式下,所有流量都不会贯穿此程序。
中文文档
git clone --recursive https://github.com/heiher/natmap.git
cd natmap
make
# statically link
make ENABLE_STATIC=1
# cross compile
make CROSS_PREFIX= ${cross-toolchain} /bin/x86_64-unknown-linux-
# android
mkdir natmap
cd natmap
git clone --recursive https://github.com/heiher/natmap.git jni
ndk-build Usage:
natmap [options]
Options:
-4 use IPv4
-6 use IPv6
-u UDP mode
-d run as daemon
-i <interface> network interface or IP address
-k <interval> seconds between each keep-alive
-s <addr>[:port] domain name or address of STUN server
-h <addr>[:port] domain name or address of HTTP server
-e <path> script path for notify mapped address
-f <mark> fwmark value (hex: 0x1, dec: 1, oct: 01)
Bind options:
-b <port>[-port] port number range for binding
- <0>: random allocation
- <port>: specified
- <port>-<port>: sequential allocation within the range
Forward options:
-T <timeout> port forwarding timeout in seconds
-t <address> domain name or address of forward target
-p <port> port number of forward target (0: use public port)
# TCP
natmap -s turn.cloudflare.com -h example.com -b 80
# UDP
natmap -u -s turn.cloudflare.com -b 443在TCP模式下,此程序将以两个步骤建立TCP端口映射:
然后,该程序将拨打参数指定的脚本以在建立端口映射后通知公共地址。该脚本可以更新DNS记录以进行外部访问。
请注意,您需要打开防火墙以允许访问绑定端口。
goto网络 - >防火墙 - >流量规则
添加流量规则:
如果端口绑定因已经使用而失败,则该程序将尝试找出哪个本地服务过程占据端口并启用端口重复使用。这在Linux内核5.6及以后起作用,需要作为根运行。
# TCP
natmap -s turn.cloudflare.com -h example.com -b 80 -t 10.0.0.2 -p 80
# UDP
natmap -u -s turn.cloudflare.com -b 443 -t 10.0.0.2 -p 443与绑定模式类似,该程序将在界端口上侦听,接受传入的连接,然后将其转发到目标地址。
另一种方法是使用防火墙的DNAT向前转发,这种方式应使用绑定模式。
goto网络 - >防火墙 - >端口向前
添加一个端口向前规则:
{public-addr} {public-port} {ip4p} {private-port} {protocol} {private-addr}
IP4P地址格式使用IPv6特殊地址来编码IPv4地址和端口,以便于通过DNS AAAA记录进行分发。
2001::{port}:{ipv4-hi16}:{ipv4-lo16}
麻省理工学院