一、背景知识简介
我们日常家用、办公的网络基本都是在一个路由器下的局域网里,网络结构往往是这样的:
外网——光猫——路由器Wan口——路由器Lan口{局域网{局域网设备1……局域网设备N}}
这样的结构工作过程是这样的:
光猫通过光纤连接到网络运营商(常见的是移动联通电信)的拨号服务器;
路由器负责宽带拨号(路由器的wan口设置里有宽带账号,每次路由器启动会自动拨号——当然也可以到路由器的设置页面里把自动拨号设置为手动拨号,但绝大多数情况下没人这么做);
路由器宽带拨号成功之后,运营商的拨号服务器会给路由器设置一个公网IP地址。
前面是路由器跟外网之间的交互,在路由器组建的内网中,他还会做一些局域网的基础管理工作,这些基础工作跟外网没关系,也就是说,无论路由器的wan口是否拨号成功,都不影响他做一些基础的局域网管理工作:
DHCP服务器——大多数情况下路由器都会把自己作为它所管理的局域网中的DHCP服务器,DHCP服务器开起来之后,通过网线连接到路由器上的电脑等设备、通过无线网络连接到路由器上的手机笔记本iPad等设备都会作为一个DHCP客户端来向路由器报道,然后路由器会根据自己的局域网IP分配记录来给每个新报道的设备分配一个内网的IP地址,并将这个IP地址再记录在路由器自己的IP分配记录中,以防将同一个IP地址分配给不同的设备导致局域网IP地址冲突。
路由器将这些基础工作做完之后,局域网内的设备就可以通过路由器和外网的设备进行通信了。但是,在外网看来,内网的这些所有的设备的公网IP都是相同的。当内网的设备主动发起外网连接请求的时候,路由器是可以知道这个请求到底是局域网内哪台设备发起的,到时候外网设备对这个请求进行响应的时候,路由器也是可以知道到底该把这个相应返回给哪台设备的。这里牵扯到NAT的知识,不展开了。
但是,反过来,如果是外网某台设备想要主动连接局域网内某台设备呢,怎么办?众所周知,网络连接都是基于tcp/IP协议的,建立的连接可以是tcp或udp,但无论是tcp还是udp,都离不开4要素:源地址+源端口——目的地址+目的端口。现在外网的设备作为源IP,他在知道了目的IP和端口的情况下,用源IP+源端口向目的IP+目的端口发起请求的时候,负责管理目标设备的路由器是能接收到这个目的请求的,因为他的wan口IP地址就是这个目的IP,但他不知道的是,这个目的端口号具体是局域网内哪台设备上的端口号。这样,他不知道的情况下,就会挂起这个请求,直到超时无响应,导致源设备发起的这个请求失败。
所以,在这种应用场景下,只要解决了让路由器能清楚的知道”来自互联网上向XXX端口发起的请求,就把这个请求发往局域网中IP为AAA的设备上的NNN端口“即可。
这个功能,就是所谓的端口映射——把来自外网的XX端口的请求,映射到内网的某台设备的NN端口。要注意的是,外网请求连接到是XX端口,路由器将请求映射到的是某设备的NN端口,这个XX和NN不一定非得一样,完全可以自定义(tcp/IP协议规定端口号范围是0-65535),也就是说,你在外网的设备上有个软件,可以向路由器所在的IP上发起端口号为100的请求,路由器里设置的端口映射是把来自外网请求100端口号的连接映射到内网IP为192.168.1.2设备的200端口上,也是可以的,在外网的设备上看,跟它通信的是路由器所在的IP+100,而在内网的192.168.1.2上看,他接受请求的端口是200,跟他通信的IP是192.168.1.1(假设路由器的局域网IP是192.168.1.1)。
这样一番操作之后,内网和外网就这样被路由器所分隔开了:外网的设备只能看到路由器;路由器下局域网内的设备也只能看到路由器(也就是网管)以及局域网内的其他设备。
明白了以上的道理,端口映射该怎样设置也就很清楚了,只是针对不同的路由器可能在操作上有些不同细微的差别,但不会相差很多,因为需要向路由器说明的无非是:1.需要将外网来的哪个端口进行映射;2.需要将外网来的这个端口的请求转发给本局域网的哪个IP;3.需要将这个端口的请求转发给这个IP地址的哪个端口。(某些脑残路由器设置里竟然还有4.需要手动选择有且只有一个的选项:wan口,也就是需要向路由器说明一下,我是要将来自wan口的请求进行映射,而不是要把lan口的请求进行映射。。。真是脑残设计)。接下来,要做的就是:登录路由器管理页面,找到”端口映射“或”虚拟服务器“设置,添加映射规则,完事~
另外补充一点,现实中一般都直接用dhcp来获取局域网IP,而dhcp获取到的IP是有租期的,当租约到期之前断开了与路由器的连接,然后租约到期后又重新连接,这时候dhcp可能会给设备重新分配另一个局域网IP,而不是之前的局域网IP了,这样的话,之前设置的端口映射就失效了。要解决这个动态局域网IP的问题,就是在路由器dhcp设置里,把当前设备的mac绑定静态IP地址,这样一来,无论什么时候这个设备来向路由器请求局域网IP,路由器都会根据当前设备的mac地址分配固定局域网IP,而端口映射里的规则也是永远指向这个IP,这样,这条规则也会永远生效。
再补充一点,多数路由器还会有一个dmz主机设置,这个设置的作用就是相当于你把所有来自外网的请求(0-65535端口)全都映射到一台主机的对应的端口上(注意,是对应映射,如果外网来的请求是连接100端口,那路由器会把这个100端口的请求转发到指定IP的100端口,而无法自定义为其他端口)。
说了这么多,可能还有小伙伴不太明白,下面我们再用一个非常具体的实例来说明一下。
一、小明家里的网络结构:
外网——光纤——光猫——家路由器wan口——家路由器lan口——家电脑
1.1.家路由器里设置里宽带拨号,拨号成功后,宽带运营商给家路由器分配了111.111.111.111这个IP地址;
1.2.小明对家路由进行了设置:路由器自身局域网IP——192.168.1.1
1.3.小明家电脑通过网线连接路由器,家电脑网卡的mac地址为——00:AA:11:BB:22:CC:33:DD
1.4.小明对家路由进行了设置:dhcp设置分配固定IP,将mac地址为00:AA:11:BB:22:CC:33:DD的设备分配固定IP192.168.1.2
1.5.小明对家路由进行了设置:端口映射(进行映射的是wan口来的5555端口;映射到的局域网IP是192.168.1.2;映射到192.168.1.2上的端口号是6666)
1.6.小明家电脑上开了个服务器软件,服务器软件监听的是6666端口。(这个服务器具体是干啥的无所谓,可以是ftp,可以是http,可以是ssh服务端,可以是svn服务器……这些具体的服务器对外提供服务,都是基于tcp/IP协议,在tcp/IP协议的基础上,又做的应用层协议。)
1.7小明家还有一部手机,通过无线网连接到路由器,由于小明没有在路由器的dhcp设置里对手机的mac地址进行固定IP绑定,因此本次连接也获取到IP了,192.168.1.3,但不敢说下次这个手机再来连接路由器会不会还是获取到192.168.1.3这个IP,还有可能是192.168.1.[4-255之间到任意一个]
二、小明公司办公室的网络结构:
外网——光纤——光猫——公司路由器wan口——公司路由器lan口——公司电脑
2.1公司路由器里设置里宽带拨号,拨号成功后,宽带运营商给家路由器分配了222.222.222.222这个IP地址;
2.2公司路由器只做了基础设置:公司路由器本身局域网IP——192.168.1.1(巧了,也是这个,可能是同一家路由器厂商生产的路由器,也可能是国际惯例,也可能是小明就是公司的网络管理员,他习惯于将局域网网关设置为这个IP,也可能……,不过无所谓,因为家里公司两边都有路由器的存在,两边的内网与外网是相互隔离的。也就是说公司局域网是192.168.1.X,家里的局域网也可以是192.168.1.X,因为他们彼此之间无法直接看见对方,也因此,两个局域网之间互不影响)
2.2公司电脑用网线连接公司路由器,由于没特殊设置dhcp,电脑开机后,公司路由器根据当前它自己的局域网分配记录(之前有别的同事开机,路由器已经给小明同事们的电脑、手机等分别分配了IP地址了),给小明公司电脑分配了IP地址192.168.1.32
三、小明在公司里操作:
3.1小明在公司的电脑上打开了专用的客户端,输入家里路由器的公网IP地址(111.111.111.111),输入路由器端口映射的触发端口号(5555),客户端软件内部固定了本地端口号7777,开始链接。
3.2公司电脑的网卡向路由器发送链接请求(111.111.111.111:5555)
3.3公司路由器接收到公司电脑发来的链接请求,并记录下了内网映射(192.168.1.32:7777——222.222.222.222:7777——111.111.111.111:5555)
3.4公司路由器用自己的公网IP+源端口号向外发送请求222.222.222.222:7777——111.111.111.111:5555
3.5公网设备找到了111.111.111.111,也就是家路由器的wan口,并把这个请求(222.222.222.222:7777——111.111.111.111:5555)发送到了家路由器wan口
3.6家路由器收到后,查询端口映射,发现所有来自wan口5555端口的联入请求都应该转发到家内网的192.168.1.2这个IP的6666上,于是,记录下了(222.222.222.222:7777——111.111.111.111:5555——192.168.1.2:6666),并将这个请求转发给了192.168.1.2的5555端口。
3.7家电脑的服务端正在监听5555端口,收到这个来自家路由器的请求后,反馈说“收到”,也就是把“收到”回传给路由器,路由器一看这个“收到”的消息是来自192.168.1.2:6666,查询映射记录得知,应该将“收到”发送给111.111.111.111:5555,于是111.111.111.111:5555——222.222.222.222:7777
3.8公网设备找到222.222.222.222后,把消息发往222.222.222.222:7777
3.9公司路由收到来自111.111.111.111:5555的消息后,查询,发现应当发给局域网192.168.1.32:7777
3.10公司电脑收到消息……
为了简单易懂,这里简化了大量的端口分配工作,实际上,客户端发起请求的时候,端口号不一定是固定的;源端路由器进行源端口nat转换的时候,也不一定是用源端口往外发送;目标端路由进行内网端口映射时,与局域网端口通信的端口也不一定是跟触发端口一样。这里我之所以对应起来,是尽量简化模型,让内容更加容易理解。
原创,未经允许,不得转发。千字千元,明码标价。