Niko's blog

NAT 简介

2022-03-17

最近要在居家办公,但自己有不太想用公司的VPN,因为要装dlp 这种监控工具。所以在折腾看看有什么可以替代的工具,找到了 tailscale 这个工具,在看它的文档时有多处提到 [[NAT]]这个名字。

NAT,全称叫network address translation,网络地址解释/网络地址转换,对应的还有一个PAT全称叫port address translation。

背景

IPv4 是一个32位,如182.283.322.255,的地址形式,在IP地址中又有分类,其中某些类型的地址是不可以在公网上进行通信的,这就导致这个IPv4 的池更少了,说IPv4 不够用也不是一两年的事情了,切换到IPv6也不是那么容易的事情。如果能够利用那些不能在公网上通信的IP 地址是不是就能缓解一下这个IP 池短缺的事情呢?

在家里连上Wi-Fi时,通常都会分配一个192.168.1.x 这样的IP给到你的机器,而路由器的IP 通常是192.168.1.1。家庭网络里的设备基本也不会有公网IP的,那它又怎么在公网上跟别的机器进行通信呢?这时候NAT 的作用就体现了。

NAT 和 PAT 会有静态(static)和动态(dynamic)两种说法。

static NAT

上图中的路由器充当NAT,会做一个映射只要是由45.30.12.120 来的数据都会往10.10.10.5 这个内网机器发送。同样的当内网的机器要给外部机器通信经过路由器时都会做成一个映射修改数据的原地址。
这里的映射是双向的,双方都能互相通信,但是却不能节约IP 地址。假如你还有别的内网机器需要往外通信,那么你可能需要另外一个公网IP 来做绑定。

static PAT

上图中的数据经过路由器时,端口会被转换。10.10.10.5:8080<->45.30.12.120:80 和 10.10.10.6:443<->45.30.12.121:443 两个映射。同样的这两个也是双向的,内网中有两个机器但是它们是共享一个公网IP 45.30.12.121。

dynamic PAT

上图的情况跟静态 PAT 很像,但是路由器这边的转换,10.10.10.5:3333<->43.134.193.51:7777 和 10.10.10.6:8888<->43.134.193.51:8888 不是配置好的,是动态的,当数据来到路由器(outbound)时,路由器随机选择一个空闲端口然后和外部机器连接。既然这个映射是临时的,那么如果外网的机器要发起连接,当它的数据来到路由器时,因为没有映射表,路由器是无法知道往哪台机器上转发,那么它只能丢掉。所以这个情况下它是单向的,只能在内网机器发起了首次连接后才能收到外部机器的数据,因为这时路由器中有了一个临时的映射表。这里的一个就很像一些内网穿透的工具要做的事情。

dynamic NAT

这里也跟dynamic PAT 很像,但是不同的是,数据经过路由器映射后IP 改变,而端口是不变的。比如 10.10.10.5:3333 要往 45.30.12.120:443发送数据,那么经过路由器映射后SRT最多有可能变成43.134.193.51:3333 或者 43.134.193.52:3333。路由器被配置最多有两个公网IP 可以共享,那么当这两个IP 被占用时,另外机器的数据到达路由器时将会被丢弃。同样的,也只有当路由器上有有效的映射时,外部的机器才可以跟内部机器通信。

Tags: NAT