关于 NAT 网络访问的问题 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
ryuutanyou
V2EX    程序员

关于 NAT 网络访问的问题

  •  
  •   ryuutanyou 2023-09-12 11:29:46 +08:00 3098 次点击
    这是一个创建于 829 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近在做一些实验,在一个环境中有两个路由器和两台主机,连接方式如下图,过程中产生了几个问题,查询了一些资料 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  
       2023-09-12 11:40:27 +08:00
    问题 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  
       2023-09-12 11:41:32 +08:00
    你这图,根本看不懂啊。
    router NAT 和 router ,两个接口,怎么只有一个 IP
    ScepterZ
        3
    ScepterZ  
       2023-09-12 11:41:43 +08:00
    nat 的时候路由器会暂时记住这个转换,让回包的数据能传回来,玩一些游戏时常说的 nat 类型和这个有关,可以查查
    最严格的类型也会保证里边机器主动发起的 tcp 是双向能通的
    zpf124
        4
    zpf124  
       2023-09-12 11:41:44 +08:00
    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  
       2023-09-12 11:45:58 +08:00
    这个网络结构不应该上 NAT ,纯路由转发就行了。有了 IP 层的通信,才有 TCP 层的通信。
    kiracyan
        6
    kiracan  
       2023-09-12 11:49:46 +08:00
    加静态路由表就可以跨网段了
    ryuutanyou
        7
    ryuutanyou  
    OP
       2023-09-12 11:52:17 +08:00
    @lifekevin
    问题 1:但是机器 A 访问机器 B 的部署的网站时候,能返回响应,这是怎么做到的
    问题 2:我知道在路由器 192.168.5.1 上可以做端口转发,有没有方法不通过操作路由器,直接在机器 A 上能做到端口转发呢?
    ryuutanyou
        8
    ryuutanyou  
    OP
       2023-09-12 11:58:26 +08:00
    @zpf124

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

    问题 2:有没有办法在机器 A 做某些操作,能让路由器( 192.168.5.1 )穿透 NAT 呢?
    zpf124
        9
    zpf124  
       2023-09-12 12:12:31 +08:00
    @ryuutanyou

    2:没有,最少得 AB 都安装 VPN 软件(约等于新开一个路由器把 AB 连一起),或者路由 1 上开启 VPN 然后 A 连上(约等于把 A 接在了 1 路由上),以此来让 AB 都在同一个网段下。
    ranaanna
        10
    ranaanna  
       2023-09-12 13:36:50 +08:00
    OP 需要更准确地“查询一些资料”。那种“单向”的说法其实指的是 SNAT (source NAT),主要是通过 IP 伪装实现(问题 1 )。实际上还有 DNAT (destination NAT)实现问题 2 ,将特定的端口转发到内网的机器,很多路由器软件把这个叫做端口转发 (port forwarding) 或端口映射 (port mapping)。通信当然必须是双向的,但是流量的起源有 outbound 和 inbound 的区别。总之,广义来看,并不存在那个说法
    ranaanna
        11
    ranaanna  
       2023-09-12 13:54:13 +08:00
    @ryuutanyou #8 问题 1:是的。问题 2 问得不对,路由器就是一个 NAT 设备,怎么还需要“穿透 NAT”?真正的问题是不是:“有没有办法在机器 A 做某些操作”,能让机器 A 不需要 NAT 就能和机器 B 通信?如果是这样,那么 OP 需要去了解一下各种“隧道协议”以及“虚拟专用网”
    gogogo2000
        12
    gogogo2000  
       2023-09-12 14:25:10 +08:00   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
       2023-09-12 14:56:36 +08:00
    @gogogo2000 很清晰了,感谢
    cp19890714
        15
    cp19890714  
       2023-09-12 17:00:26 +08:00
    你对 NAT 有误解,我觉得你得先把 NAT 真正搞懂。
    1. A 能找到 B ,A 向 B 发送数据时,每一级都会进行 NAT 转换。B 响应时,只知道是 route 发过来的数据,所以把数据返回给 router ,router 只知道是 routeNAT 发送的数据,所以把数据返回给 routeNAT 。这样一级一级的 NAT 传递,最终把数据返回给 A
    2. route 中添加静态路由表,或者 routeNAT 为 A 做端口映射。具体方案其实我不确定,因为你这个图缺少信息。
    ryuutanyou
        16
    ryuutanyou  
    OP
       2023-09-12 17:25:00 +08:00
    ryuutanyou
        17
    ryuutanyou  
    OP
       2023-09-12 17:26:41 +08:00
    @cp19890714

    12 楼说的很清晰了,感谢
    ryuutanyou
        18
    ryuutanyou  
    OP
       2023-09-12 17:36:17 +08:00
    @ttvast
    @cp19890714

    两位说的缺少信息,我补了一下,是否还有缺少
    cp19890714
        19
    cp19890714  
       2023-09-12 18:07:30 +08:00
    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  
       2023-09-12 18:37:05 +08:00
    防火墙会记录 SNAT 的转换关系,在一定时间内,回来的包给放行进去。
    jsq2627
        21
    jsq2627  
       2023-09-12 21:41:10 +08:00 via iPhone   1
    问题 2:我知道在路由器 192.168.5.1 上可以做端口转发,有没有方法不通过操作路由器,直接在机器 A 上能做到端口转发呢?

    方法 1: 如果路由器支持 UPnP/IGD 或者 NAT-PMP ,那么机器 A 可以通过这两个协议向路由器申请建立一条“端口转发”。各类 PCDN/BT 软件一般都是这种方式。国内几乎家家路由器的 UPnP/IGD 映射表里都躺着爱奇艺的几个端口。
    方法 2: NAT 打洞技术。广泛用于各类实时音视频软件。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1021 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 26ms UTC 18:27 PVG 02:27 LAX 10:27 JFK 13:27
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86