关于 NAT 网络访问的问题

2023-09-12 11:29:46 +08:00
 ryuutanyou

最近在做一些实验,在一个环境中有两个路由器和两台主机,连接方式如下图,过程中产生了几个问题,查询了一些资料 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 机器上实现。

2505 次点击
所在节点    程序员
21 条回复
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
2023-09-12 11:41:32 +08:00
你这图,根本看不懂啊。
router NAT 和 router ,两个接口,怎么只有一个 IP
ScepterZ
2023-09-12 11:41:43 +08:00
nat 的时候路由器会暂时记住这个转换,让回包的数据能传回来,玩一些游戏时常说的 nat 类型和这个有关,可以查查
最严格的类型也会保证里边机器主动发起的 tcp 是双向能通的
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
2023-09-12 11:45:58 +08:00
这个网络结构不应该上 NAT ,纯路由转发就行了。有了 IP 层的通信,才有 TCP 层的通信。
kiracyan
2023-09-12 11:49:46 +08:00
加静态路由表就可以跨网段了
ryuutanyou
2023-09-12 11:52:17 +08:00
@lifekevin
问题 1:但是机器 A 访问机器 B 的部署的网站时候,能返回响应,这是怎么做到的
问题 2:我知道在路由器 192.168.5.1 上可以做端口转发,有没有方法不通过操作路由器,直接在机器 A 上能做到端口转发呢?
ryuutanyou
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
2023-09-12 12:12:31 +08:00
@ryuutanyou

2:没有,最少得 AB 都安装 VPN 软件(约等于新开一个路由器把 AB 连一起),或者路由 1 上开启 VPN 然后 A 连上(约等于把 A 接在了 1 路由上),以此来让 AB 都在同一个网段下。
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
2023-09-12 13:54:13 +08:00
@ryuutanyou #8 问题 1:是的。问题 2 问得不对,路由器就是一个 NAT 设备,怎么还需要“穿透 NAT”?真正的问题是不是:“有没有办法在机器 A 做某些操作”,能让机器 A 不需要 NAT 就能和机器 B 通信?如果是这样,那么 OP 需要去了解一下各种“隧道协议”以及“虚拟专用网”
gogogo2000
2023-09-12 14:25:10 +08:00
如#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
2023-09-12 14:56:36 +08:00
@gogogo2000 很清晰了,感谢
droppedbytech
2023-09-12 16:49:23 +08:00
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
2023-09-12 17:25:00 +08:00
ryuutanyou
2023-09-12 17:26:41 +08:00
@cp19890714

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

两位说的缺少信息,我补了一下,是否还有缺少
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
2023-09-12 18:37:05 +08:00
防火墙会记录 SNAT 的转换关系,在一定时间内,回来的包给放行进去。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/972980

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX