公网IP设置端口转发之后的一些问题

41次阅读

共计 5873 个字符,预计需要花费 15 分钟才能阅读完成。

在家庭宽带内网访问 公网 ip: 端口 无法访问
但是手机用 4g 访问 公网 ip: 端口 就可以
各位大佬这是为什么呀

https://www.cxyzjd.com/article/a595364628/51657345
回流是什么?最简单的一个实例:
网吧内网一台主机 192.168.0.2 建了个 WEB 服务站点端口 80,然后在网关 (其内网地址是 192.168.0.1、公网地址为 218.4.218.4) 上映射 80 端口到 192.168.0.2 的 80 端口,这样 INTERNET 上就能以 http://218.4.218.4:80 的地址访问到 192.168.0.2 的 WEB 站点了。
然后出现了个问题,在同网吧的另一台电脑 192.168.0.3 上,键入 http://218.4.218.4:80,却无法访问该 WEB 站点。
就这个现象,我们就称之为“不支持回流”了,这里指的是网关上的映射方式不支持回流,所以说“回流”一说,是针对映射方式而言的。
现在我们来看常规情况下,是为什么会发生这种情况的
我以前对 iptables 特别感兴趣的时候,曾对这个问题非常迷惑不解,直到去年为了考试,学习网络基础的时候才搞明白这个事情
 
过程如下:
192.168.0.3 要请求访问 218.4.218.4 的 80 端口,根据它掌握的路由表,它本身是不知道电脑 218.4.218.4 在哪里的,所以把将这个数据包发送给它的默认路由,即电脑 192.168.0.1。
注意:这个数据包的源地址是 192.168.0.3、源端口假设是 1025、目标地址是 218.4.218.4、目标端口是 80、SYN 标志位为 1、这是建立 TCP 连接的第一次握手。
 
如果“把目标地址为 218.4.218.4 的数据包发给了 192.168.0.1”你听起来觉得有点矛盾,那么我解释一下:其实这个数据包的目标 IP 地址是 218.4.218.4,目标 MAC 地址却是 192.168.0.1 的
 
 
电脑 192.168.0.1 接收到了这份数据包 (因为它的身份是路由器,所以允许接收和转发目标地址不是自已、MAC 地址却是自已接口 MAC 地址的数据包),它分析这个数据包的目标地址,发现这个数据包是需要中转到电脑 192.168.0.2:80 去的,于是它把这个数据包转发给了电脑 192.168.0.2:80。
注意:这个数据包的源地址是 192.168.0.3、源端口是 1025、目标地址为 192.168.0.2、目标端口为 80、SYN 标志位为 1。我们要注意这个数据包在转发后发生了变化了,即目标地址变了。
电脑 192.168.0.2 顺利接到了数据包,它马上作出回应,发送一个数据包给电脑 192.168.0.3。
注意:这个数据包的源地址是 192.168.0.2、源端口是 80、目标地址 192.168.0.3、目标端口为 1025、SYN 标志位为 1、ACK 标志位为 1、这是建立 TCP 连接的第二次握手。
电脑 192.168.0.3 顺利接到了数据包,然而它发现这是一个来自 192.168.0.2:80 的回应,因为 ACK 标志位值为 1 摆在那里呢。它想不起来什么时候给 192.168.0.2:80 这个目标对象发送过 SYN 请求,它认为这是一个错误的数据包,于是决定把这个数据包丢弃。然后继续等待 218.4.218.4:80 的回应,一直等到超时。
而电脑 192.168.0.2 这边,它等 192.168.0.3:1025 的第三次握手请求包发送过来,以便建立一个 TCP 的连接。同样也没有结果,一直等到超时。三次握手在规定的时间内没有完成,访问宣布流产了。
那么怎么样才能正常访问呢?也就是说怎么样形成“回流”呢?
玄机在于电脑 192.168.0.1 把第一次握手的那个数据包在转发时,不仅要修改目标地址和端口,也要修改源地址和端口,我们来看一下情况会有什么不同:
电脑 192.168.0.1 接收到了这份数据包 (因为它的身份是路由器,所以允许接收和转发目标 IP 地址不是自已、MAC 地址却是自已接口 MAC 地址的数据包),它分析这个数据包的目标地址,发现这个数据包是需要中转到电脑 192.168.0.2:80 去的,于是它把这个数据包通过自已的 5201 端口转发给了电脑 192.168.0.2:80,并在内存里面记录下来了,192.168.0.1:5201 已定位给了 192.168.0.3:1025。
注意:这个数据包的源地址是 192.168.0.1、源端口是 5201、目标地址为 192.168.0.2、目标端口为 80、SYN 标志位为 1。
电脑 192.168.0.2 顺利接到了数据包,它马上作出回应,发送一个数据包给电脑 192.168.0.1。
注意:这个数据包的源地址是 192.168.0.2、源端口是 80、目标地址 192.168.0.1、目标端口为 5201、SYN 标志位为 1、ACK 标志位为 1、这是建立 TCP 连接的第二次握手。
电脑 192.168.0.1 顺利接到了数据包,检查内存记录发现,这个数据包真正的收货人是 192.168.0.3:1025,于是它把这个数据包转发给 192.168.0.3。
注意:这个数据包的的源地址是 218.4.218.4、源端口为 80、目标地址为 192.168.0.3、目标端口为 1025。我们要注意这个数据包在转发后发生变化了,即源地址变了。这很重要!为什么会变,因为在它心目当中,192.168.0.2:80 早已定位给了 218.4.218.4:80,映射规则使然。
电脑 192.168.0.3 顺利接到了数据包,发现期待已久的 218.4.218.4:80 终于有了回音,它兴奋不已的发出第三次的握手请求。
注意:这个数据包的源地址是 192.168.0.3、源端口是 1025、目标地址是 218.4.218.4、目标端口是 80、ACK 标志位为 1、这是建立 TCP 连接的第三次握手。
跟前面的数据包一样,这个数据包会从 192.168.0.1 那里中转给 192.168.0.2
 
以后 192.168.0.2:80 和 192.168.0.3:1025 之间来往通信的数据包,全部由 192.168.0.1 负责中转,“回流”构成了 upup 让大佬看到关键词:回流公网 IP 设置端口转发之后的一些问题关键词:内网环回老问题。换 DMZ 在路由器上配内网环回,可以百度一下,就是一个选项你都公网了,内网访问也用域名:端口

IDC888 发表于 2022-12-14 20:51
老问题。换 DMZ

DMZ 设置了,没有用呀域名解析到内网服务器上,用域名访问内网访问时去掉端口 NAT 回流 https://hostloc.com/forum.php?mod=viewthread&tid=1070772
和我这个问题一样,最后不得不加了个 openwrt 路由器做二级路由解决了 https://www.cxyzjd.com/article/a595364628/51657345
回流是什么?最简单的一个实例:
网吧内网一台主机 192.168.0.2 建了个 WEB 服务站点端口 80,然后在网关 (其内网地址是 192.168.0.1、公网地址为 218.4.218.4) 上映射 80 端口到 192.168.0.2 的 80 端口,这样 INTERNET 上就能以 http://218.4.218.4:80 的地址访问到 192.168.0.2 的 WEB 站点了。
然后出现了个问题,在同网吧的另一台电脑 192.168.0.3 上,键入 http://218.4.218.4:80,却无法访问该 WEB 站点。
就这个现象,我们就称之为“不支持回流”了,这里指的是网关上的映射方式不支持回流,所以说“回流”一说,是针对映射方式而言的。
现在我们来看常规情况下,是为什么会发生这种情况的
我以前对 iptables 特别感兴趣的时候,曾对这个问题非常迷惑不解,直到去年为了考试,学习网络基础的时候才搞明白这个事情
 
过程如下:
192.168.0.3 要请求访问 218.4.218.4 的 80 端口,根据它掌握的路由表,它本身是不知道电脑 218.4.218.4 在哪里的,所以把将这个数据包发送给它的默认路由,即电脑 192.168.0.1。
注意:这个数据包的源地址是 192.168.0.3、源端口假设是 1025、目标地址是 218.4.218.4、目标端口是 80、SYN 标志位为 1、这是建立 TCP 连接的第一次握手。
 
如果“把目标地址为 218.4.218.4 的数据包发给了 192.168.0.1”你听起来觉得有点矛盾,那么我解释一下:其实这个数据包的目标 IP 地址是 218.4.218.4,目标 MAC 地址却是 192.168.0.1 的
 
 
电脑 192.168.0.1 接收到了这份数据包 (因为它的身份是路由器,所以允许接收和转发目标地址不是自已、MAC 地址却是自已接口 MAC 地址的数据包),它分析这个数据包的目标地址,发现这个数据包是需要中转到电脑 192.168.0.2:80 去的,于是它把这个数据包转发给了电脑 192.168.0.2:80。
注意:这个数据包的源地址是 192.168.0.3、源端口是 1025、目标地址为 192.168.0.2、目标端口为 80、SYN 标志位为 1。我们要注意这个数据包在转发后发生了变化了,即目标地址变了。
电脑 192.168.0.2 顺利接到了数据包,它马上作出回应,发送一个数据包给电脑 192.168.0.3。
注意:这个数据包的源地址是 192.168.0.2、源端口是 80、目标地址 192.168.0.3、目标端口为 1025、SYN 标志位为 1、ACK 标志位为 1、这是建立 TCP 连接的第二次握手。
电脑 192.168.0.3 顺利接到了数据包,然而它发现这是一个来自 192.168.0.2:80 的回应,因为 ACK 标志位值为 1 摆在那里呢。它想不起来什么时候给 192.168.0.2:80 这个目标对象发送过 SYN 请求,它认为这是一个错误的数据包,于是决定把这个数据包丢弃。然后继续等待 218.4.218.4:80 的回应,一直等到超时。
而电脑 192.168.0.2 这边,它等 192.168.0.3:1025 的第三次握手请求包发送过来,以便建立一个 TCP 的连接。同样也没有结果,一直等到超时。三次握手在规定的时间内没有完成,访问宣布流产了。
那么怎么样才能正常访问呢?也就是说怎么样形成“回流”呢?
玄机在于电脑 192.168.0.1 把第一次握手的那个数据包在转发时,不仅要修改目标地址和端口,也要修改源地址和端口,我们来看一下情况会有什么不同:
电脑 192.168.0.1 接收到了这份数据包 (因为它的身份是路由器,所以允许接收和转发目标 IP 地址不是自已、MAC 地址却是自已接口 MAC 地址的数据包),它分析这个数据包的目标地址,发现这个数据包是需要中转到电脑 192.168.0.2:80 去的,于是它把这个数据包通过自已的 5201 端口转发给了电脑 192.168.0.2:80,并在内存里面记录下来了,192.168.0.1:5201 已定位给了 192.168.0.3:1025。
注意:这个数据包的源地址是 192.168.0.1、源端口是 5201、目标地址为 192.168.0.2、目标端口为 80、SYN 标志位为 1。
电脑 192.168.0.2 顺利接到了数据包,它马上作出回应,发送一个数据包给电脑 192.168.0.1。
注意:这个数据包的源地址是 192.168.0.2、源端口是 80、目标地址 192.168.0.1、目标端口为 5201、SYN 标志位为 1、ACK 标志位为 1、这是建立 TCP 连接的第二次握手。
电脑 192.168.0.1 顺利接到了数据包,检查内存记录发现,这个数据包真正的收货人是 192.168.0.3:1025,于是它把这个数据包转发给 192.168.0.3。
注意:这个数据包的的源地址是 218.4.218.4、源端口为 80、目标地址为 192.168.0.3、目标端口为 1025。我们要注意这个数据包在转发后发生变化了,即源地址变了。这很重要!为什么会变,因为在它心目当中,192.168.0.2:80 早已定位给了 218.4.218.4:80,映射规则使然。
电脑 192.168.0.3 顺利接到了数据包,发现期待已久的 218.4.218.4:80 终于有了回音,它兴奋不已的发出第三次的握手请求。
注意:这个数据包的源地址是 192.168.0.3、源端口是 1025、目标地址是 218.4.218.4、目标端口是 80、ACK 标志位为 1、这是建立 TCP 连接的第三次握手。
跟前面的数据包一样,这个数据包会从 192.168.0.1 那里中转给 192.168.0.2
 
以后 192.168.0.2:80 和 192.168.0.3:1025 之间来往通信的数据包,全部由 192.168.0.1 负责中转,“回流”构成了

zxxx 发表于 2022-12-14 22:43
https://www.cxyzjd.com/article/a595364628/51657345
回流是什么?最简单的一个实例:

哇塞,感谢大佬码字!192.168.0.3 => 192.168.0.1 ::: 192.168.0.3:1025 => 218.4.218.4:80 SYN=1
192.168.0.1 => 192.168.0.2 ::: 192.168.0.3:1025 => 192.168.0.2:80 SYN=1
192.168.0.2 => 192.168.0.3 ::: 192.168.0.2:80 => 192.168.0.3:1025 SYN=1 ACK=1
192.168.0.3 丢弃 SYN=1 ACK=1
192.168.0.2 等待 ACK 超时
192.168.0.3 => 192.168.0.1 ::: 192.168.0.3:1025 => 218.4.218.4:80 SYN=1
192.168.0.1 => 192.168.0.2 ::: 192.168.0.1:5201 => 192.168.0.2:80 SYN=1
192.168.0.2 => 192.168.0.1 ::: 192.168.0.2:80 => 192.168.0.1:5201 SYN=1 ACK=1
192.168.0.1 => 192.168.0.3 ::: 218.4.218.4:80 => 192.168.0.3:1025 SYN=1 ACK=1
192.168.0.3 => 192.168.0.1 ::: 192.168.0.3:1025 => 218.4.218.4:80 ACK=1
******
192.168.0.2 收到 ACK 连接建立

正文完
 0