最近在做一些实验,在一个环境中有两个路由器和两台主机,连接方式如下图,过程中产生了几个问题,查询了一些资料 NAT 转换过程是单向的,下层网主动访问上层网时会转换为上层 IP,而上层网访问下层网 IP 时无法转换。
按照这个说法
问题 1:但是机器 A 访问机器 B 网站时候,通信不也是双向的么,机器 B 需要返回响应给机器 A 的浏览器,那么就说明机器 B 在回传消息时候是能找到机器 A ,但是这个现象又和上述的 2 和 4 相悖,这种原因是什么?
问题 2:如果想让机器 B 能正常访问或者 ping 通机器 A ,在只操作机器 A 的情况下,有什么办法么?类似于问题 1 中描述的,机器 B 回传响应的方式,这种方式如何在 A 机器上实现。
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 |
2
ttvast 2023-09-12 11:41:32 +08:00
你这图,根本看不懂啊。
router NAT 和 router ,两个接口,怎么只有一个 IP |
3
ScepterZ 2023-09-12 11:41:43 +08:00
nat 的时候路由器会暂时记住这个转换,让回包的数据能传回来,玩一些游戏时常说的 nat 类型和这个有关,可以查查
最严格的类型也会保证里边机器主动发起的 tcp 是双向能通的 |
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 口。 |
5
cpstar 2023-09-12 11:45:58 +08:00
这个网络结构不应该上 NAT ,纯路由转发就行了。有了 IP 层的通信,才有 TCP 层的通信。
|
6
kiracyan 2023-09-12 11:49:46 +08:00
加静态路由表就可以跨网段了
|
7
ryuutanyou OP @lifekevin
问题 1:但是机器 A 访问机器 B 的部署的网站时候,能返回响应,这是怎么做到的 问题 2:我知道在路由器 192.168.5.1 上可以做端口转发,有没有方法不通过操作路由器,直接在机器 A 上能做到端口转发呢? |
8
ryuutanyou OP |
9
zpf124 2023-09-12 12:12:31 +08:00
@ryuutanyou
2:没有,最少得 AB 都安装 VPN 软件(约等于新开一个路由器把 AB 连一起),或者路由 1 上开启 VPN 然后 A 连上(约等于把 A 接在了 1 路由上),以此来让 AB 都在同一个网段下。 |
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 的区别。总之,广义来看,并不存在那个说法
|
11
ranaanna 2023-09-12 13:54:13 +08:00
@ryuutanyou #8 问题 1:是的。问题 2 问得不对,路由器就是一个 NAT 设备,怎么还需要“穿透 NAT”?真正的问题是不是:“有没有办法在机器 A 做某些操作”,能让机器 A 不需要 NAT 就能和机器 B 通信?如果是这样,那么 OP 需要去了解一下各种“隧道协议”以及“虚拟专用网”
|
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 也收不到了。 |
13
ryuutanyou OP @gogogo2000 很清晰了,感谢
|
14
droppedbytech 2023-09-12 16:49:23 +08:00 1
|
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 做端口映射。具体方案其实我不确定,因为你这个图缺少信息。 |
16
ryuutanyou OP @droppedbytech 感谢
|
17
ryuutanyou OP |
18
ryuutanyou OP |
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 |
20
adoal 2023-09-12 18:37:05 +08:00
防火墙会记录 SNAT 的转换关系,在一定时间内,回来的包给放行进去。
|
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 打洞技术。广泛用于各类实时音视频软件。 |