后浪笔记一零二四

回流是什么?最简单的一个实例: 网吧内网一台主机 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站点。

就这个现象,我们就称之为“不支持回流了”,这里指的是网关上的映射方式不支持回流。

为什么会发生这种情况呢?

过程如下:

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,这就是第一次握手。

电脑 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。这是第二次握手。

电脑192.168.0.3 顺利接到了这个数据包,然而它发现这是一个来自 192.168.0.2:80的回应,因为ACK标志位值为1摆在那里呢。它想不起来什么时候给 192.168.0.2:80 这个目标对象发送过 SYN 请求,它认为这是一个错误的数据包,于是决定把这个数据包丢弃。然后继续等待 218.4.218.4:80的回应,一直等到超时。

解决方案

  1. 路由器支持(没试过)

关键在于 电脑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负责中转,“回流”构成了。

  1. 路由器支持(有试过)

关键在于 电脑192.168.0.1把第一次握手的那个数据包在转发时,不仅要修改目标地址和端口,也要修改源地址和端口 ,我们来看一下情况会有什么不同:

电脑192.168.0.1接收到了这份数据包(因为它的身份是路由器,所以允许接收和转发目标IP地址不是自已、MAC地址却是自已接口MAC地址的数据包),它分析这个数据包的目标地址和目的端口,发现命中“目的地址为218.4.218.4,目的端口为80,就改变目的地址为192.168.0.2”,这个时候的包,源地址为192.168.0.3,目的ip为192.168.0.2,目的端口为80。

注意: 之后,这个数据包的源地址改为了218.4.218.4、目标地址为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负责中转,“回流”构成了。

  1. 在服务器192.168.0.2上添加iptables规则

私网内要被访问的(对外网提供服务的)机器这里表示为:私网服务器

PREROUTING -s 私网网段 -d 公网IP -j DNAT –to-destination 私网服务器地址

POSTROUTING -s 私网网段 -d 私网服务器地址 -j SNAT –to-source 私网网关

iptables -t nat -A PREROUTING  -s 192.168.0.0/24 -d 218.4.218.4/32 -p tcp -m tcp --dport 80 -j DNAT --to-destination 192.168.0.2
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -d 192.168.0.2 -j SNAT --to-source 192.168.0.1

本文发表于 0001-01-01,最后修改于 0001-01-01。

本站永久域名「 jiavvc.top 」,也可搜索「 后浪笔记一零二四 」找到我。


上一篇 « 下一篇 »

赞赏支持

请我吃鸡腿 =^_^=

i ysf

云闪付

i wechat

微信

推荐阅读

Big Image