<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>Nat on JokemeBlog</title>
        <link>/tags/nat/</link>
        <description>Recent content in Nat on JokemeBlog</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>zh-cn</language>
        <lastBuildDate>Wed, 15 Jul 2020 22:53:18 +0000</lastBuildDate><atom:link href="/tags/nat/index.xml" rel="self" type="application/rss+xml" /><item>
            <title>简单解释 NAT</title>
            <link>/p/learn_nat/</link>
            <pubDate>Wed, 15 Jul 2020 22:53:18 +0000</pubDate>
            <guid>/p/learn_nat/</guid>
            <description>&lt;img src=&#34;https://cn.bing.com/th?id=OHR.OceanHeart_EN-CN3106304306_UHD.jpg&amp;pid=hp&amp;w=1080&amp;h=720&amp;rs=1&amp;c=4&#34; alt=&#34;Featured image of post 简单解释 NAT&#34; /&gt;&lt;h1 id=&#34;简单解释-nat转自知乎&#34;&gt;简单解释 NAT[转自知乎]&#xA;&lt;/h1&gt;&lt;p&gt;NAT 大家应该十分熟悉了，它分为几种。一种就叫做 NAT，它只对 IP 地址进行转换；另一种叫做 NAPT（Network Address/Port Translation），它可以对整个会话的端点（由 IP 地址和端口号组成）做转换，这是一种更加常见的 NAT 变种。&lt;/p&gt;&#xA;&lt;p&gt;当然了，NAPT 也分为许多种，我们这里就不深入探讨了，大家如果有兴趣可以查阅相关的文献。&lt;/p&gt;&#xA;&lt;p&gt;下面就简单介绍一下 NAT 的工作原理：&lt;/p&gt;&#xA;&lt;p&gt;&lt;img alt=&#34;img&#34; class=&#34;gallery-image&#34; data-flex-basis=&#34;467px&#34; data-flex-grow=&#34;194&#34; height=&#34;370&#34; loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://pic4.zhimg.com/80/v2-62cb7ac6f3ef6272314dfe0a822b35a3_720w.jpg&#34; width=&#34;720&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;首先，NAT A 网下的设备 1（192.168.1.101）想与某公网 IP 通讯，设备 1 将包发给 NAT A，然后 NAT A 对源 IP 进行转换发给 NAT B（中间可能还会经过多重 NAT）。&lt;/p&gt;&#xA;&lt;p&gt;这样做的目的是，NAT B 并不知晓 NAT A 下的各个设备，他只能与 NAT A 本身通讯，因此发送给 NAT B 的包源 IP 必须是 NAT A 的公网 IP，不然 NAT B 没有办法进行回复。&lt;/p&gt;&#xA;&lt;p&gt;接下来 NAT B 将回复包再发回 NAT A，此时就是 NAT 发挥作用的时候了，NAT A 现在要做的就是将包再分发回之前的设备，如何确定要发给谁呢？NAT 中记录了一张表，之前 192.168.1.101 通过 2333 端口与 42.120.241.46 端口 443 通讯了，并且 NAT A 是用 60001 的端口转发出去的，那么这次接受到发往该 NAT 60001 端口的包时就应该再通过 2333 端口转发给 192.168.1.101。经过这样的过程，NAT A 下的设备都可以连接到互联网了！&lt;/p&gt;&#xA;&lt;h2 id=&#34;udp-打洞原理及过程&#34;&gt;UDP 打洞原理及过程&#xA;&lt;/h2&gt;&lt;p&gt;如上图所示，由于 NAT 的存在，当 NAT A 的设备 1 想与 NAT B 下的设备通讯时，必然要将目标 IP 设置为 NAT B 的公网地址，而 NAT B 转发表中并没有记录过 NAT A 与自身网络下设备的通讯记录，因此 NAT B 会将包丢掉。&lt;/p&gt;&#xA;&lt;p&gt;下面我们来看看 UDP 打洞是怎么解决这个问题的。&lt;/p&gt;&#xA;&lt;p&gt;&lt;img alt=&#34;img&#34; class=&#34;gallery-image&#34; data-flex-basis=&#34;336px&#34; data-flex-grow=&#34;140&#34; height=&#34;513&#34; loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://pic4.zhimg.com/80/v2-52767d1e9ac42d6416025fc5080016d7_720w.jpg&#34; width=&#34;720&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;为了能够进行 UDP 打洞，我们需要一台公网的服务器作为中转站，它是 NAT A 与 NAT B 之间的信使。&lt;/p&gt;&#xA;&lt;p&gt;（为了方便起见，我们把地址为 192.168.1.101 的设备称为设备 1，把地址为 192.168.1.2 的设备称为设备 2，信使服务器称为 S）&lt;/p&gt;&#xA;&lt;p&gt;首先，设备 1 和设备 2 都向 S 注册自己，S 中能记录各个设备此时使用的公网 IP 地址和端口号，例如设备 1 是 123.122.53.20:31000，设备 2 是 42.120.241.46:41000。&lt;/p&gt;&#xA;&lt;p&gt;然后设备 1 与设备 2 都向 S 获取对方的公网 IP 与之前预留的端口号，就像这样：&lt;/p&gt;&#xA;&lt;p&gt;&lt;img alt=&#34;img&#34; class=&#34;gallery-image&#34; data-flex-basis=&#34;332px&#34; data-flex-grow=&#34;138&#34; height=&#34;519&#34; loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://pic4.zhimg.com/80/v2-6e2bb16c9c7c4a7ad9e1807a8648e02f_720w.jpg&#34; width=&#34;720&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;然后就是最关键的一步，打洞。&lt;/p&gt;&#xA;&lt;p&gt;设备 1 向 42.120.241.46:41000 发一个包，NAT B 自然能接收到这个包，然而它不知道来自 NAT A 的包应该发给谁，因此 NAT B 将这个包舍弃。但是由于设备 1 向 42.120.241.46:41000 发过包，NAT A 会记录：&lt;strong&gt;以后来自 42.120.241.46:41000 的包都发给设备 1&lt;/strong&gt;。&lt;/p&gt;&#xA;&lt;p&gt;设备 2 也做相同的操作，让 NAT B 也知道：&lt;strong&gt;以后来自 123.122.53.20:31000 的包都发给设备 2&lt;/strong&gt;。&lt;/p&gt;&#xA;&lt;p&gt;至此，NAT A 与 NAT B 都互相为对方保留了端口，就可以愉快地通讯了。&lt;/p&gt;&#xA;&lt;p&gt;本文 &lt;del&gt;参考&lt;/del&gt; 抄袭自知乎文章 &lt;a class=&#34;link&#34; href=&#34;https://zhuanlan.zhihu.com/p/40816201&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;简单解释 NAT&lt;/a&gt;&lt;/p&gt;&#xA;</description>
        </item></channel>
</rss>
