Tailscale 杂谈NAT
date
icon
slug
status
tags
type
password
summary

前言

随着全球终端设备的增加,IPV4的数量早已经不足以支持为每台设备分配一个独立的公网IP地址。从子网掩码到NAT,都是为了解决IPV4数量不够用的技术,虽然IPV6已经推广了很多年,但由于IPV6和IPV4的协议栈不能直接兼容,必须要得到服务提供商的适配,因此IPV6即使推出很久,市面上的解决方案依旧是使用NAT相关技术,从早年电信会提供公网IP,到现在基本全都是分配的内网路由。
所以现在很难在现代互联网中实现理想中的端到端连接,有着一层层防火墙,NAT,更甚还有ISP运营商的CGNAT。

防火墙和NAT是怎么阻止端到端连接的

防火墙

在Windows和Linux上都有自己的防火墙,Windows上是Windows Defendar防火墙,Linux如ubuntu是ufw等,无论是哪个平台的防火墙,目的都是使用规则来允许或阻止特定的网络流量。用户可以使用规则来配置允许的入站、出站端口、源IP、目标IP,使用的协议等,本质是为了确保本机的网络安全,但却对我们所需要的端到端连接进行了阻碍。所以,即使IPV6进行了普及,类似的组网技术不会消失,因为没有了NAT的阻碍,企业和运营商也会为了网络安全配置防火墙,企业和运营商的网络出口仍然不是个人能够控制的。

NAT

NAT(NETWORK ADDRESS TRANSLATION) 网络地址转换,NAT也是为了解决IPV4地址的短缺而提出的,下面用一个例子来解释NAT是如何工作,以及如何阻止我们进行端到端连接的。
如下:
notion image
我们的Laptop是位于一个192.168.0.0/16的内网地址中,那么他要向一个处于公网的Server(7.7.7.7)通信,如果不经过NAT直接和Server进行通信,Server在进行响应的时候就会产生疑惑,因为内网地址在不同网络中是可以重复的,每个人家中都有可能有一台192.168.0.20的设备,所以Server无法定位到唯一的设备。
因此NAT的作用就是将无法和公网通信的内网IP转为公网IP交由网关进行转发。
  • Laptop 发起请求 Server
  • 请求转发给网关
  • 网关使用NAT对IP数据包进行修改,首先为这个请求分配一个端口用于接收响应,然后维护一条记录,内容为 内网ip:port — 公网ip:port ,最后将数据包中的源地址进行修改再将数据包发往Server
  • Server收到请求后,将响应发回给指定端口,网关即可根据NAT维护的记录得知该将响应转发给内网的哪台设备
通过在网关上维护一个ip:port表,实现了公网IP复用。虽然NAT解决了IPV4地址的短缺,但同时也让网络变得更复杂了,现在只能由Laptop向Server发起单向通信,但Server却没有办法主动向Laptop发起通信请求,因为它无法通过NAT网关来直接访问Laptop。

Tailscale 简介

Tailscale是一个基于wireguard协议的虚拟组网工具,能进行NAT穿透、Relay中转的方式进行虚拟组网。
说起虚拟组网,大家可能会想到VPN,VPN就是为了在公网中实现加密的内网通信所提出的,它能够利用互联网建立加密的隧道来进行通信,异地组网,企业中为了安全性一般防火墙规则一般都异常严格,因此企业一般都采用VPN来使得员工连接公司内网。

传统VPN

传统的VPN都需要一个拥有公网IP的服务器充当中转,因为无论是NAT还是防火墙,都只会接收本机想要通信的目标所发送的包,因此才需要一个位于公网并且配置了转发表的服务器。
notion image
这样的网络因为都是基于中转服务器进行通信,所以也被称为“星形网络”,网络的上限受困于中转服务器的带宽限制,再加上国内云服务商高昂的带宽使得这种方案在国内收到很大的限制。
notion image

Tailscale 组网

而Tailscale是一个基于wireguard协议的虚拟组网工具,能够实现端对端访问,即最理想的访问方式,我要访问B,那我直接向B发起请求,实现了跨NAT通信。
notion image

原理

但大家可能好奇这是怎么实现的,在层层路由器下,我们的终端设备所能拿到的IP大多都是内网IP段。
💡
内网IP段如下 10.0.0.0/8 172.16.0.0/12 192.168.0.0/16
  1. 首先laptop在经过NAT将请求转为一个 ip:port 格式后,向 Server发起请求,但由于Server的NAT表中不存在发向2.2.2.2的请求自然无法实现转发
notion image
  1. 虽然第一步失败了,但是由于laptop向server发起请求,在laptop的NAT上存在了转发关系,此时只要server向laptop的 ip:port 发送请求自然就会被latop的NAT进行转发
notion image
  1. 最后因为Server向laptop发起请求,因此server的NAT表上也有了转发关系,因此也能接受来自laptop的后续请求。
notion image
这样来看是不是很简单,但这只是非常理想的情况,实际的网络环境可能非常复杂,NAT不止一层,防火墙也不止一层,在上面的模型中,甚至第一步都无法顺利实施,在两边都是内网的情况下,谁先发起通信,发给谁,我的公网出口是什么?
感兴趣的可以去看看Tailscale官方的这篇博客
 

© Borui 2021-2025