• 请不要在回答技术问题时复制粘贴 AI 生成的内容
shermie
V2EX  ›  程序员

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

  •  
  •   shermie · Aug 5, 2023 · 2916 views
    This topic created in 1022 days ago, the information mentioned may be changed or developed.

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

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

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

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

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

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

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

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

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

    以上这几个概念现在有一个很好的学习方式就是找个类似 chatGPT 这样的工具,直接问就行,它能把所有的概念讲的明明白白。
    Od37v61n5s89gXx8
        10
    Od37v61n5s89gXx8  
       Aug 6, 2023 via iPhone   ❤️ 1
    我一直以为会上网的人都会用搜索引擎的呢
    ZRS
        11
    ZRS  
       Aug 6, 2023 via iPhone
    随便找本网络书籍,看看 NAT 相关章节就懂了
    TESTFLIGHT2021
        12
    TESTFLIGHT2021  
       Aug 6, 2023
    路由器把源地址和端口替换成 WAN 地址和新开端口,同时记住被替换地址和端口
    返回的数据包,他把目的 IP 和端口换成内网的那个地址和端口
    shermie
        13
    shermie  
    OP
       Aug 9, 2023
    @adoal 说的很有道理 没有认真看书
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   2888 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 102ms · UTC 02:45 · PVG 10:45 · LAX 19:45 · JFK 22:45
    ♥ Do have faith in what you're doing.