Port Forwarding & Port Triggering

发现一篇关于“端口触发”(Port Triggering)很有意思的的文章,转载过来记录一下。

在使用NAT的网络中,内部终端的IP地址为私网地址,发出去的IP包在NAT网关处进行地址转换,以公网地址与外部联系。在转换过程中,网关建立映射表,并维护对应连接的状态。当来自公网的包返回时,按照目的地址查找映射表,找到对应的私网地址,然后再次转换后发送给内部终端。这样,映射表中条目的增加是由内部发往外部的数据流触发的。因此,如果外部想直接访问内部是不可能的。

在实际应用中,被NAT网关隐藏起来的内网很可能架设FTP服务器、HTTP服务器、邮件服务器等等,那么如何从外部访问这些服务器呢?Port Forwarding提供了这样的机制。Port Forwarding根据来自公网的IP包的端口,将其转发到指定的内部IP地址上。例如,一个NAT网关的WAN侧地址为123.4.5.6,内部架设了一台FTP服务器,地址为192.168.0.8,端口21,及一台HTTP服务器,地址为192.168.0.9,端口8080。NAT网关(可能是路由器)上设置Port Forwarding规则:

路由器的WAN口inbound为流入,outbound为流出。

若Inbound的IP包目的地址为123.4.5.6,端口21,则将其地址转换为192.168.0.8,端口21,然后向内网转发;若Inbound的IP包目的地址为123.4.5.6,端口80,则将其地址转换为192.168.0.9,端口8080,然后向内网转发。

这样,通过设置Port Forwarding,从外网可以直接访问到内网的服务器。这里还有一个好处,对于某些linux服务器,只有root权限才可开放端口号小于1024的服务,而使用root帐号具有一定的风险,因此如上例,可设置内网HTTP服务器端口为8080,当外部采用常规的HTTP 80端口访问时,会映射到8080端口。

Port Triggering,是指当Outbound的流来自指定的内网端口(triggered port),自动打开网关WAN口的指定端口(forwarded port),并将指向forwarded ports的流转发到内网触发triggered ports的终端上。这里举一个例子,当内网的某机器(192.168.0.8)试图访问公网某IP(8.8.8.8)的某端口时,则自动打开WAN口(123.4.5.6)的指定端口(forwarded port)。这样,公网上的任意计算机(例如8.8.8.8)就可以通过WAN口(123.4.5.6)的指定端口访问位于内网的机器。这样的应用有时候会用到,最典型的就是XDMCP协议。

与静态配置的Port Forwarding相比,Port Triggering提供更大的灵活性,因为无需指定具体的内网终端地址,网关会在trigger时自动记录。

Port Forwardig中的外网端口是一直开放的,而Port Triggering中外网端口是只在trigger后才开放。

从配置的角度来说,Port Forwarding需要配置内部服务器的IP地址和端口,以及外网地址的端口,Port Triggering只要配置Outbound流的端口(triggered port)和Inbound流的端口(forwarded port)。

顺便说一下DMZ。设置Port Forwarding实际相当于设置了一些virtual server。对于Inbound但不属于Virtual Servers表中应用程序的报文,可以将其映射到一个固定的主机,即DMZ Host。DMZ将来自外网的未知流定向到一台机器上,从而可以提供对内网其他机器的安全保护

发表评论

电子邮件地址不会被公开。