1、什么是端口映射

这里说的端口映射是路由器上的端口映射。一般情况下,网络中路由器都有防火墙功能,互联网用户只能访问到你的路由器的WAN口,而访问不了局域网内部的服务器或者工作站。要想让外面的用户访问到局域网的电脑,那么就要在路由器上做一个转发设置,也就是端口映射设置,让用户的请求到了路由器后,能转发到局域网内部的机器上,例如游戏服务器或者WEB服务器。这就是端口映射。

在局域网中建立一个WEB服务器,IP地址为192.168.88.100,端口为10000,此时在局域网内部,如果要在外网上访问服务器,就要把192.168.88.100这台机器的10000端口通过路由器映射到外网,除了WEB服务外,其他的服务例如远程桌面,FTP等都可以将不同的端口映射出去,以便能够在外网通过路由器来访问内网机器。一般的路由器都带有端口映射功能,以下对目前使用较多的ROS软路由的端口映射为例作一说明。

2、ROS的端口映射设置

进入Winbox,点击IP-Firewall-NAT打开防火墙设置界面,点击左上角的+,添加一条dstnat规则,其中dst.address填写你要映射的外网IP,然后选择protocol为6,即TCP协议,设置dst.port为80。设置完成后,点击action选项卡,在action框中,选择dst-nat,在toaddress框中填写内网提供服务的IP地址,也就是192.168.88.100,在toport填写内网提供服务的端口,也就是10000,这样基本映射就完成了,此时就可以通过外网ip加80端口访问内网的服务了。

3、IP显示和回流问题解决

经过第二步的基本端口映射设置后,外网已经可以访问内网了,但是存在一些不完善的地方,例如所有外网访客的地址都是路由器的网段地址,这样就无法统计访客的来源,还有很多不便,比如WEB中的论坛就无法屏蔽一些会员的IP了,因为大家都是同一个IP。

原因是这样的:为了使整个内网的所有机子共享上网,在设置ROS时,我们都要设置一条srcnat规则,action为masquerade,masquerade是snat的一个特例,主要用于在无固定网关的情况下,比如adsl拨号等,masquerade比nat效率低的原因是nat直接指出需要伪装的源地址,而masquerade需要伪装的源地址必到默认网关中寻找,masquerade永远以默认网关地址为IP伪装的源地址,所以首先是效率慢了点,其次只能用在外网IP只有一个情况,如果有多个wan接口就不能用masquerade,而只能用nat,因为nat可以手动指定多个需要伪装的源IP地址,而masquerade只能找到一个地址,就是默认网关的地址,由于nat方式设置较masquerade复杂,加上现在大量的教程都是以masquerade方式共享上网,所以目前在用的ros大多数采用masquerade设置共享。通过上面的分析,我们可以看出为什么在端口映射后,外网访问的ip都成了内网网关,解决的方法有两种,一是改用nat方式,这种方式有局限性,只能用于固定IP的外网,若是adsl则不能使用,另一个方法是通过调整masquerade的设置来完成显示外网IP,具体操作如下,进入winbox,点击IP-Firewall-NAT打开防火墙设置,编辑原来建立的srcnat规则masquerade,在general选项卡的outinterface选中lan,单击前面的小框,在框中出现!,点击OK完成设置。

这样设置完成后,我们可以发现外网访客可以正常访问,而且IP地址也是正确的,但同时导致另一个问题,就是内网用户不能用外部的IP访问映射的内部服务器,需要按照下面的方法解决:再增加一条对内的规则,action设置为masquerade,general选项卡中,设置chain为srcnat,srcaddress为内网网段。

到此,内外网都能正常访问了,而且外网访客IP是正确的,此时用外网IP访问WEB时,显示的IP是内网网关地址,用这种方法可以实现内外网用户都用网关外部IP访问映射的内部服务,并解决了外部用户显示IP不正确的问题,当然这种方法内网用户显示的IP还是不正确的,要解决内网IP显示问题,可以在ros中设dns服务器,用域名来访问,内网访问内网IP,外网访问外网IP就能完美解决。我想我们主要是要知道外网的IP,内网的IP并不重要。

4、关于回流

其实所谓回流,就是将内网源地址为网段的所有机器对所有目标地址的需求全都进行源地址转换为外网IP,然后转发出去。所有从外网回来的数据通过外网IP再回传到内网的机器,这样就保证了内网上网正常,但是这样效率下降到原来的50%,显然是不合算的,对于masquerade了共享上网时,外网访问的IP显示还是内网网关,所以回流是不可取的,虽然不可取,我们也把方法写出来,供大家参考,添加一条srcnat规则,srcaddress写上内网的网络地址,dstaddress填写的是内网提供服务的主机ip,需要协议和端口,action选项卡选择srcnat toaddress则填写映射的外部IP,端口,经过以上设置算是完全搞好了。

什么是回流呢?

就是当内网有服务映射到网关后,内网主机也可以用网关外部地址访问,凡是支持回流功能的路由器,都可以从内网访问网关外部地址上映射的服务,不支持回流技术的当然就不行啦

回流是如何实现的呢?

事实上也是通过snat实现的,通常的snat是为了能让内网的电脑上外网,所以在outside(外网卡)上做snat,但回流是内部主机连接内网的主机(只不过是通过网关外部地址访问),所以必须在inside(内网卡)上做snat,这样经过内网卡的数据包先被伪装成公网或其它网段内的ip地址,然后发送到外网卡,外网卡看到源地址伪装过的ip数据包,就认为该数据包是从公网或其它网段来的,所以就通过dnat功能帮它转换目标地址,并发向处在内网的服务器(如果不进行回流,外网卡认为该数据不是从公网而来,就不会通过dnat把它转回到内网,然后丢弃数据包,内网电脑就不能访问映射在网关外部地址上的服务啦!!!),这样内网电脑就能访问被映射过的内网服务啦 。

最后修改:2021 年 10 月 28 日
如果觉得我的文章对你有用,请随意赞赏