r3 - 31 Jul 2008 - 07:59:32 - Main.yfangYou are here: YWiki >  MyTech Web > 端口映射的技术内幕和特性
Start Presentation

Slide 1: 端口映射的技术内幕和特性

  • 主讲:杨方
  • 日期:2008.7.31
  • 版权归作者所有,欢迎非版权转载,请在转载过程中保留原文URL和作者信息,谢谢

Slide 2: 端口映射的概念

  • 端口映射是一种典型的NAT应用。
  • 通过NAT服务器将NAT服务器上net A上的某端口映射到net B上某台机器的某端口上,从而通过NAT服务器实现两个网段特定的数据交换。
  • 概念上比较晦涩,NAT的原理的简单的通过图表来说明,具体请看Linux系统上的NAT
  • 其实在实际应用中,端口映射最主要使用在将具备网关素质的网络设备(路由器或者具备同等功能的设备)的外网端口映射到局域网的某台服务器的端口上的目的。比如将网关的11.12.13.14:80 映射到 内网 10.0.0.1:80上,实现外网通过访问11.12.13.14:80间接访问10.0.0.1:80的目的。提高局域网的服务灵活性。
  • 端口映射的概念和原理不作为此次讲解的重点,此次内容主要讲解端口映射的内部技术和一些特性,以及满足不同需要的端口映射的配置方法。

Slide 3: 模拟环境

  • 为了解释更清楚,这里简单举一个网络环境的例子,本文中所有提到的网络映射,都是建立在该模拟环境下的约束下。
    • 网关/NAT服务器
      • eth0: 11.12.13.2/255.255.255.248 外网网卡,网关11.12.13.1
      • eth1:192.168.1.1/255.255.255.0
    • 第二个网关
      • eth0: 11.12.13.3/255.255.255.248 外网网卡,网关11.12.13.1
      • eth1:192.168.1.2/255.255.255.0
    • 远程client
      • ip 55.66.77.88
    • 局域网server * 192.168.1.3/255.255.255.0 默认网关 192.168.1.1 * 同一局域网内PC
      • 192.168.1.4/255.255.255.0 默认网关 192.168.1.1
    • 11.12.13.2:80 端口映射到 192.168.1.3:80

1_resize.jpg

Slide 4: 网络连接的基本知识

  • 下面的常识非常重要,如果不能理解则不能理解端口映射能否工作的原理。
  • 通常端口映射需要通过NAT服务器建立起远程客户端和局域网真实服务器之间的一个tcp代理连接。
  • 数据包在网络设备上的流向取决于当前的路有表
  • 你可以把真实的客户端和真实的服务器中间的所有经过的链路作标记,端口映射成功的一个必要条件是:数据双向传递线路完全相同。换句话说,如果数据包从server到client和从client到server的线路有所不同,都会导致这个连接变成一个网络层奇异的连接,从而必然导致端口映射失败。下面举例说明两个典型的错误配置。

Slide 5: 错误案例一

  • 内网真实server的默认网关不是NAT服务器
  • 在我们的案例中,内网server(192.168.1.3)将路由器(192.168.1.2) 设为默认网关。当它发现远程客户端55.66.77.88向它发起连接时,它的反应是根据路有把ACK+SYN包发给55.66.77.88,但是很遗憾这时根据默认路由回去的包将不经过192.168.1.1而直接通过192.168.1.2送出,这样的直接结果就是55.66.77.88试图连接11.12.13.2:80却收到11.12.13.3:xxxx返回来的包,自然不会成功建立正常连接。下面是来往的数据包的传输情况。

2_resize.jpg

Slide 6: 错误案例二

  • 同一局域网内PC通过NAT服务器外网地址访问
  • 在我们的案例中,所有局域网内的网络设备掩码均为255.255.255.0,这样就导致一个问题,在简单端口映射策略下,内网server(192.168.1.3)即便将NAT服务器设为默认网关,但是,当它发现远程客户端192.168.1.4向它发起连接时,它的反应是根据路有把ACK+SYN包发给192.168.1.4,但是很遗憾这时根据默认路由回去的包将不经过192.168.1.1而直接通过交换机送出,这样的直接结果就是192.168.1.4试图连接11.12.13.2:80却收到192.168.1.3返回来的包,自然不会成功建立正常连接。下面是来往的数据包的传输情况。

3_resize.jpg

Slide 7: 解决策略

  • 对于问题一,最简单的办法就是使得内网server的默认网关是NAT服务器。如果这一点不能满足的话,那可能不得不专门为某些客户端ip指定路由从NAT服务器出去才行。当然这样的特性刚好满足了部分管理员限制NAT远程ip的要求,但笔者依然认为这是很消极的一种方法,因为大量的数据包在网络中传递,占用带宽,实在是很差的限制策略。
  • 还有一种夸张的解决方法对付问题一,那就是完全让NAT服务器代理请求所有对内网的数据,换句话说,对于内部服务器而言,他们看到的只是一台普通的内网客户端在发起请求,而根据默认路由直接将数据回复给NAT服务器,这时NAT服务器再把数据处理发送给远程的真实客户端。这个方法可以完全超越网关设置的限制,不过代价也是很大的,那就是真实的局域网服务器看到的所有数据都是从NAT服务器的内网地址发送而来的,所以追踪访问者行为或是根据log分析攻击变得十分困难。当然,如果你完全不在乎这些,可以无视这个缺点。遗憾的是,通常管理员市在乎的。
  • 对于问题二,有两个思路解决这一问题,第一个策略就是放弃局域网内的外部访问,直接让它们从内网访问服务。不过这一限制让人很不舒服,而且并非所有服务都可以简单从内网直接访问过去。(比如根据servername 区分的apache 虚拟主机等等);第二个思路很容易想到,也是一种折中的办法,那就是,在NAT服务器上,仅对于源地址是局域网内部ip的forward包做SNAT,这样既可以保证内部服务器可以直接发现远程客户端的ip信息,也可以保证局域网内的客户端可以访问外部地址,当然,这个时候内部服务器看到的来访者都是以NAT服务器内网ip身份过来的。通常,这是用户体验最好的一种方案,也正是我们现在使用的策略。

Slide 8: 对比两种配置方案

  • 根据上面的讨论,这里给出两种典型的端口映射配置方案。这两种方案下都可以保证所有客户机可以访问正常外网接口
  • 方案一:NAT服务器完全代理,效果就是对真实服务器而言,所有访问都像是NAT服务器自己的请求一样,不受内网服务器网关设置限制
  • 方案二:NAT服务器仅代理局域网内客户端,效果是,对于真实服务器,局域网的访问好像来自NAT服务器,而可以直接看到远程客户端的ip地址,缺点是如果内部服务器路由设置不当,可能导致失败。
  • 以下案例仅给出核心部分设定,而其他配置从略。(CentOS5 + iptables 1.3.5实现)

Slide 9: 最简单的配置案例

# 端口映射 方案一
iptables -t nat -A PREROUTING -d 11.12.13.2 -p tcp --dport 80 -j DNAT --to 192.168.1.3
iptables -t nat -A OUTPUT -d 11.12.13.2 -p tcp --dport 80 -j DNAT --to 192.168.1.3 #allow NAT server to access 11.12.13.2:80
iptables -t nat -A POSTROUTING -d 192.168.1.3 -p tcp --dport 80 -j SNAT --to 192.168.1.1 # SNAT all forward packets
iptables -A FORWARD -p tcp -d 192.168.1.3 --dport 80 -j ACCEPT # Not need if policy of FORWARD chain is set to ACCEPT

# 端口映射 方案二
iptables -t nat -A PREROUTING -d 11.12.13.2 -p tcp --dport 80 -j DNAT --to 192.168.1.3
iptables -t nat -A OUTPUT -d 11.12.13.2 -p tcp --dport 80 -j DNAT --to 192.168.1.3 #allow NAT server to access 11.12.13.2:80
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -d 192.168.1.3 -p tcp --dport 80 -j SNAT --to 192.168.1.1 # SNAT only intranet forward packets
iptables -A FORWARD -p tcp -d 192.168.1.3 --dport 80 -j ACCEPT # Not need if policy of FORWARD chain is set to ACCEPT

Slide 10: 参考资料

Topic attachments
I Attachment Action Size Date Who Comment
jpgjpg 1_resize.jpg manage 25.7 K 28 Jul 2008 - 09:53 Main.yfang  
jpgjpg 2_resize.jpg manage 28.0 K 31 Jul 2008 - 07:59 Main.yfang  
jpgjpg 3_resize.jpg manage 28.2 K 28 Jul 2008 - 09:57 Main.yfang  
Edit | WYSIWYG | Attach | Printable | Raw View | Backlinks: Web, All Webs | History: r3 < r2 < r1 | More topic actions
 
Powered by YWiki
This site is powered by the TWiki collaboration platformCopyright © by the contributing authors. All material on this collaboration platform is the property of the contributing authors.
Ideas, requests, problems regarding YWiki? Send feedback