V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
shermie
V2EX  ›  程序员

NAT 是如何将内网 IP 转换成外网 IP 的呢

  •  
  •   shermie · 2023-08-05 17:32:45 +08:00 · 2205 次点击
    这是一个创建于 480 天前的主题,其中的信息可能已经有所发展或是发生改变。

    就我目前知道的知识,当我访问一个网站 IP 的时候,数据会在网络中逐级路由出去,来源 IP 和端口会变化,目的 IP 和端口是固定的,最终会有一个网络识别出这个 IP 是属于自己的子网,将外网 IP 转内网 IP ,然后再将数据传递给某一个具体的网卡设备。

    我的疑问是: 数据是怎么知道数据该传递给上一级哪个路由,路由又是如何判断这个 IP 是否就是自己局域网中的某个 IP 呢,可能我说的不是很专业,比较迷。

    13 条回复    2023-08-09 09:23:45 +08:00
    msg7086
        1
    msg7086  
       2023-08-05 17:40:25 +08:00
    NAT 有映射表啊,发出去的包原路返回的时候查表找原始 IP 。
    yoa1q7y
        2
    yoa1q7y  
       2023-08-05 17:43:30 +08:00
    网关
    你把这个过程想象成快递分发就容易理解了
    从你居住的房屋或者小区开始,一级一级往上传递,到了目的地之后再一级一级往下传递,最终送到收件人手里
    busier
        3
    busier  
       2023-08-05 17:44:07 +08:00 via Android
    NAT 设备的内存里面有个动态的地址映射表,里面记录了源地址转换和出站端口的对应关系!
    返回的时候按照这个对应关系自然就知道怎么走了。
    thevita
        4
    thevita  
       2023-08-05 17:50:15 +08:00
    title 和 content 描述的没啥关系啊,

    路由的过程就是查表: 依据 packet dip 查找下一跳地址

    NAT 也是查表: 会 记录 intra ip, sport, dip, nat port 的对应关系,(表中项不一定,实现会不一样), 这样 回包的时候,就能找到 原来发包的 intra ip 和 sport
    adoal
        5
    adoal  
       2023-08-05 17:53:07 +08:00   ❤️ 4
    但凡怀着对专门领域知识的敬畏认真看完一本讲网络技术基础知识的书,而不是只凭社交网络上看到的碎片化知识点来猜测,就不会问出这个问题了。别说是 Richard Stevens 、Andrew Tanebaum 的大部头,哪怕是日本人户根勤写的《网络是怎样连接的》这样极其科普的小册子都行啊。
    cnbatch
        6
    cnbatch  
       2023-08-05 17:53:39 +08:00
    PC ↔ 网关(NAT) ↔ 互联网的各个路由器 ↔ 服务器

    简单来说,在这条链路当中,NAT 设备,也就是网关,会记录 内网 IP+端口 ↔ 外网 IP+外网端口 的映射关系,放在映射表内,每次进出只需要查表就知道该怎么转发了

    如果觉得描述太简单,还有更多的疑惑,那么不妨直接阅读当时 NAT 的 RFC:
    https://datatracker.ietf.org/doc/html/rfc2663
    cheng6563
        7
    cheng6563  
       2023-08-05 21:16:19 +08:00
    NAT ( Network Address Translation )网络地址转换
    从这个名字就能看出原理了吧。NAT 会把你的 IP 端口都转换掉然后记录一个映射表。
    lixiang2017
        8
    lixiang2017  
       2023-08-05 21:33:48 +08:00 via Android
    标题疑问跟内容疑问不是同一个。同意五楼,补下基础吧
    网络是分层的,要去理解每一层做了什么事
    mansurx
        9
    mansurx  
       2023-08-05 22:21:52 +08:00
    LZ 的疑问涉及几个概念,先说 NAT ,你说的场景仅仅是 SNAT ,也就是源地址 NAT ,将报文中 IP 头部的源 ip 转换为另一个地址。另外有 DNAT ,一般是在服务端的出口配置,将目的地址转换为一个内网地址。配置了 NAT 功能的设备会维护一张地址转换表,用于匹配后续的报文。

    “数据是怎么知道数据该传递给上一级哪个路由”:这个是路由表的概念,目的端会向邻居路由器发布自己拥有的网段路由。邻居再向它的邻居这样逐级发布,涉及一些动态路由协议计算最优路径、路由聚合等等。

    “路由又是如何判断这个 IP 是否就是自己局域网中的某个 IP 呢”:这个就是最近基本的 IP 地址概念,ip 通过掩码来区分网络位和主机位,路由器收到报文之后发现目标 ip 的网络位与当前路由器接口上网络位一致,就代表这个 ip 是这台路由器某个接口直连的,通过直连路由表就可以确认从哪个口转发出去。

    以上这几个概念现在有一个很好的学习方式就是找个类似 chatGPT 这样的工具,直接问就行,它能把所有的概念讲的明明白白。
    lxh1983
        10
    lxh1983  
       2023-08-06 01:35:02 +08:00 via iPhone   ❤️ 1
    我一直以为会上网的人都会用搜索引擎的呢
    ZRS
        11
    ZRS  
       2023-08-06 01:42:24 +08:00 via iPhone
    随便找本网络书籍,看看 NAT 相关章节就懂了
    TESTFLIGHT2021
        12
    TESTFLIGHT2021  
       2023-08-06 15:10:17 +08:00
    路由器把源地址和端口替换成 WAN 地址和新开端口,同时记住被替换地址和端口
    返回的数据包,他把目的 IP 和端口换成内网的那个地址和端口
    shermie
        13
    shermie  
    OP
       2023-08-09 09:23:45 +08:00
    @adoal 说的很有道理 没有认真看书
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1029 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 20:08 · PVG 04:08 · LAX 12:08 · JFK 15:08
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.