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

关于 NAT 网络访问的问题

  •  
  •   ryuutanyou · 228 天前 · 2227 次点击
    这是一个创建于 228 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近在做一些实验,在一个环境中有两个路由器和两台主机,连接方式如下图,过程中产生了几个问题,查询了一些资料 NAT 转换过程是单向的,下层网主动访问上层网时会转换为上层 IP,而上层网访问下层网 IP 时无法转换。

    按照这个说法

    1. 机器 A 可以 ping 通机器 B
    2. 机器 B 不能 ping 通 A 机器
    3. 机器 A 可以访问到 192.168.100:4000
    4. 机器 B 不能访问 192.168.5.100:5000

    问题 1:但是机器 A 访问机器 B 网站时候,通信不也是双向的么,机器 B 需要返回响应给机器 A 的浏览器,那么就说明机器 B 在回传消息时候是能找到机器 A ,但是这个现象又和上述的 2 和 4 相悖,这种原因是什么?

    问题 2:如果想让机器 B 能正常访问或者 ping 通机器 A ,在只操作机器 A 的情况下,有什么办法么?类似于问题 1 中描述的,机器 B 回传响应的方式,这种方式如何在 A 机器上实现。

    img

    21 条回复    2023-09-12 21:41:10 +08:00
    lifekevin
        1
    lifekevin  
       228 天前
    问题 1:在 NAT 之后,机器 B 就不再与机器 A 通信了,而是与 Router NAT 进行通信,所以机器 B 不知道有机器 A 也访问不到机器 A ;
    问题 2:做了 NAT 之后,想要访问 NAT 里面的机器,可以使用端口映射的方式,把机器 A 的 5000 端口映射到 Router NAT 的 5000 端口,映射之后,访问 192.168.5.1:5000 ,Router NAT 会把访问请求发送给机器 A 的 192.168.5.100:5000 ,这样就可以让机器 B 访问到 192.168.5.100:5000
    ttvast
        2
    ttvast  
       228 天前
    你这图,根本看不懂啊。
    router NAT 和 router ,两个接口,怎么只有一个 IP
    ScepterZ
        3
    ScepterZ  
       228 天前
    nat 的时候路由器会暂时记住这个转换,让回包的数据能传回来,玩一些游戏时常说的 nat 类型和这个有关,可以查查
    最严格的类型也会保证里边机器主动发起的 tcp 是双向能通的
    zpf124
        4
    zpf124  
       228 天前
    1 ,A 访问 B 时,发送 源 A:port1 -> 目标 B:4000, 路由 5 收到后转发时修改为 源 路由 5:portxxxx -> 目标 B:4000 , 同时记录映射关系,即 路由 5:portxxxx -> 目标 B:4000 实际源为 源 A:port1 -> 目标 B:4000; B 收到请求实际与 路由 5 建立通讯,5 再收到地址后再转发给 A 。

    2 、在 路由 1 上添加静态路由表,路由对于查不到的 ip 会转发到 wan 由上一层路由去处理,而你需要配置一个路由告诉他收到某个 5 的 ip 段时不发送到 wan 口,而是发送到与路由 5 连接的那个 lan 口。
    cpstar
        5
    cpstar  
       228 天前
    这个网络结构不应该上 NAT ,纯路由转发就行了。有了 IP 层的通信,才有 TCP 层的通信。
    kiracyan
        6
    kiracyan  
       228 天前
    加静态路由表就可以跨网段了
    ryuutanyou
        7
    ryuutanyou  
    OP
       228 天前
    @lifekevin
    问题 1:但是机器 A 访问机器 B 的部署的网站时候,能返回响应,这是怎么做到的
    问题 2:我知道在路由器 192.168.5.1 上可以做端口转发,有没有方法不通过操作路由器,直接在机器 A 上能做到端口转发呢?
    ryuutanyou
        8
    ryuutanyou  
    OP
       228 天前
    @zpf124

    问题 1:也就是说和 @ScepterZ 说的类似,在这单次请求的中,机器 A 访问机器 B 的时候,在路由器( 192.168.5.1 )上,临时记录了映射关系,所以能返回响应数据,一旦这个请求和响应完成之后,这个映射关系也就不在了吧。

    问题 2:有没有办法在机器 A 做某些操作,能让路由器( 192.168.5.1 )穿透 NAT 呢?
    zpf124
        9
    zpf124  
       228 天前
    @ryuutanyou

    2:没有,最少得 AB 都安装 VPN 软件(约等于新开一个路由器把 AB 连一起),或者路由 1 上开启 VPN 然后 A 连上(约等于把 A 接在了 1 路由上),以此来让 AB 都在同一个网段下。
    ranaanna
        10
    ranaanna  
       228 天前
    OP 需要更准确地“查询一些资料”。那种“单向”的说法其实指的是 SNAT (source NAT),主要是通过 IP 伪装实现(问题 1 )。实际上还有 DNAT (destination NAT)实现问题 2 ,将特定的端口转发到内网的机器,很多路由器软件把这个叫做端口转发 (port forwarding) 或端口映射 (port mapping)。通信当然必须是双向的,但是流量的起源有 outbound 和 inbound 的区别。总之,广义来看,并不存在那个说法
    ranaanna
        11
    ranaanna  
       228 天前
    @ryuutanyou #8 问题 1:是的。问题 2 问得不对,路由器就是一个 NAT 设备,怎么还需要“穿透 NAT”?真正的问题是不是:“有没有办法在机器 A 做某些操作”,能让机器 A 不需要 NAT 就能和机器 B 通信?如果是这样,那么 OP 需要去了解一下各种“隧道协议”以及“虚拟专用网”
    gogogo2000
        12
    gogogo2000  
       228 天前   ❤️ 1
    如#10 所述,OP 说的一般是指 SNAT ,在 A 访问 B 时,路由( R )将 A 的地址伪装成路由本身再继续传递。
    在 B 看来,其实是路由 R 在访问它,B 将响应信息发还给 R ,由于 TCP 是有状态的连接,路由 R 在执行 SNAT 时就记录了状态,因此路由 R 可以知道 B 的响应应该返还给 A ,所以 B 和 A 就通信了。

    当 B 想要主动和 A 通信时,由于没有静态路由,B 无法直接跨子网发送消息给 A ,路由 R 中也不存在已存在的映射关系,自然就无法通信了。

    当使用 UDP 或 ping 等无状态协议时,路由器无法通过连接来判断报文的映射关系,所以通常会启动一个临时映射表,并给予一个超时。若 A 发给 B 后,B 不能在指定时间内响应,这个映射就会被取消,这时候 B 再响应 A 也收不到了。
    ryuutanyou
        13
    ryuutanyou  
    OP
       228 天前
    @gogogo2000 很清晰了,感谢
    cp19890714
        15
    cp19890714  
       228 天前
    你对 NAT 有误解,我觉得你得先把 NAT 真正搞懂。
    1. A 能找到 B ,A 向 B 发送数据时,每一级都会进行 NAT 转换。B 响应时,只知道是 route 发过来的数据,所以把数据返回给 router ,router 只知道是 routeNAT 发送的数据,所以把数据返回给 routeNAT 。这样一级一级的 NAT 传递,最终把数据返回给 A
    2. route 中添加静态路由表,或者 routeNAT 为 A 做端口映射。具体方案其实我不确定,因为你这个图缺少信息。
    ryuutanyou
        16
    ryuutanyou  
    OP
       228 天前
    ryuutanyou
        17
    ryuutanyou  
    OP
       228 天前
    @cp19890714

    12 楼说的很清晰了,感谢
    ryuutanyou
        18
    ryuutanyou  
    OP
       228 天前
    @ttvast
    @cp19890714

    两位说的缺少信息,我补了一下,是否还有缺少
    cp19890714
        19
    cp19890714  
       228 天前
    B 想要访问 A ,有两个方案
    1. 在 routeNAT 添加端口映射,192.168.1.30:5000 映射到 192.168.5.100:5000. B 访问 192.168.1.30:5000 即可
    2. 在 router 或者 B 中添加静态路由 route add -net 192.168.5.0/24 netmask 255.255.255.0 gw 192.168.1.30
    adoal
        20
    adoal  
       228 天前
    防火墙会记录 SNAT 的转换关系,在一定时间内,回来的包给放行进去。
    jsq2627
        21
    jsq2627  
       227 天前 via iPhone   ❤️ 1
    问题 2:我知道在路由器 192.168.5.1 上可以做端口转发,有没有方法不通过操作路由器,直接在机器 A 上能做到端口转发呢?

    方法 1: 如果路由器支持 UPnP/IGD 或者 NAT-PMP ,那么机器 A 可以通过这两个协议向路由器申请建立一条“端口转发”。各类 PCDN/BT 软件一般都是这种方式。国内几乎家家路由器的 UPnP/IGD 映射表里都躺着爱奇艺的几个端口。
    方法 2: NAT 打洞技术。广泛用于各类实时音视频软件。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3027 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 13:40 · PVG 21:40 · LAX 06:40 · JFK 09:40
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.