NAT穿透工作原理 转载

前言 我们在 Tailscale 工作原理 中涵盖了很多内容。但是,我们只是略微提及了如何绕过 NAT(网络地址转换器),而且无论设备之间有什么障碍,我们都假设他们能直连。下面我们就来详细讨论下。 我们先从一个简单的问题入手:在两台机器之间建立点对点连接。在 Tailscale 的案例中,我们希望建立一个 WireGuard® 隧道,但这其实并不重要。我们使用的技术应用广泛,是许多人几十年来研究的成果。例如, WebRTC 就利用这套技术在 Web 浏览器之间传输点对点音频、视频和数据。VoIP 电话和一些视频游戏也使用了类似的技术,尽管并非总是成功。 我们将对这些技术进行一般性讨论,并在适当情况下以 Tailscale 等为例进行说明。假设您正在创建自己的协议,并且需要实现 NAT 穿透。您需要两样东西: 首先,协议应该基于 UDP。虽然也可以使用 TCP 进行 NAT 穿透,但这会使原本就相当复杂的问题更加复杂,甚至可能需要对内核进行定制,具体取决于你想要实现的深度。所以下面我们重点讨论下 UDP。如果你因为希望在 NAT 穿透完成后建立面向流的连接而选择 TCP,不妨考虑改用 QUIC。QUIC 基于 UDP 构建,因此我们可以专注于使用 UDP 进行 NAT 穿透,最终仍然能够获得良好的流传输协议。 其次,你需要直接控制发送和接收网络数据包的网络套接字。通常情况下,你不能直接使用现有的网络库来穿透 NAT,因为你需要发送和接收一些额外的、不属于你正在使用的“主”协议的数据包。有些协议将 NAT 穿透与其他功能紧密集成在一起(例如 WebRTC)。但如果你要自己构建 NAT 穿透机制,最好将 NAT 穿透视为一个独立的实体,它与你的主协议共享一个套接字。两者并行运行,互相支持。 简单来说,标准的网络库只负责传输协议数据(如 TLS 握手、HTTP 请求)。但基于 NAT 穿透的连接需要你在同一个端口上,既发送业务数据,又发送用于维持连接、探测路径的“额外数据包”。如果你无法直接控制 socket,你就没法塞进这些“私货” ...

四月 19, 2026 · by NOSAE

Tailescale工作原理 转载

译者序 有的地方按个人理解,将一些带有外国腔的句子,翻译成了更适合中国人阅读的形式。 正文 人们经常问我们 Tailscale 的工作原理是什么。我们一直没回答这个问题,因为我们一直在改动它!但现在情况已经稳定下来了。 让我们从下到上逐一了解整个 Tailscale 系统,就像我们当初构建它时一样(但会略过一些过程中遇到的曲折)。有了这些信息,你应该能够构建自己的 Tailscale 替代方案……不过你其实不必这么做,因为我们的 节点软件是开源的 ,而且我们还提供 灵活的免费方案 。 数据平面:WireGuard 我们的基础层是日益流行且优秀的开源 WireGuard 软件包(具体来说是用户空间 Go 版本 wireguard-go )。WireGuard 会在您的计算机、虚拟机或容器(WireGuard 称之为“端点”,我们称之为“节点”)与网络中的任何其他节点之间创建一组极其轻量级的加密隧道。 让我们理一下:大多数情况下,VPN 用户(包括 WireGuard 用户)会构建“星型”架构,其中每个客户端设备(例如您的笔记本电脑)都连接到中央“集中器”或 VPN 网关。 星型网络 / 中心辐射网络(hub-and-spoke networks) 这是配置 WireGuard 最简单的方法,因为网络中的每个节点都需要知道它想要直接连接的其他节点的公钥、公网 IP 地址和端口号。如果要完全连接 10 个节点,那么每个节点都需要知道 9 个对等节点,或者说 90 个独立的隧道端点。在星型网络中,你只需要一个中心枢纽节点(hub)和 9 个外围节点(通过“辐条”(spoke)连接它们),这要简单得多。枢纽节点通常具有静态 IP 地址,并在其防火墙上打开一个端口,以便所有人都能轻松找到它。然后,它可以接受来自其他 IP 地址节点的传入连接,即使这些节点本身位于防火墙之后,就像客户端-服务器互联网协议通常做的那样。 星型网络架构虽然效果不错,但也存在一些缺点。首先,大多数现代企业并没有一个固定的中心节点。它们通常拥有多个办公室、多个云数据中心、区域或虚拟专用网络 (VPC) 等等。在传统的 VPN 设置中,企业配置一个 VPN 集中器,然后在不同位置之间建立二级隧道(通常使用 IPsec)。因此,远程用户首先会到达 VPN 集中器,然后他们的流量会被转发到位于另一个位置的最终目的地。 这种传统方案难以扩展。首先,远程用户可能离 VPN 集中器很远,也可能很远;如果距离较远,连接延迟就会很高。其次,他们想要访问的数据中心可能也离 VPN 集中器很远;如果距离较远,同样会面临高延迟。想象一下这种情况:一位纽约的员工试图通过公司位于旧金山总部的 VPN hub 或 BeyondCorp 代理(Google 的零信任网络)连接到位于纽约的服务器。 ...

四月 15, 2026 · by NOSAE

tcpdump教程与示例 转载

tcpdump 是全球领先的网络分析工具——将强大功能与简洁性结合于一个命令行界面中。本指南将向您展示如何使用它。 tcpdump 是一款功能强大的命令行数据包分析工具。它允许您实时捕获并检查网络流量。对于网络管理员、安全专业人员以及任何需要理解网络行为的人来说,这个工具都是无价的。 在本教程中,我们将探讨 50 个使用 tcpdump 的实用示例。这些示例将涵盖广泛的使用场景,从基础流量捕获到高级过滤与分析。 基本语法 tcpdump 的基本语法如下: tcpdump [options] [expression] options:修改 tcpdump 的行为,例如指定要捕获的接口或输出格式。 expression:定义要捕获的流量类型。在这里您可以指定主机名、IP 地址、端口、协议以及其他条件。 在接口上捕获流量 要捕获某个特定接口上的所有流量,请使用 -i 标志并在其后指定接口名称。例如,要捕获 eth0 接口上的流量: tcpdump -i eth0 要查看所有可用接口的列表,请使用以下命令: tcpdump -D 捕获发往/来自特定主机的流量 要捕获发往或来自某个特定主机的流量,请使用 host 关键字并在其后指定主机名或 IP 地址: tcpdump host 192.168.1.100 这将捕获与 IP 地址为 192.168.1.100 的主机之间的所有流量。 在特定端口上捕获流量 要捕获某个特定端口上的流量,请使用 port 关键字并在其后指定端口号: tcpdump port 80 这将捕获端口 80(HTTP)上的所有流量。 组合过滤条件 您可以使用 and、or 和 not 运算符来组合过滤条件。例如,要捕获与主机 192.168.1.100 在端口 80 上的所有往返流量,请使用: tcpdump host 192.168.1.100 and port 80 要捕获来自 192.168.1.100 且端口为 80 或 443 的流量,请使用: ...

二月 20, 2026 · by NOSAE

iptables入门

基础概念 iptables 是 Linux 系统中一个防火墙管理工具,真正实现防火墙功能的是位于内核的 netfilter,我们配置了 iptables 规则后 Netfilter 通过这些规则来进行防火墙过滤等操作。防火墙工作在 OSI 中的第 4 层。它控制网络数据包的进出、转发和修改。 从图中可以看到,内核在 IP 协议栈的关键位置注册了若干 hook 点,每个 hook 都可以挂载规则链。数据包流经路径时,会依次经过这些 hook。 要理解 iptables,最重要的是掌握其 “四表五链” 的架构。 五链 链是在某个 hook 点执行的一组规则,链决定了在数据包传输的哪个阶段触发规则。 Linux 内核在 IP 协议栈关键位置定义了五个 hook,对应五个“内置链”: PREROUTING:数据包刚到达网卡,还未进行路由决策。 INPUT:数据包目的地是本机。 FORWARD:数据包只是路过本机,转发到其他地方。 OUTPUT:本机产生的数据包向外发送。 POSTROUTING:数据包即将离开网卡。 四表 表决定了对数据包进行什么类型的操作。主要的表有四个: Filter:负责放行或拦截,这是最常用的表。 NAT:负责地址转换。 Mangle:负责修改数据包,如修改 TTL、打标记。 Raw:负责配置豁免,用于跳过连接跟踪。 链与表的关系 并不是每一个“表”都存在于每一个“链”中。它们的关系就像是一张矩阵图,每个交叉点代表一个具体的处理时机。 链 (Chains) \ 表 (Tables) Raw Mangle Filter NAT PREROUTING ✅ ✅ ✅ INPUT ✅ ✅ FORWARD ✅ ✅ OUTPUT ✅ ✅ ✅ ✅ POSTROUTING ✅ ✅ 当一个数据包经过你的机器时,它会按以下顺序穿越这些表和链: ...

二月 18, 2026 · by NOSAE

K8S的HorizontalPodAutoscaler

介绍 K8S 的 HorizontalPodautoscaler(HPA)用于根据实际负载,动态地调整 workload 资源的 pod 数量,比如 Deployment、StatefulSet 等。 一个实际的例子可以参考:https://kubernetes.io/docs/tasks/run-application/horizontal-pod-autoscale-walkthrough/ HPA 的工作流程是: 找到目标 → 选出 Pod → 获取指标 → 求平均 → 算比例 → 推导副本数 找到目标 在 HPA 中设置 scaleTargetRef 用于找到目标对象: spec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: my-app 然后读取该对象的 .spec.selector,找出所有匹配的 pod。 因此我们也可以发现,HPA 并不是直接管理 Pod,而是通过 Deployment/StatefulSet 的 selector 间接管理。 获取指标 指标有三种来源: Pod 资源指标,比如内存、CPU Pod 自定义指标,比如每个 Pod QPS 外部指标,比如某个 Ingress 的总 QPS、kafka topic lag 计算副本数 计算每个目标 pod 的指标,比如 CPU 利用率 ...

二月 15, 2026 · by NOSAE