linux网络安全技术与实现

piici

贡献于2014-05-04

字数:0 关键词: Linux

I 现在开源软件日趋丰富,熟悉这个领域的技术人才也越来越多,这对企业,尤其是中小 企业来说不啻是一大福音。 企业信息系统包含各种不同用途、不同规模的服务器以及各种应用程序,在规划系统 时,规划人员必须谨慎考虑哪些位置上可以使用免费资源;在这方面,那些使用者直接接 触不到,但又必不可少服务器可以作为重点考虑对象。本书使用Linux实现网络安全就是一 个很好的例子。信息安全极其重要,但如果考虑到成本,每个企业管理者都会犹豫一番, 毕竟还没有遇到问题就要先投入一大笔钱,其紧迫性显然不如将钱花在直接与业绩挂钩的 事情上。但如果安全成本较低,并且掌握这种技术的人才又容易找到,企业管理者将可以 放心地、大刀阔斧地部署安全解决方案。 本书就是要提供这样的解决方案,不管是为自己的公司降低信息系统的成本,或是为 别的公司建设新的系统,本书都有极高的参考价值。如果你已经是Linux相关的技术人员, 本书会提高你的应用能力;如果你是Windows平台的技术人员,本书会增加你跨领域就业 的资本。 作者陈勇勋常年研究Linux的相关技术,教学经验丰富,已经撰写了多本畅销著作。他 一直以推广开源软件的应用为己任,在这个领域的技术研究上投入了很多心血,相信由他来 编写本书,可以让读者快速掌握Linux安全技术知识并将所学技术得心应手地运用于实际工 作中。 张智凯 Richard Chang 精诚资讯知识产品事业部处长 推  荐  序 III 作  者  序 很多年前我就一直想撰写本书,只是时间上实在不允许,如今总算了结了多年来的一桩 心愿,我为此感到十分欣慰。当然这还要感谢屠立刚和唐任威两位老师,他们总是恰 逢其时地为我提供理论指导,使我得以突破许多盲点来完成这一著作。 在接触因特网的这16年来,我亲眼目睹Linux系统不断和成长和完善,心中总有一种莫 名的感动,因为背后的功臣竟是一群不求回报的、夜以继日默默付出的志愿者,而他们的成 果却足以抗衡拥有千亿资产的商业公司,甚至超越了他们的产品。由于缺少市场营销的推 动,Linux系统的市场占有率始终不高,当然这样也就埋没了Linux许多令人赞赏的功能,如 防火墙(Layer2、3、7)、流量控制(Traffic Control)、基于策略的路由(Advance Routing)、虚拟 专用网络(Virtual Private Network)等,这也是激发我撰写本书的动力;我的下一个目标是完成 《Linux系统虚拟化技术》一书,请大家拭目以待吧! 本书可分为安全、基于策略路由、流量控制及通信安全四大部分,主要内容如下。 安全 以Linux内置的Netfilter为主线,介绍Netfilter模块的用法及组合应用上的技巧,再逐步延 伸出应用层防火墙(Layer 7 Firewall)及透明式防火墙(Transparent Firewall)的技术原理及应用, 还讨论如何结合反向代理机制来确保企业网络的安全。 基于策略的路由 基于策略的路由一直都是网络管理人员梦寐以求的利器。有了基于策略的路由之后,你 可以将网络上所有的数据包玩于股掌,例如,所有http数据包经由第一条ADSL连接因特网, 企业中一半的客户端使用第一条ADSL、另一半的客户端使用第二条ADSL,甚至还可以做到 让企业对外的网络连接平均分摊到多条ADSL上等高难度的网络管理操作。其实市场上很多 负载均衡设备就是使用Linux来搭建的,而且这个功能通常只存在于价格高昂的商用路由器 之上。 IV 流量控制 讲述如何使用Linux内置的流量控制功能来管理网络上的流量;除了传统上以IP及端口 的方式来限制流量之外,也将介绍如何使用应用层协议来控制流量,以便轻松地管理企业对 带宽的使用。 虚拟专用网络 由于企业海外分部的建立及无线上网的普及,使得网络通信安全主题受到人们的重视, VPN硬件设备也因此逐渐流行起来。这样的设备通常价格不菲,但我们只要巧妙使用Linux 系统,就可以建立起适于企业使用的VPN系统。 只要你能随着本书的章节循序渐进地学习,一定可以很快将Linux系统应用于企业网络 安全的管理上。 陈勇勋 Linux 网络安全技术与实现(第2 版) 第 1 章 防火墙的基本概念 ····················································································· 1 1.1 TCP/IP的基本概念 ························································································································ 2 1.1.1 应用层 ···································································································································· 2 1.1.2 传输层 ···································································································································· 3 1.1.3 网络层 ···································································································································· 4 1.1.4 链路层 ···································································································································· 4 1.2 数据包传输 ····································································································································· 4 1.3 TCP、UDP及Socket的关系 ········································································································ 9 1.4 何谓防火墙 ··································································································································· 12 1.5 防火墙的判断依据 ······················································································································ 14 1.5.1 各层数据包包头内的信息 ·································································································· 14 1.5.2 数据包所承载的数据内容 ·································································································· 16 1.5.3 连接状态 ······························································································································ 16 1.6 防火墙的分类 ······························································································································· 17 1.6.1 数据包过滤防火墙 ·············································································································· 17 1.6.2 应用层防火墙 ······················································································································ 18 1.7 常见的防火墙结构 ······················································································································ 19 1.7.1 单机防火墙 ·························································································································· 19 1.7.2 网关式防火墙 ······················································································································ 20 1.7.3 透明防火墙 ·························································································································· 24 1.8 小结 ··································································································································24 第 2 章 Netfilter/iptables ······················································································ 25 2.1 何谓内核 ········································································································································ 26 2.2 何谓Netfilter·································································································································· 27 2.3 Netfilter与Linux的关系 ·············································································································· 27 2.4 Netfilter工作的位置 ···················································································································· 28 2.5 Netfilter的命令结构 ···················································································································· 30 2.6 Netfilter的filter机制 ···················································································································· 31 目    录 VI Linux 网络安全技术与实现(第2 版) 2.7 规则的匹配方式 ·························································································································· 35 2.8 Netfilter与iptables的关系 ··········································································································· 36 2.9 iptables工具的使用方法············································································································· 38 2.9.1 iptables命令参数 ················································································································· 38 2.9.2 iptables规则语法 ················································································································· 48 2.9.3 学以致用:iptables的规则语法 ························································································· 56 2.10 使用iptables机制来构建简单的单机防火墙 ······································································· 57 2.10.1 如何测试防火墙规则正确与否 ····················································································· 59 2.10.2 解决无法在防火墙主机上对外建立连接的问题 ························································· 62 2.10.3 管理防火墙规则数据库的办法 ····················································································· 68 2.11 使用filter机制来构建网关式防火墙 ····················································································· 71 2.12 Netfilter的NAT机制 ·················································································································· 73 2.12.1 IP网段的划分 ·················································································································· 73 2.12.2 私有IP ······························································································································ 74 2.12.3 NAT·································································································································· 74 2.12.4 数据包传输方向与SNAT及DNAT的关系 ····································································· 76 2.12.5 NAT的分类 ····················································································································· 79 2.12.6 NAT并非无所不能 ········································································································· 86 2.13 Netfilter的Mangle机制 ············································································································· 86 2.14 Netfilter的raw机制 ···················································································································· 89 2.15 小结 ·············································································································································· 91 第 3 章 Netfilter的匹配方式及处理方法 ······························································· 93 3.1 匹配方式 ········································································································································ 94 3.1.1 内置的匹配方式 ·················································································································· 94 3.1.2 从模块扩展而来的匹配方式 ······························································································ 98 3.2 处理方法 ······································································································································ 139 3.2.1 内置的处理方法 ················································································································ 139 3.2.2 由模块扩展的处理方法 ···································································································· 142 3.3 小结 ··············································································································································· 153 第 4 章 Netfilter/Iptables的高级技巧 ·································································· 155 4.1 防火墙性能的最优化 ··············································································································· 156 VII 目    录 4.1.1 调整防火墙规则顺序 ········································································································ 156 4.1.2 巧妙使用multiport及iprange模块 ····················································································· 158 4.1.3 巧妙使用用户定义的链 ···································································································· 158 4.2 Netfilter连接处理能力与内存消耗························································································ 159 4.2.1 计算最大连接数 ················································································································ 160 4.2.2 调整连接跟踪数 ················································································································ 160 4.2.3 连接跟踪数量与内存消耗 ································································································ 161 4.3 使用raw 表 ·································································································································· 162 4.4 简单及复杂通信协议的处理 ·································································································· 163 4.4.1 简单通信协议 ···················································································································· 163 4.4.2 复杂通信协议 ···················································································································· 164 4.4.3 ICMP数据包的处理原则 ·································································································· 171 4.4.4 在DMZ上使用NAT将面临的问题及解决方案 ······························································· 172 4.4.5 常见的网络攻击手段及防御方法 ···················································································· 175 4.5 小结 ··············································································································································· 191 第 5 章 代理服务器的应用 ················································································· 193 5.1 何谓代理服务器 ························································································································ 194 5.2 代理服务器支持的通信协议 ·································································································· 195 5.3 代理服务器的分类 ···················································································································· 195 5.3.1 何谓缓存代理 ···················································································································· 195 5.3.2 何谓反向代理 ···················································································································· 196 5.4 代理服务器的硬件要求 ··········································································································· 197 5.5 安装Squid代理 ··························································································································· 198 5.6 使用Squid构建缓存代理·········································································································· 199 5.6.1 缓存代理的基本配置 ········································································································ 199 5.6.2 缓存代理客户端的配置 ···································································································· 204 5.6.3 缓存代理的高级配置 ········································································································ 205 5.6.4 缓存代理连接访问控制 ···································································································· 209 5.6.5 缓存对象的管理 ················································································································ 210 5.6.6 Squid代理的工作日志 ······································································································ 214 5.6.7 Squid代理的名称解析 ······································································································ 216 5.7 透明代理 ······································································································································ 217 VIII Linux 网络安全技术与实现(第2 版) 5.7.1 透明代理的工作原理 ········································································································ 217 5.7.2 透明代理的配置 ················································································································ 218 5.8 反向代理 ······································································································································ 219 5.8.1 Web 服务器的分类 ··········································································································· 219 5.8.2 构建反向代理 ···················································································································· 221 5.9 小结 ··············································································································································· 226 第 6 章 使用Netfilter/Iptables保护企业网络 ······················································· 227 6.1 防火墙结构的选择 ···················································································································· 228 6.2 防火墙本机的安全 ···················································································································· 230 6.2.1 网络攻击 ···························································································································· 230 6.2.2 系统入侵 ···························································································································· 231 6.2.3 入站/出站的考虑事项 ······································································································ 231 6.2.4 远程管理的安全考虑事项 ································································································ 232 6.3 防火墙的规则定义 ···················································································································· 232 6.3.1 企业内部与因特网 ············································································································ 232 6.3.2 DMZ与因特网 ··················································································································· 234 6.3.3 企业内部与DMZ ··············································································································· 238 6.4 入侵与防御的其他注意事项 ·································································································· 238 6.4.1 更新系统软件 ···················································································································· 238 6.4.2 Syn Flooding攻击防御 ······································································································ 238 6.4.3 IP欺骗防御 ························································································································ 241 6.5 小结 ··············································································································································· 242 第 7 章 Linux内核编译 ······················································································· 243 7.1 为何需要重新编译内核 ··········································································································· 245 7.2 内核编译 ······································································································································ 246 7.2.1 安装软件开发环境 ············································································································ 246 7.2.2 获取内核源代码 ················································································································ 247 7.2.3 整合源代码 ························································································································ 248 7.2.4 设置编译完成后的内核版本号 ························································································ 249 7.2.5 清理内核源代码以外的临时文件 ···················································································· 249 7.2.6 设置内核编译参数 ············································································································ 250 IX 目    录 7.2.7 执行编译操作 ···················································································································· 252 7.2.8 安装模块及结构中心 ········································································································ 253 7.2.9 修改开机管理程序 ············································································································ 255 7.3 如何安装内核补丁 ···················································································································· 257 7.3.1 下载补丁文件及内核源代码 ···························································································· 257 7.3.2 准备内核及补丁的源代码 ································································································ 258 7.3.3 运行内核补丁 ···················································································································· 259 7.3.4 设置内核编译参数 ············································································································ 259 7.3.5 内核编译完毕后的检查 ···································································································· 260 7.4 小结 ··············································································································································· 260 第 8 章 应用层防火墙 ························································································ 261 8.1 如何为iptables安装补丁··········································································································· 263 8.2 Layer7模块识别应用层协议的原理 ······················································································ 264 8.3 安装Layer7模块的模式 ············································································································ 265 8.4 如何使用Layer7模块 ················································································································ 267 8.5 Layer7模块使用示例说明 ······································································································· 268 8.6 结合使用包过滤器与Layer7模块 ·························································································· 271 8.7 小结 ··············································································································································· 273 第 9 章 透明式防火墙 ························································································ 275 9.1 何谓桥接模式 ····························································································································· 278 9.2 何谓透明式防火墙 ···················································································································· 279 9.3 构建透明式防火墙 ···················································································································· 279 9.3.1 使用Linux构建网桥 ·········································································································· 280 9.3.2 Netfilter在Layer3及Layer2的工作逻辑 ··········································································· 284 9.3.3 另一种透明式防火墙 ········································································································ 290 9.3.4 配置代理ARP ···················································································································· 290 9.4 小结 ··············································································································································· 292 第 10 章 基于策略的路由及多路带宽合并 ························································· 293 10.1 何谓基于策略的路由 ············································································································· 294 X Linux 网络安全技术与实现(第2 版) 10.2 了解Linux的路由机制············································································································ 296 10.3 路由策略数据库与路由表的管理 ······················································································· 298 10.3.1 管理策略数据库 ··········································································································· 298 10.3.2 管理路由表 ··················································································································· 302 10.4 带宽合并 ··································································································································· 305 10.4.1 何谓带宽合并 ··············································································································· 306 10.4.2 企业内的带宽合并 ······································································································· 307 10.5 小结 ············································································································································ 319 第 11 章 Linux的带宽管理 ················································································· 321 11.1 队列············································································································································· 322 11.1.1 不可分类的队列算法 ··································································································· 323 11.1.2 可分类的队列算法 ······································································································· 323 11.2 Linux带宽管理 ························································································································· 324 11.3 过滤器 ········································································································································ 325 11.3.1 FW过滤器 ····················································································································· 326 11.3.2 U32过滤器 ···················································································································· 326 11.4 带宽管理部署示例 ·················································································································· 326 11.4.1 带宽划分 ······················································································································· 327 11.4.2 设置队列算法 ··············································································································· 327 11.4.3 设置队列规则 ··············································································································· 328 11.4.4 设置过滤器 ··················································································································· 329 11.4.5 测试 ······························································································································· 330 11.5 带宽借用 ···································································································································· 332 11.6 类别中的队列 ··························································································································· 334 11.7 Linux带宽管理的限制 ············································································································ 335 11.8 网桥模式中的带宽管理 ········································································································· 338 11.9 多接口的带宽管理 ·················································································································· 339 11.9.1 为内核及iptables安装补丁 ··························································································· 340 11.9.2 多接口带宽管理 ··········································································································· 341 11.10 实际案例 ································································································································· 343 11.11 小结 ·········································································································································· 348 XI 目    录 第 12 章 流量统计 ····························································································· 349 12.1 安装及测试SNMP服务器 ······································································································ 350 12.1.1 安装SNMP服务器 ········································································································ 350 12.1.2 测试SNMP服务器 ········································································································ 351 12.2 安装及设置MRTG ·················································································································· 352 12.2.1 安装MRTG ···················································································································· 352 12.2.2 设置MRTG ···················································································································· 352 12.2.3 使用cfgmaker工具编写MRTG针对网卡的配置文件 ················································· 353 12.3 另一种网络流量监测方式 ···································································································· 357 12.3.1 结合使用Netfilter/Iptables和MRTG来监测网络流量 ················································· 357 12.3.2 手动编写MRTG的配置文件 ························································································ 359 12.4 外部程序及MRTG配置文件的示例 ··················································································· 360 12.5 小结 ············································································································································ 362 第 13 章 弱点扫描、入侵检测及主动防御系统 ·················································· 363 13.1 何谓弱点扫描 ··························································································································· 364 13.1.1 OpenVAS弱点扫描工具 ······························································································· 364 13.1.2 OpenVAS弱点扫描工具的工作架构 ··········································································· 365 13.1.3 下载及安装OpenVAS弱点扫描工具 ··········································································· 365 13.1.4 进行弱点扫描 ··············································································································· 368 13.2 入侵检测系统 ··························································································································· 374 13.2.1 网络设备的限制 ··········································································································· 374 13.2.2 入侵检测系统的分类 ··································································································· 375 13.2.3 入侵检测系统的部署 ··································································································· 375 13.2.4 Snort入侵检测系统介绍 ······························································································· 376 13.2.5 下载及安装Snort入侵检测系统 ··················································································· 377 13.2.6 下载及安装Snort的规则数据库 ··················································································· 378 13.2.7 配置Snort ······················································································································· 381 13.2.8 Snort的启停 ··················································································································· 382 13.2.9 Snort的警告 ··················································································································· 382 13.3 主动防御系统 ··························································································································· 383 13.3.1 下载Guardian ················································································································ 384 13.3.2 安装Guardian ················································································································ 384 XII Linux 网络安全技术与实现(第2 版) 13.3.3 设置Guardian ················································································································ 385 13.3.4 Guardian的启停 ············································································································ 386 13.4 小结 ············································································································································ 387 第 14 章 VPN基础篇·························································································· 389 14.1 何谓VPN ··································································································································· 390 14.1.1 VPN的原理 ··················································································································· 392 14.1.2 常见的VPN架构 ··········································································································· 393 14.1.3 VPN的安全问题 ··········································································································· 393 14.1.4 VPN机制的优缺点 ······································································································· 393 14.2 数据加解密 ······························································································································· 394 14.2.1 何谓“明文” ··············································································································· 394 14.2.2 何谓“密文” ··············································································································· 395 14.3 数据加密类型 ··························································································································· 396 14.3.1 对称加密 ······················································································································· 396 14.3.2 非对称加密 ··················································································································· 397 14.4 哈希算法 ··································································································································· 398 14.4.1 常见的哈希算法 ··········································································································· 399 14.4.2 哈希算法的特性 ··········································································································· 399 14.5 基于IPSec的VPN ····················································································································· 400 14.5.1 IPSec的工作模式 ·········································································································· 400 14.5.2 IPSec的组成要素 ·········································································································· 401 14.5.3 AH及ESP协议运行时需要设置的参数 ······································································· 409 14.5.4 安装IPSec参数的管理工具 ···························································································411 14.5.5 配置传输模式IPSec VPN ······························································································411 14.6 Linux中的IPSec架构 ·············································································································· 420 14.6.1 IPSec机制的SPD ··········································································································· 421 14.6.2 IPSec机制的SAD ·········································································································· 422 14.7 小结 ······························································································································425 第 15 章 VPN实战篇·························································································· 427 15.1 IKE ·············································································································································· 428 15.2 Preshared Keys验证模式下的传输模式VPN ···································································· 433 XIII 目    录 15.2.1 数据库服务器的设置 ··································································································· 434 15.2.2 客户端主机的设置 ······································································································· 435 15.2.3 启动VPN ······················································································································· 436 15.3 Preshared Keys验证模式下的隧道模式VPN ···································································· 437 15.3.1 VPN 服务器(A)主机上的设置 ····················································································· 438 15.3.2 VPN 服务器(B)主机上的设置 ····················································································· 439 15.4 何谓数字证书 ··························································································································· 440 15.4.1 数字证书的必要性 ······································································································· 440 15.4.2 证书管理中心 ··············································································································· 441 15.4.3 将Linux系统作为企业的CA ························································································ 447 15.5 数字证书验证模式下的传输模式VPN ·············································································· 453 15.5.1 证书的生成及保存 ······································································································· 453 15.5.2 客户端VPN主机的设置 ······························································································· 454 15.6 数字证书验证模式下的隧道模式VPN ·············································································· 457 15.6.1 证书的生成及保存 ······································································································· 457 15.6.2 设置VPN 服务器(A) ····································································································· 457 15.6.3 设置VPN 服务器(B) ····································································································· 458 15.6.4 启动IPSec ······················································································································ 459 15.7 小结 ············································································································································ 459 第 16 章 VPN:L2TP Over IPSec ····································································· 461 16.1 何谓PPP ····································································································································· 462 16.2 何谓L2TP协议 ························································································································· 462 16.2.1 L2TP协议的原理 ·········································································································· 463 16.2.2 L2TP协议的安全问题 ·································································································· 465 16.2.3 L2TP协议安全问题的解决方案 ·················································································· 465 16.2.4 Client to Site的L2TP VPN结构探讨 ············································································ 466 16.2.5 L2TP 客户端及服务器之间网段的选择 ····································································· 467 16.2.6 Proxy ARP的工作原理 ································································································· 467 16.3 构建L2TP VPN ························································································································ 470 16.3.1 配置L2TP服务器 ·········································································································· 470 16.3.2 配置PPP服务器 ············································································································· 472 16.3.3 建立VPN的拨号帐户 ··································································································· 472 XIV Linux 网络安全技术与实现(第2 版) 16.3.4 证书的生成及保存 ······································································································· 473 16.3.5 配置安全策略 ··············································································································· 473 16.3.6 IKE配置文件 ················································································································· 474 16.3.7 启动L2TP服务器 ·········································································································· 475 16.4 配置L2TP客户端 ····················································································································· 475 16.4.1 生成L2TP客户端证书 ·································································································· 475 16.4.2 将证书导入Windows XP/7系统前的准备工作 ··························································· 476 16.4.3 设置Windows XP系统上的L2TP客户端 ····································································· 476 16.4.4 设置Windows 7系统中的L2TP客户端 ········································································ 484 16.5 IPSec连接穿透NAT的问题 ··································································································· 492 16.6 小结 ············································································································································ 494 第 章 防火墙的基本概念 1 01 02 03 04 05 06 07 08 1Linux 1 防火墙的基本概念第1章 Linux 网络安全技术与实现(第 版) 2 2 01 02 03 04 05 06 07 08 如 果 要 构 建 一 个 固 若 金 汤 的 企 业 级 网 络 防 火 墙 , 需 要 具 备 熟 练 的 操 作 系 统 使 用 能 力 , 也 需 要 完 整 掌 握 网 络 通 信 技 术 知 识 , 而 其 中 最 为 重 要 的 莫 过 于 T C P / I P 的 网 络 知 识 , 但 这 却 是 大 多 数 网 络 技 术 自 学 者 知 识 体 系 中 最 薄 弱 的 一 环 。 因 此 本 书 开 头 将 详 细 描 述 与 防 火 墙 相 关 的 TCP/IP技术,并讨论防火墙的原理、种类、架构及其优缺点。 1.1 TCP/IP的基本概念 O S I 标 准 将 网 络 分 为 七 层 , 而 T C P / I P 标 准 仅 把 网 络 分 为 四 层 。 不 过 , 我 们 并 不 需 要 了 解 O S I 的 七 层 架 构 , 只 需 了 解 T C P / I P 的 标 准 即 可 。 如 图 1 - 1 所 示 , 其 自 上 而 下 分 别 为 应 用 层 、 传 输层、网络层及链路层。 图1-1  TCP/IP网络模型 1 . 1 . 1 应 用 层 ❙ 常 用 的 应 用 层 通 信 协 议 包 括 H T T P 、 H T T P S 、 S M T P 、 P O P 3 及 F T P 等 , 这 些 协 议 主 要 用 于 定 义 客 户 端 与 服 务 器 端 的 数 据 交 换 方 法 , 如 O u t l o o k E x p r e s s 如 何 使 用 P O P 3 协 议 来 接 收 电 子 邮 件 。 示 例 1 . 1 显 示 了 P O P 3 协 议 的 工 作 过 程 。 本 示 例 将 使 用 T e l n e t 客 户 端 工 具 模 拟 P O P 3 客 户 端,流程如下。 步骤 01 :使用T elnet 客户端工具连接192.168.1.254主机的端口1 10。 步骤 02 :POP3 客户端向POP3服务器端发送帐户。 步骤 03 :POP3 客户端向POP3服务器端发送密码。 步骤 04 :POP3 客户端向POP3服务器端发送list命令,要求POP3服务器端列出该POP3 客 户端在服务器端上的所有信件。 步骤 05 : P O P 3 客 户 端 向 P O P 3 服 务 器 端 发 送 r e t r 1 命 令 , 要 求 P O P 3 服 务 器 端 发 送 信 箱 中 的 第 一 封 电 子 邮 件 给 P O P 3 客 户 端 。 示 例 1 . 1 中 的 虚 线 部 分 即 为 返 回 的 电 子 邮 件 内 容 。 第 章   防火墙的基本概念 3 01 02 03 04 05 06 07 08 1 步骤06:POP3 客户端向POP3服务器端发送quit命令,以便终止POP3协议的连接。 示例1.1  POP3通信协议说明 [root@mail etc]# telnet 192.168.1.254 110  Trying 192.168.1.254... Connected to localhost.localdomain (192.168.1.254). Escape character is '^]'. +OK dovecot ready. user kevin  +OK pass 12345  +OK Logged in. List  +OK 1 messages: retr 1  +OK 568 octets Return-Path: X-Original-To: kevin Delivered-To: kevin@example.com Received: by mail.example.com (Postfix, from userid 500) id 7F7FE1FADE; Mon, 19 Dec 2005 15:04:25 +0800 (CST) To: kevin@example.com Subject: TEST-1 Message-Id: <20051219070425.7F7FE1FADE@mail.example.com> Date: Mon, 19 Dec 2005 15:04:25 +0800 (CST) From: jacky@example.com X-IMAPbase: 1134975837 Status: O X-UID: 1 Content-Length: 13 X-Keywords: 1234567890 . quit  +OK Logging out. Connection closed by foreign host. [root@mail etc]# 1.1.2 传输层 ❙ 传输层用于定义数据传输方法,传输层主要定义了两种通信协议,分别是TCP协议和 UDP协议。 TCP协议:TCP协议在传输数据过程中会检查数据的完整性,因此传输中的数据是不会 ● 丢失的。如传输一封电子邮件,那么就应该选择TCP通信协议作为其传输数据的方法。 Linux 网络安全技术与实现(第 版) 4 2 01 02 03 04 05 06 07 08 U D P 协 议 : 当 选 择 U D P 协 议 作 为 数 据 传 输 方 法 时 , 其 目 的 通 常 在 于 满 足 效 率 方 面 的 要 ● 求 , 而 非 数 据 正 确 性 方 面 的 要 求 。 如 网 络 广 播 电 台 , 因 为 在 一 连 串 的 语 音 信 号 中 , 若 有 数 据 丢 失 或 者 出 现 误 码 , 并 不 会 造 成 接 收 端 听 众 的 困 扰 , 因 此 要 求 发 送 端 重 新 发 送 正确的数据也不具有任何实质意义。 1 . 1 . 3 网 络 层 ❙ 使用IP(Internet Protocol)地址来定位网络上的每一台计算机,并采用路由(Routing)方法决 定数据传输路径,将数据传输到正确的目的端。 1 . 1 . 4 链 路 层 ❙ 链 路 层 又 称 为 数 据 链 路 层 ( D a t a L i n k ) 或 网 络 接 入 层 ( N e t w o r k I n t e r f a c e ) , 也 就 是 网 络 的 基 础 设 施 , 它 可 能 是 以 太 网 ( E t h e r n e t ) 、 光 纤 ( F i b e r ) 、 无 线 网 络 ( W i r e l e s s ) 、 帧 中 继 网 络 ( F r a m e R e l a y ) 或 者 点 对 点 网 络 ( P P P ) 等 实 体 网 络 , 其 最 重 要 的 任 务 是 传 输 和 接 收 实 体 网 络 层 所 传 输 的 光电信号。 1.2 数据包 传输 数 据 在 传 输 过 程 中 , 必 须 被 分 解 成 一 个 个 的 小 碎 片 , 然 后 才 能 够 被 传 输 。 这 就 如 同 我 们 在 运 送 大 批 的 货 物 , 因 为 每 辆 卡 车 所 能 运 载 的 货 物 量 是 有 限 的 , 如 果 货 物 无 法 在 一 辆 卡 车 上 全部装载完毕,就必须使用多辆卡车来执行这项任务。 在 网 络 世 界 里 也 是 同 样 的 道 理 , 因 为 不 同 的 网 络 实 体 层 技 术 , 其 每 次 所 能 承 载 的 数 据 量 不 同 。 例 如 , 光 纤 为 4 3 5 2 个 字 节 , 而 以 太 网 为 1 5 0 0 个 字 节 , 因 此 , 数 据 在 传 输 过 程 中 , 必 须 先被分解成一个个的小碎片才能被传输,而数据传输过程是一层层地由上往下传送。 以 图 1 - 2 为 例 , 当 使 用 者 在 计 算 机 上 运 行 某 一 应 用 程 序 ( 如 M S N ) 时 , 该 应 用 程 序 一 定 会 先 定 义 一 种 数 据 交 换 方 法 ( 应 用 层 通 信 协 议 ) , 接 着 必 须 确 定 数 据 传 输 方 式 , 例 如 , 数 据 在 传 输 过 程 中 是 不 可 丢 失 或 者 错 误 的 , 那 么 就 需 要 使 用 T C P 作 为 数 据 传 输 的 方 法 ( 传 输 层 通 信 协 议 ) ; 接 着 , 为 了 能 将 数 据 正 确 地 传 输 到 目 的 端 , 我 们 使 用 网 络 上 每 台 计 算 机 唯 一 的 识 别 码 I P 地 址 , 作 为 发 送 端 和 接 收 端 的 地 址 , 但 由 于 I P 地 址 是 属 于 逻 辑 信 息 , 无 法 以 光 电 信 号 呈 现 , 而 实 体 层 的 寻 址 方 式 是 用 M A C 地 址 来 识 别 ( 假 设 实 体 层 是 以 太 网 ) , 因 此 , 当 数 据 发 送 到 实 体 层 时 , 会 在 该 数 据 中 附 加 上 发 送 端 和 接 收 端 的 M A C 地 址 , 这 样 便 可 以 将 数 据 传 输 到 正 确 的 目的地。 第 章   防火墙的基本概念 5 01 02 03 04 05 06 07 08 1 链路层(以太网) 图1-2  数据包的传输 我们使用Fedora Core内置的Wireshark软件来截取网络上所传输的数据包,即可了解整个 数据包传输的过程,如图1-3所示。以图1-3中编号6的数据包为例,中间的窗体部分就是数据 包的结构,其结构分别如下: Frame6/Ethernet II:实体层。 ● Internet Protocol:网络层。 ● Transmission Control Protocol:传输层。 ● Hypertext Transfer Protocol:应用层。 ● 图1-3  Wireshark截取的数据包 接下来继续深入探讨每层的内容及用途。首先介绍应用层,当我们把应用层的结构展开 后,即可看到整个应用层的数据内容,如图1-4所示。从数据内容中可以看到,客户端使用 HTTP1.1协议中的GET方法,去获取Web服务器根目录的HTML文档;接下来要选择一种 数据传输方法,将这些数据正确地传输到目的地,因为HTTP的数据包是不允许有任何一个 包丢失的,所以我们选用TCP协议来传输这个数据包,而这个数据包随即被加上一个TCP包 Linux 网络安全技术与实现(第 版) 6 2 01 02 03 04 05 06 07 08 头,以表明这个数据包是要使用TCP协议来传输的。  图1-4  数据包的内容 图 1 - 5 是 T C P 层 的 数 据 内 容 , 我 们 称 为 T C P 包 头 , 从 T C P 包 头 中 可 以 看 到 两 个 很 重 要 的 内 容:“Source port:1857(1857)”及“Destination port:http(80)”,这两个字段  表示发送端 计算机使用TCP 端口1857连接到目的计算机的TCP端口80。  图1-5  TCP包头的内容 在 选 择 好 数 据 传 输 方 法 后 , 接 下 来 需 要 对 数 据 包 进 行 定 位 操 作 , 而 这 个 定 位 操 作 在 I P 层 中 完 成 , 请 参 见 图 1 - 6 。 图 1 - 6 是 I P 包 头 的 数 据 内 容 , 其 中 最 重 要 的 是 “ S o u r c e : 1 9 2 . 1 6 8 . 2 . 1 0 ( 1 9 2 . 1 6 8 . 2 . 1 0 ) ” 及 “ D e s t i n a t i o n : 2 0 2 . 4 3 . 1 9 5 . 1 3 ( 2 0 2 . 4 3 . 1 9 5 . 1 3 ) ” 这 两 个 字 段  , 它 们 表 示 这 个 数 据 包 是 由 1 9 2 . 1 6 8 . 2 . 1 0 这 台 计 算 机 所 发 送 出 来 的 , 而 接 收 端 的 计 算 机 地 址 是 2 0 2 . 4 3 . 1 9 5 . 1 3 。 有 了 这 两 个 数 据 之 后 , 就 可 以 在 网 络 上 正 确 地 传 输 数 据 包 了 。  图1-6  IP包头的内容 不 过 , 这 样 就 可 以 通 过 网 络 传 输 数 据 包 了 吗 ? 当 然 是 不 行 的 。 请 考 虑 一 个 问 题 , I P 是 一 个 逻 辑 概 念 , 而 数 据 在 网 络 上 是 以 光 电 信 号 来 传 输 的 , 因 此 , 我 们 必 须 在 数 据 包 上 标 明 “ 实 体 层 ” 的 地 址 ( 在 以 太 网 实 体 层 的 地 址 是 以 太 网 网 卡 地 址 — — M e d i a A c c e s s C o n t r o l A d d r e s s , 第 章   防火墙的基本概念 7 01 02 03 04 05 06 07 08 1 MAC),请参见图1-7。在网络层处理完数据包后,即将数据包送往实体层并加上MAC 地 址,图中“Destination:00:11:22:33:44:55”以及“Source:00:0f:b0:93:b2:7d”即为MAC 地 址,它们分别代表该数据包是由哪一个网卡发送出来的,以及要发送给哪一个网卡。有了 这些完整的机制之后,就可以在网络上正常传输数据包了。  图1-7  以太网数据包包头的内容 在了解了以上各层包头的数据内容后,你是否对整个TCP/IP网络模型有了更进一步的了 解呢?或许你已经发现了一个不合理之处,例如,当我们运行ping命令去测试网络上一台计 算机时,ping的明明是IP而不是MAC地址,为什么本地计算机会知道对方计算机IP与MAC地 址的对应关系呢?如果不知道对方的MAC地址,而实体网络又是以太网,那么网络不就不 能连通了吗?没错!在以太网上,如果没有对方计算机的MAC地址,确实是无法连通的, 可以使用什么机制来解决这个问题呢? ARP通信协议 IP地址和MAC地址(MAC是一组烧录在网卡上的号码,而且MAC地址理论上是不会重复 的)都是网络上唯一的标识,在Linux系统中,可以使用ifconfig eth0命令来查看IP地址及MAC 地址,请参考示例1.2。 示例1.2  查看网卡卡号 [root@mail ~]# ifconfig eth0 eth0 Link encap:Ethernet HWaddr 00:14:85:35:50:EA inet addr:192.168.1.254 Bcast: 192.168.1.255 Mask:255.255.255.0 inet6 addr: fe80::214:85ff:fe35:50ea/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:2494776 errors:0 dropped:0 overruns:0 frame:0 TX packets:2657916 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:1302023628 (1.2 GiB) TX bytes:1746790991 (1.6 GiB) Interrupt:177 Base address:0x2000 [root@mail ~]# Linux 网络安全技术与实现(第 版) 8 2 01 02 03 04 05 06 07 08 或 许 你 会 认 为 既 然 有 了 M A C 地 址 , 为 什 么 还 需 要 I P 地 址 呢 ? 这 是 因 为 实 体 层 网 络 技 术 众 多 , 且 每 种 技 术 都 有 其 存 在 的 价 值 。 例 如 , 在 企 业 内 我 们 会 选 用 以 太 网 作 为 实 体 层 传 输 数 据 的 介 质 , 若 是 在 两 栋 距 离 约 一 、 两 百 米 的 建 筑 物 之 间 , 则 可 以 选 用 光 纤 作 为 传 输 介 质 , 如 果 要 将 台 北 和 高 雄 分 公 司 的 网 络 连 接 起 来 , 那 就 会 选 用 F r a m e R e l a y ( 帧 中 继 ) 。 M A C 地 址 是 以 太 网 的 地 址 形 式 , 在 其 他 网 络 实 体 层 技 术 中 都 会 有 其 特 有 的 地 址 形 式 , 所 以 请 注 意 : “ M A C 地 址 只 在 单 一 以 太 网 上 有 效 , 因 此 M A C 地 址 是 不 会 跨 越 路 由 器 设 备 的 ” , 也 因 此 , 当 初 TCP/IP网络模型并没有定义实体层技术一定要使用哪一种。 了 解 这 些 概 念 后 , 让 我 们 来 看 看 传 输 数 据 的 两 台 主 机 是 如 何 获 取 到 对 方 网 卡 上 的 M A C 地 址 的 。 首 先 启 动 两 台 L i n u x 主 机 , 并 在 其 中 一 台 主 机 打 开 W i r e s h a r k 数 据 包 截 取 软 件 , 接 着 使 用 p i n g 命 令 测 试 另 一 台 主 机 , 即 可 截 获 到 如 图 1 - 8 的 内 容 。 以 第 三 个 数 据 包 为 例 , 该 数 据 包 是 由 1 0 . 0 . 1 . 2 0 3 主 机 发 送 出 来 的 , 目 的 端 主 机 是 1 0 . 0 . 1 . 2 0 0 , P r o t o c o l 标 识 为 I C M P 协 议 , 而 数 据 栏 内 显 示 此 为 一 个 I C M P 的 请 求 包 , 也 就 是 1 0 . 0 . 1 . 2 0 3 主 机 去 p i n g 1 0 . 0 . 1 . 2 0 0 这 台 主 机 。 接 着 , 第 四 个 数 据 包 就 是 1 0 . 0 . 1 . 2 0 0 主 机 应 答 给 1 0 . 0 . 1 . 2 0 3 主 机 的 I C M P 数 据 包 。 我 们 因 此 可 以 推 断,10.0.1.203这台主机共发送了四次ICMP请求包给10.0.1.200主机。 图1-8  Wireshark截取ARP数据包 你 或 许 已 经 发 现 , 为 什 么 在 I C M P 数 据 包 发 送 之 前 会 出 现 两 个 A R P 协 议 数 据 包 呢 ? 没 错 , 这 就 是 我 们 要 讨 论 的 关 键 , 因 为 当 两 台 主 机 第 一 次 交 换 数 据 时 , 由 于 彼 此 都 不 知 道 对 方 的 M A C 地 址 是 什 么 , 只 有 发 送 端 主 机 知 道 目 的 端 主 机 的 I P 是 多 少 , 因 此 , 发 送 端 会 在 网 络 上 发 出 一 个 A R P 的 请 求 数 据 包 , 请 参 考 图 1 - 9 。 从 图 1 - 9 中 可 以 看 出 , A R P 的 请 求 数 据 包 是 “广播”包(因为Dst MAC为f f:f f:f f:f f:f f:f f),因此,整个网络上的主机都会收到该数据包。 图1-9  RP请求数据包的内容 第 章   防火墙的基本概念 9 01 02 03 04 05 06 07 08 1 接着来分析这个ARP请求数据包的内容,由于接收端的MAC Address是未知的,因此 Target MAC Address内容为00:00:00:00:00:00,但接收端的IP是已知的,所以Target IP Address 内容为10.0.1.200,而发送端的信息都是已知的,因此该数据包的Send MAC Address内容为 00:14:a4:32:65:12、Send IP Address内容为10.0.1.203。该数据包是属于广播包,因此网络上的 所有主机都会收到该数据包,但只有10.0.1.200这台主机会处理这个数据包,因为该数据包 内容中标明接收端IP应该是10.0.1.200,如此就等于告诉10.0.1.200这台主机,发送端的IP为 10.0.1.203,且MAC 地址为00:14:a4:32:65:12。 在接收端成功取得发送端的MAC 地址及IP 地址对应的关系之后,接收端随即会给发送 端返回一个ARP的应答数据包,请参见图1-10。我们从图1-10中看到该数据包的Dst不再是广 播数据包了,因为该字段中清楚注明这个数据包是要给哪台主机的,而数据包的内容也清楚 记录着接收端及发送端所有IP地址及MAC地址的对应状态,ARP数据包如此一来一往,即可 交换两台主机的MAC 地址信息。 图1-10  ARP应答数据包的内容 1.3 TCP、UDP及Socket的关系 了解数据在网络中的传输方式之后,接着来研究传输层中的另一个重要标记——端口(Port)。 端口在传输层中是一个很重要的概念,我们之所以能够让一台主机同时运行多个服务,都要归功 于端口这个概念。在开始讨论端口之前,我们来了解一下什么是套接字(Socket)。 Socket是指一个上面有很多“洞”的东西,比方说,计算机主板上CPU的插座、我们称 之为Socket 478或Socket939等,而Socket上面的这些洞,则称为端口。在OS的网络系统中会 有两个Socket,分别是TCP Socket及UDP Socket,Socket上各有65 536个洞,由0开始算起, 其范围为0~65 535,我们称其为Port 0~Port 65 535。 端口的作用是什么呢?以图1-11为例,图的左边是客户端,右边是服务器端,我们假 设服务器端主机上运行了Web、SSH及DNS三项服务。在TCP/IP的网络规范中,当一个网 Linux 网络安全技术与实现(第 版) 10 2 01 02 03 04 05 06 07 08 络 应 用 程 序 运 行 起 来 时 , 都 会 占 用 一 个 端 口 , 如 服 务 器 端 的 W e b 服 务 启 动 时 , 即 会 占 用 T C P S o c k e t 中 的 端 口 8 0 , 我 们 简 称 为 T C P P o r t 8 0 , 而 S S H 服 务 是 T C P P o r t 2 2 、 D N S 服 务 则 是 U D P P o r t 5 3 , 因 此 , 我 们 可 以 说 T C P P o r t 8 0 代 表 W e b 服 务 这 一 个 程 序 , T C P P o r t 2 2 代 表 S S H 服 务 这个程序,而UDP Port 53代表DNS服务这个程序。            客户端 服务器端 图1-11  TCP、UDP及端口的关系 另 外 在 客 户 端 部 分 , 我 们 假 设 客 户 端 启 动 了 浏 览 器 、 S S H 客 户 端 及 D N S 客 户 端 这 三 个 网 络 应 用 程 序 。 同 样 在 T C P / I P 的 规 范 中 , 当 客 户 端 的 网 络 应 用 程 序 启 动 时 , 也 会 占 用 某 一 个 端 口 。 如 图 1 - 1 1 所 示 , 我 们 假 设 浏 览 器 使 用 T C P P o r t 2 0 9 9 、 S S H 客 户 端 使 用 T C P P o r t 2 0 8 8 , D N S 客 户 端 则 使 用 U D P P o r t 5 5 5 5 。 因 此 , 我 们 也 可 以 说 T C P P o r t 2 0 9 9 代 表 浏 览 器 这 一 个 应 用程序,TCP Port 2088代表SSH 浏览器这个应用程序,而UDP Port 5555则代表着DNS客户端 这个应用程序。 最 后 , 让 我 们 来 看 看 端 口 存 在 的 重 要 性 , 假 设 客 户 端 的 浏 览 器 想 向 服 务 器 端 的 W e b 服 务 传 输 数 据 , 那 么 客 户 端 会 生 成 一 个 数 据 包 并 发 送 到 服 务 器 端 , 我 们 假 设 客 户 端 的 I P 为 1 0 . 0 . 1 . 2 1 9 、 服 务 器 端 的 I P 为 2 0 2 . 4 3 . 1 9 5 . 5 2 , 该 数 据 包 的 内 容 就 如 图 1 - 1 2 所 示 。 首 先 , 数 据 包 内 必 然 会 记 录 包 的 “ 来 源 ” 及 “ 目 的 ” 。 如 图 中  标 记 的 部 分 就 是 数 据 包 的 来 源 与 目 的 地 址 , 但 这 两 个 数 据 只 能 表 明 来 源 端 及 目 的 端 , 并 无 法 说 明 该 数 据 包 要 发 送 到 服 务 器 端 的 什 么 地 方 , 不 过 , T C P 包 头 内 的 信 息 将 会 标 明 包 的 去 处 。 在  所 标 记 的 部 分 即 标 明 了 数 据 包 的 去 处 , 因 此 , 当 服 务 器 端 收 到 这 个 数 据 包 后 , 系 统 就 会 依 据 这 些 信 息 把 这 个 数 据 包 交 给 T C P Port 80来处理,而TCP Port 80所代表的就是W eb服务这个程序。 第 章   防火墙的基本概念 11 01 02 03 04 05 06 07 08 1   图1-12  客户端发送到服务器端的数据包内容 当服务器端的Web服务程序收到这个数据包后,必然会应答一个数据包给客户端,但 是Web服务怎么会知道该把这个数据包回送给哪部主机呢?又该送给该主机的哪个应用程序 呢?别忘了,当客户端发送数据包给服务器端时,该数据包内已经包含了客户端的IP地址 ,以及该数据包是由客户端主机的哪个应用程序发送出来的,因此,服务器端即可根据 这些信息将数据包回送到正确位置。如图1-13即是服务器端回送给客户端的数据包,从图中 标注及标注部分可以看到,服务器端把数据包回送给客户端的TCP Port 2099,通过以上 这个例子,相信你已经了解Socket及端口的重要性。   图1-13  服务器端应答给客户端的数据包内容 端口的分类 在了解端口的用途之后,我们必须了解这多达65 536个端口是如何被分配使用的。其 实不管是TCP 端口或是UDP 端口的使用,在RFC 1700文件中都有完整的规范,我们可以到 IANA的网站(http://www.iana.org/assignments/port-numbers)中获取端口的使用列表,或是从 Linux系统中的/etc/services文件中取得这些信息。下面整理了这些端口: 公认的端口:0~1023 ● 注册的端口:1024~49151 ● 动态端口:49152~65535 ● 1. 公认的端口 公认的端口一般都应用在“服务”上,例如,Web服务在规范中会使用TCP Port 80, Linux 网络安全技术与实现(第 版) 12 2 01 02 03 04 05 06 07 08 因 为 它 是 一 个 为 人 熟 知 的 “ 规 范 ” , 因 此 当 客 户 端 要 到 W e b 服 务 器 上 访 问 W e b 服 务 时 , 客 户 端 默 认 就 会 将 数 据 包 发 送 到 W e b 服 务 器 的 T C P P o r t 8 0 。 也 因 为 有 规 范 的 存 在 , 所 以 当 我 们 要 去 访 问 远 程 的 某 个 服 务 时 , 就 不 必 特 别 打 电 话 去 询 问 : “ 你 们 家 的 W e b 服 务 是 使 用 哪 个 端 口?”,换句话说,每个服务都会有一个固定的端口,而这些公认端口的范围是0~1023。 2. 注册的端口 由 于 在 同 一 时 间 内 , 同 一 端 口 只 能 供 一 个 程 序 使 用 , 因 此 在 程 序 设 计 师 编 写 网 络 应 用 程 序 时 , 就 得 特 别 注 意 自 己 编 写 的 程 序 所 使 用 的 端 口 是 否 已 经 有 其 他 的 应 用 程 序 在 使 用 , 但 问 题 是 程 序 设 计 师 如 何 得 知 该 端 口 是 否 已 经 被 其 他 应 用 程 序 占 用 了 呢 ? 所 幸 I A N A 这 个 组 织 制 定 了 一 个 规 范 , 规 定 了 需 要 用 到 固 定 端 口 的 网 络 应 用 程 序 。 为 了 能 避 免 不 必 要 的 端 口 冲 突 , 在 设 置 端 口 之 前 , 可 先 到 I A N A 的 网 站 上 , 选 用 一 个 没 有 其 他 应 用 程 序 在 使 用 的 端 口 , 并 可 以 将 其 注 册 下 来 , 以 告 诉 其 他 程 序 设 计 师 , 某 个 端 口 已 经 被 你 选 用 并 已 经 注 册 。 通 过 I A N A 这个机制,即可避免端口冲突问题,而这些可以被使用者注册的端口范围是1024~49151。 3. 动态端口 动 态 端 口 通 常 供 临 时 使 用 。 例 如 , 几 乎 所 有 客 户 端 应 用 程 序 都 会 使 用 动 态 端 口 , 当 客 户 端 应 用 程 序 启 动 时 , 系 统 就 会 分 配 一 个 “ 动 态 端 口 ” 给 该 应 用 程 序 来 使 用 , 当 该 应 用 程 序 结 束时,即会把其占用的端口归还给系统,而这些动态端口的范围是49 152~65 535。 请 注 意 , 以 上 所 讲 的 是 “ 规 范 ” , 但 并 非 所 有 程 序 设 计 师 都 会 按 章 办 事 。 例 如 , L i n u x 系 统 上 的 S S H 客 户 端 使 用 的 端 口 通 常 都 会 在 “ 注 册 端 口 ” 范 围 内 , 其 实 这 并 不 会 对 系 统 造 成 太 大 问 题 , 原 则 上 , “ 同 一 个 端 口 在 同 一 时 间 内 不 得 有 多 个 应 用 程 序 同 时 使 用 ” , 只 要 把 握 这个原则,基本上就不会出问题。 1.4 何谓防火墙 没有防火墙的网络环境就如图1-14所示。 图1-14  没有防火墙的网络环境 第 章   防火墙的基本概念 13 01 02 03 04 05 06 07 08 1 当主机A发送数据包给主机B时,不管该数据包的内容是什么,主机B都要照单全收。例 如,主机A对主机B发送服务请求数据包,或者主机A对主机B发送攻击性的数据包,主机B 都需要将其收下。当然,如果主机B本身的服务系统在设计时考虑是很周全的,那么不管收 到的是什么样的数据包,应该都不会对系统造成任何问题,但如果主机B的服务系统本身设 计存在缺陷,那么这个攻击数据包可能使得整台计算机瞬间瘫痪。 在早期的Windows 98中,由于其NetBIOS机制在设计上有所不同,而形成了一个让黑客 足以在瞬间瘫痪掉整台计算机的致命漏洞,当时有黑客把攻击这个弱点的步骤直接写成一个 可执行程序。图1-15即为该程序运行时的界面,只要在界面中 “Target hostname/IP address:”的位置,输入想要攻击对象的 IP 地址即可,你根本不需要掌握任何高深的网络知识,而收到 这个数据包的Windows 98主机会立刻变成“蓝屏”,然后整台 计算机的网络系统瞬间瘫痪掉。被攻击的主机只有重新开机, 才能恢复原有的功能。 一个有防火墙的网络如图1-16所示。 图1-16  有防火墙的网络环境 从某个角度看,在这个架构中的防火墙就像一个路由器,只是这个路由器(Router)可以 选择哪些数据包可以将其转发到另一边,而哪些数据包不需要执行转发的操作,如此即可达 到保护防火墙后面主机的目的。但问题在于路由器是如何判断哪些数据包是需要转发的,而 哪些数据包是不需要或者不能将其转发的?关键就在于防火墙上规则(Rule)的定义了,由于 尚未介绍防火墙规则语法,因此先以口语化的方式来描述防火墙规则的大致定义方式,下面 列举两个简单例子。 示例1.3  在防火墙上指定:主机A“不得”访问主机B上的任何服务 如果数据包由eth0进入,而且数据包的来源端IP等于主机A的IP,目的端IP等于主机B的IP,就把该数据包丢 弃掉。 图1-15  WinNUKE Linux 网络安全技术与实现(第 版) 14 2 01 02 03 04 05 06 07 08 提示 示例1.4  在防火墙上指定:主机A“不得”访问主机B上的SSH服务 如 果 数 据 包 由 e t h 0 进 入 , 而 且 数 据 包 的 来 源 端 I P 等 于 主 机 A 的 I P , 目 的 端 I P 等 于 主 机 B 的 I P , 数 据 包 的 目 的 端 端 口等于22,就把该数据包丢弃掉。 1.5 防火墙的判断依据 防 火 墙 的 任 务 简 单 描 述 就 是 “ 放 行 合 法 ” 或 者 “ 封 锁 不 合 法 ” 的 数 据 包 , 第 1 . 4 一 节 中 大 致 介 绍 了 合 法 与 不 合 法 的 定 义 , 接 下 来 将 解 释 哪 些 数 据 可 以 拿 来 作 为 “ 匹 配 ” 条 件 。 事 实 上 , 可 以 拿 来 作 为 匹 配 条 件 的 数 据 相 当 多 , 但 由 于 有 些 数 据 较 为 复 杂 , 因 此 并 不 建 议 一 下 子 就 去 了 解 或 牢 记 所 有 的 匹 配 条 件 。 本 书 将 随 着 章 节 的 难 易 程 度 , 逐 一 介 绍 可 用 来 匹 配 的 条 件;首先将条件划分为以下三大类。 1 . 5 . 1 各 层 数 据 包 包 头 内 的 信 息 ❙ 在 防 火 墙 的 匹 配 条 件 中 , 最 基 本 且 最 简 单 的 就 是 数 据 包 各 层 包 头 里 面 的 信 息 , 这 里 将 根 据各层不同包头内的信息来说明。 1. 链路层 图 1 - 1 7 中 是 数 据 包 中 链 路 层 包 头 的 内 容 , 在 这 些 内 容 中 最 重 要 的 莫 过 于 M A C 地 址 , 在 防 火墙的过滤规则中,我们可以通过Source MAC来 判断数据包是由哪部主机送出来的。 图1-17  链路层数据包包头内容 我 们 可 以 将 公 司 内 所 有 登 记 有 案 的 网 卡 的 M A C 地 址 , 填 写 在 企 业 对 外 的 防 火 墙 上 , 这 样 , 非 本 公 司 的 计算机将无法经由本公司的网络连接因特网。 2. 网络层 如 图 1 - 1 8 即 为 数 据 包 中 I P 包 头 的 内 容 , 这 个 包 头 中 的 很 多 数 据 可 以 拿 来 作 为 过 滤 条 件 , 第 章   防火墙的基本概念 15 01 02 03 04 05 06 07 08 1 提示 如表1-1所示。 表1-1  IP包头中的内容解释 字段 说明 Header Length IP包头的长度 Differentiated服务 差别服务判断,执行QOS时可能会使用到,一般正常值应为0 Total Length 数据包不包含链路层包头的整体长度 Flags 标明该数据包是否被分割,或者设置数据包可不可以被分割 Time to Live 数据包的存活时间 Protocol 上层协议,如果TCP为06、UDP为17、ICMP为01,其他的上层协议 请参阅Linux系统的/etc/protocol文件 Source 来源端主机的IP地址 Destination 目的端主机的IP地址 图1-18  IP层数据包包头内容 如果我们不希望有因特网上的主机来ping公司的Web服务器,我们可通过IP包头中的Protocol字段来 判断送到Web服务器的数据包是否为ICMP包。 3. 网络传输层 图1-19即为传输层包头,在此以TCP协议为例进行说明。更准确一点讲,图1-19是一个 TCP包头的内容,在这个包头中也有相当多的信息可作为防火墙过滤的条件,如表1-2所示。 图1-19  TCP数据包包头内容 Linux 网络安全技术与实现(第 版) 16 2 01 02 03 04 05 06 07 08 提示 提示 表1-2  TCP数据包包头的内容解释 字段 说明 Source Port 来源端应用程序所使用的端口号 Destination Port 目的端应用程序所使用的端口号 Header Length TCP包头的整体长度 Flags T C P 包 头 内 的 连 接 控 制 标 志 , 请 务 必 参 阅 相 关 的 T C P / I P 书 籍 , 这 是 TCP包头中很重要的信息 如果我们只允许因特网上的主机访问Web 服务器的TCP 端口8 0 ,可将TCP包头的D es ti nati on Port作为 防火墙上的过滤条件。 1 . 5 . 2 数 据 包 所 承 载 的 数 据 内 容 ❙ 图 1 - 2 0 是 一 个 H T T P 协 议 应 用 的 数 据 包 , 从 图 中 我 们 可 以 清 楚 看 到 , 客 户 端 想 要 访 问 的 对 象 是 w w w . k i m o . c o m . t w 这 台 主 机 , 可 以 在 防 火 墙 上 使 用 “ H o s t : w w w . k i m o . c o m . t w ” 这 个 字 符串作为过滤条件。 图1-20  应用层数据包的内容 如 果 我 们 不 允 许 企 业 内 的 客 户 端 计 算 机 连 接 到 因 特 网 上 的 * . p l a y b o y . c o m 任 何 主 机 , 可 以 在 防 火 墙 上 检 查 所 有 D N S 的 名 称 解 析 包 中 是 否 包 含 “ p l a y b o y . c o m ” 这 个 字 符 串 。 如 果 有 , 就 将 这 个 数 据 包 丢 弃 , 如 此 就 可 以 让 * . p l a y b o y . c o m 主 机 名 称 解 析 失 败 , 从 而 限 制 客 户 端 计 算 机 连 接 到 * . p l a y b o y . c o m 的 任 何 主 机 。 1 . 5 . 3 连 接 状 态 ❙ 以 图 1 - 2 1 为 例 , 我 们 假 设 希 望 达 到 的 目 的 是 : “ 不 允 许 网 络 上 任 何 连 接 进 入 到 企 业 内 部 , 但 允 许 所 有 企 业 内 的 计 算 机 可 以 连 接 到 因 特 网 ” 。 这 样 的 设 定 确 实 能 够 阻 止 来 自 因 特 网 的 网 络 攻 击 威 胁 , 但 当 企 业 内 部 计 算 机 连 接 上 因 特 网 的 时 候 , 由 于 “ 企 业 内 部 ” → “ 因 特 网 ” 是 允 许 第 章   防火墙的基本概念 17 01 02 03 04 05 06 07 08 1 的,因此,由“企业内部”发送到“因特网”的数据包是可以成功穿过防火墙的;但是当因特 网主机应答企业内部的主机时,该数据包变成了由“因特网”进入“企业内部”的数据包,但 因为我们在防火墙上的规则是“因特网不允许有数据包送入企业内部”,因此,该数据包一定 会被丢弃掉,如此会造成企业内部的使用者也无法访问因特网的困境。 图1-21  连接状态判断 处理以上问题的方法其实很简单,一般防火墙都会提供所谓的“连接状态判断”机制, 而连接状态判断是一个有点难度但又不会太复杂的操作。这里列举一个简单例子,详细的 内容将在稍后章节中说明。假设企业内部计算机的IP是192.168.0.100,并且客户端计算机上 运行的是IE应用程序,其所占用的端口是TCP Port 3365,而因特网上主机IP是192.168.6.2, 并且其Web服务所使用的端口是TCP Port 80,这样,当客户端对Web服务发出服务请求时, 该数据包的结构将是192.168.0.100:3365→192.168.6.2:80,也就是192.168.0.100使用TCP Port 3365连接到192.168.6.2的TCP Port 80。 试问,在以上情况下,如果有一个结构为192.168.6.2:80→192.168.0.100:3365的数据包出现 在防火墙上时,你觉得该数据包是否应该放行,是否可以成功进入到企业内部呢?答案显然是 肯定的,因为如果外送的数据包为192.168.0.100:3365→192.168.6.2:80,那么应答的数据包一定 会是192.168.6.2:80→192.168.0.100:3365,这就是连接状态判断的原理之一。 1.6 防火墙的分类 可以根据过滤技术将防火墙分为两类:其一是数据包过滤(Packet Level Filter)防火墙;其 二是应用层(Application Level Filter)防火墙。这两种防火墙在应用上各有优缺点,适用的场 景及范围各有不同,下面将说明这两种防火墙的差异及优缺点。 1.6.1 数据包过滤防火墙 ❙ 以图1-22为例,我们假设这台计算机上共装有两块网卡,并让其扮演路由器的角色。因 此,当一个数据包从左边接口进入后,即由路由表引导到右边接口送出,接着,我们在其上 Linux 网络安全技术与实现(第 版) 18 2 01 02 03 04 05 06 07 08 运 行 数 据 包 过 滤 防 火 墙 的 操 作 , 而 这 个 防 火 墙 的 位 置 位 于 路 由 表 之 后 。 从 这 个 结 构 我 们 大 概 可以知道数据包过滤防火墙每一次执行检查的最小单位是“一个数据包”。 图1-22  数据包过滤防火墙 数据包过滤防火墙的优缺点如下: 优 点 : 由 于 数 据 包 过 滤 防 火 墙 的 检 查 范 围 是 一 个 数 据 包 , 因 此 , 当 一 个 数 据 包 从 左 边 ● 接 口 送 入 后 , 在 防 火 墙 检 查 其 无 误 之 后 , 该 数 据 包 即 可 从 右 边 接 口 送 出 , 当 然 在 数 据 包 从 右 边 接 口 送 出 之 后 , 就 再 也 与 防 火 墙 无 关 了 , 因 此 , 数 据 包 过 滤 防 火 墙 对 “ 内 存 ” 及 “ C P U 性 能 ” 的 要 求 较 低 。 通 常 2 0 0 人 以 下 的 企 业 大 约 只 需 要 一 台 P e n t i u m I I I 450及128M的内存就够了,由此可知,数据包过滤防火墙的成本较低。 另 一 个 优 点 是 , 数 据 包 过 滤 防 火 墙 其 本 身 以 路 由 器 的 形 式 在 网 络 上 工 作 , 因 此 , 数 据 包 过滤防火墙完全与“协议”无关,所以应用范围较广。 缺 点 : 因 为 数 据 包 过 滤 防 火 墙 的 检 查 范 围 只 有 一 个 数 据 包 , 因 此 , 数 据 包 过 滤 防 火 墙 ● 无 法 对 连 接 中 的 数 据 进 行 更 精 准 的 过 滤 操 作 。 比 如 说 , 我 们 无 法 使 用 数 据 包 过 滤 防 火 墙来检查一封电子邮件中是否带有计算机病毒。 1 . 6 . 2 应 用 层 防 火 墙 ❙ 数据包 过 滤 防 火 墙 是 以 路 由 方 式 将 数 据 包 转 发 到 另 一 方 , 而 应 用 层 防 火 墙 就 不 是 这 样 了 , 应 用 层 防 火 墙 不 需 要 包 含 路 由 机 制 。 以 图 1 - 2 3 为 例 , 我 们 假 设 现 在 有 一 个 S M T P 协 议 的 连 接 要 穿 过 防 火 墙 , 当 然 这 个 连 接 上 所 有 数 据 还 是 以 一 个 个 的 数 据 包 为 单 位 的 , 当 第 一 个 数 据 包 进 入 到 防 火 墙 主 机 后 , 该 数 据 包 随 即 被 一 层 一 层 地 往 上 传 递 , 最 后 这 个 数 据 包 被 应 用 层 防火墙上的应用程序过滤进程(Application Filter Process)收到;第二个数据包进入防火墙主机 之 后 , 也 是 如 此 。 其 实 该 连 接 中 的 所 有 数 据 包 都 会 被 应 用 程 序 过 滤 进 程 收 到 。 也 就 是 说 , 应 用 程 序 过 滤 进 程 将 会 收 到 该 连 接 的 所 有 数 据 包 , 因 此 , 应 用 程 序 过 滤 进 程 就 可 以 把 这 些 数 据 第 章   防火墙的基本概念 19 01 02 03 04 05 06 07 08 1 包重新还原成一封完整的电子邮件。既然是一封完整的电子邮件,应用层防火墙就能检查该 电子邮件内容中的每一个字节,甚至是电子邮件所携带的附件,当检查无误后,应用程序过 滤进程再将这封电子邮件发送到它原来的目的地。 图1-23  应用层防火墙 应用层防火墙的优缺点如下: 优点:因为应用层防火墙能够检查任何一个连接中的任何字节,因此应用层防火墙能 ● 够进行比数据包过滤防火墙更精确的过滤操作。 缺点:应用层防火墙必须将所有数据包都保存下来,并将其还原成一条完整数据内 ● 容,因此应用层防火墙一定与“协议”有关。也就是说,无法处理应用程序过滤进程 不支持的通信协议,因此,应用层防火墙的使用范围较小。 此外,由于应用层防火墙必须执行数据包的存储和还原操作,因此应用层防火墙需要更 多内存,对CPU性能的要求也很高,导致成本较高。 1.7 常见的防火墙结构 常见的防火墙结构大概可分为单机防火墙、网关式防火墙以及透明防火墙三种,而不同 的防火墙结构都有其特定的用途。接下来将介绍各种不同防火墙结构的特点及优缺点,以便 在你的网络环境中,选择一种合适的防火墙结构。当然选择正确的防火墙结构也会直接影响 整个网络环境的安全级别,这是一个不可轻视的重要主题。 1.7.1 单机防火墙 ❙ 近年来由于宽带网络服务(ADSL)的盛行,出现了所谓的单机型、多机型及网络型服 务,而这些服务的最大差异在于ISP提供给企业IP的数量。所谓单机型就是指客户只能有一 个公网IP(Public IP),而多机型可以有3个公网IP,网络型可以有8个或者16个公网IP,当然你 Linux 网络安全技术与实现(第 版) 20 2 01 02 03 04 05 06 07 08 所 选 择 的 公 网 I P 越 多 , 价 格 也 就 越 高 。 相 对 于 以 往 的 数 据 专 线 , A D S L 所 需 的 费 用 其 实 是 很 低的,因此,很多中小型企业都改用ADSL作为企业的上网方式。 如 果 企 业 选 择 A D S L 上 网 , 其 网 络 结 构 通 常 如 图 1 - 2 4 所 示 。 第 一 个 公 网 I P 通 常 会 分 配 给 网 络 地 址 转 换 器 ( N e t w o r k A d d r e s s T r a n s l a t i o n , N A T ) 来 使 用 , 而 整 个 企 业 的 内 部 网 络 就 隐 藏 在NA T之后,另外两个公网IP可能就直接分配给企业对外的服务主机使用。 图1-24  单机防火墙 这 个 结 构 最 大 的 好 处 是 成 本 低 廉 , 缺 点 则 是 企 业 对 外 的 服 务 主 机 是 直 接 挂 在 因 特 网 上 的 , 任 何 来 自 因 特 网 的 攻 击 行 为 , 都 由 这 两 部 主 机 自 己 承 担 。 因 此 建 议 不 要 使 用 这 样 的 网 络 结 构 , 在 网 络 环 境 必 须 如 此 时 , 其 实 也 有 其 他 方 式 来 解 决 安 全 性 的 问 题 。 我 们 可 以 使 用 “ 单 机 防 火 墙 ” 来 保 护 本 机 , 所 谓 的 单 机 防 火 墙 通 常 是 软 件 , 而 这 个 软 件 是 工 作 在 网 卡 的 驱 动 程 序 上 , 凡 是 要 进 出 本 机 的 数 据 包 ,都会受到这个防火墙的监控,由此达到维护本机安全的目的。 1 . 7 . 2 网 关 式 防 火 墙 ❙ 顾 名 思 义 , 网 关 式 防 火 墙 就 是 布 置 在 “ 网 关 ” 位 置 的 防 火 墙 , 网 关 式 防 火 墙 不 同 于 单 机 防 火 墙 , 单 机 防 火 墙 所 能 保 护 的 范 围 只 有 本 机 而 已 , 但 网 关 式 防 火 墙 所 能 保 护 的 范 围 则 是 整 个网络,而网关式防火墙因其结构上的差异,又可分为以下三种不同的类型。 1. 网关式防火墙类型1 以 图 1 - 2 5 为 例 , 我 们 在 上 一 个 网 络 结 构 中 发 现 了 它 的 缺 点 , 因 此 有 人 建 议 将 企 业 对 外 的 服 务 主 机 部 署 在 企 业 的 内 部 网 络 , 或 许 你 会 觉 得 很 奇 怪 , 一 般 企 业 内 的 网 络 不 都 是 私 有 I P 吗 ? 那 么 , 对 外 提 供 服 务 的 主 机 部 署 在 私 有 I P 的 位 置 , 因 特 网 上 的 使 用 者 能 够 访 问 得 到 吗 ? 第 章   防火墙的基本概念 21 01 02 03 04 05 06 07 08 1 其实这并不是什么大问题,通常在防火墙上都会伴随着一个机制,我们称其为NAT(Network Address Translation),在NAT技术中有一项我们称为“一对一NAT”。 图1-25  网关式防火墙类型1 一对一NAT的工作原理如图1-26所示。我们先在防火墙对外的接口上设置3个ISP所分 配的IP,而企业内部我们使用192.168.1.0/24这个私有IP网段,并且分别在Mail和Web主机上 设置192.168.1.1及192.168.1.2两个私有IP,接着在防火墙上设置:“当有因特网上的使用者 来访问A这个IP时,我们就将该数据包转发到192.168.1.1这个私有IP上”,然后再设置“当 192.168.1.1主机送出数据包时,我们就将该数据包转发到IP A”,如此一进一出,即可实现 一对一NAT的功能,这样就可以在防火墙上执行数据包过滤操作,达到保护Web和Mail主机 的目的。 图1-26  一对一NAT的工作原理 Linux 网络安全技术与实现(第 版) 22 2 01 02 03 04 05 06 07 08 这 个 架 构 看 起 来 似 乎 不 错 , 但 也 隐 藏 着 致 命 的 危 险 。 以 W e b 服 务 为 例 , 因 为 W e b 主 机 存 在 的 目 的 就 是 要 让 因 特 网 上 的 使 用 者 来 访 问 , 因 此 , 我 们 在 防 火 墙 上 一 定 会 开 放 供 因 特 网 上 所 有 使 用 者 都 可 以 访 问 的 W e b 主 机 的 端 口 8 0 ( 端 口 8 0 是 W e b 服 务 ) , 当 W e b 服 务 隐 含 安 全 漏 洞 时 , 将 可 能 变 成 黑 客 用 来 入 侵 网 络 的 通 道 。 多 年 前 曾 经 造 成 很 多 企 业 网 络 瘫 痪 的 N i m d a 病 毒 就是应用IIS服务的漏洞作为其传播途径。 “ h t t p : / / 1 9 2 . 1 6 8 . 1 . 1 2 9 / s c r i p t s / . . x c 1 \ x 1 c . . / w i n n t / s y s t e m 3 2 / c m d . e x e ? / c + d i r ” 是 我 从 A p a c h e W e b 服 务 的 A c c e s s L o g 中 取 出 的 一 段 记 录 , 其 中 的 意 思 是 客 户 端 试 图 使 用 浏 览 器 去 运 行 / w i n n t / s y s t e m 3 2 / 目 录 下 的 c m d . e x e 执 行 文 件 , 因 为 我 使 用 的 是 L i n u x 系 统 加 上 A p a c h e W e b 服 务 , 因 此 这 个 操 作 对 我 的 W e b 服 务 当 然 不 会 起 任 何 作 用 ; 但 如 果 是 I I S W e b 服 务 , 并 且 I I S 存 在 安全漏洞,这个客户端便达到了它的目的。 试 想 , 如 果 今 天 客 户 端 运 行 的 是 W e b 主 机 上 F T P 客 户 端 的 工 具 , 那 么 客 户 端 就 有 机 会 通 过 F T P 协 议 将 “ 后 门 程 序 ” 放 进 W e b 主 机 , 接 着 再 使 用 相 同 的 手 法 , 就 可 以 在 W e b 主 机 上 启 动 这 个 后 门 程 序 , 这 样 黑 客 就 等 于 存 在 于 企 业 网 络 的 内 部 , 当 然 防 火 墙 就 形 同 虚 设 了 。 由 此 可知,此结构是相当不明智的选择。 2. 网关式防火墙类型2 在 了 解 了 类 型 1 的 网 关 式 防 火 墙 的 缺 点 , 便 有 人 将 其 改 良 成 如 图 1 - 2 7 的 结 构 , 在 防 火 墙 上 再 多 加 一 块 网 卡 , 因 此 , 我 们 就 可 以 多 加 一 个 网 络 区 段 , 此 区 段 我 们 称 之 为 非 军 事 区 ( D e m i l i t a r i z e d Z o n e , D M Z ) , 并 将 提 供 对 外 服 务 的 主 机 部 署 在 D M Z 之 中 。 我 们 想 一 下 , 如 果 这 种 结 构 存 在 类 型 1 的 安 全 漏 洞 , 请 问 对 于 企 业 网 络 所 造 成 的 危 害 , 是 否 比 类 型 1 低 得 多 ? 因 此 建 议 无 论 如 何 , 至 少 在 防 火 墙 主 机 上 安 装 三 块 网 卡 , 把 因 特 网 上 的 使 用 者 可 以 直 接 访 问 到 的 主 机 部 署 在 D M Z 中 。 图1-27  网关式防火墙类型2 第 章   防火墙的基本概念 23 01 02 03 04 05 06 07 08 1 不过在此架构下,比较正规的做法是将真正提供服务的主机部署在企业内部网络中,如图 1-28所示,而DMZ中仅部署反向代理服务器(反向代理)。接着,告诉因特网上的所有使用者,本 公司Web服务器的IP地址是192.168.1.0。所谓反向代理服务器,其实就是一个中介程序,因此, 当因特网上的使用者提出网页请求时,这个请求必定会落在反向代理服务器之上,接着反向 代理服务器再到企业内将客户端所需要的网页取回,最后反向代理服务器再把这些数据传 回给客户端,如此才能保证服务主机的安全性。不过这样将会造成企业内主机数量大增,因 此绝大多数使用者还是会将真正的主机放在DMZ中。 图1-28  反向代理工作原理 3. 网关式防火墙类型3 为了提升网关式防火墙的安全 性,有人主张将它改良成如图1-29的 架构,其实这个架构在原理上与类型 2完全相同,其目的是把对外服务的 主机放在一个独立的网段中,只不过 这个结构使用了两台防火墙主机,因 此其安全性也就相对提升。不过,在 这个结构中选用防火墙时,请务必选 用两家不同公司的产品,以便真正发 挥出这种结构的作用。 图1-29  网关式防火墙类型3 Linux 网络安全技术与实现(第 版) 24 2 01 02 03 04 05 06 07 08 1 . 7 . 3 透 明 防 火 墙 ❙ 在 介 绍 了 单 机 防 火 墙 以 及 网 关 式 防 火 墙 之 后 , 接 下 来 讨 论 较 新 一 代 的 防 火 墙 , 我 们 称 其 为 透 明 防 火 墙 ( T r a n s p a r e n t F i r e w a l l ) 。 在 网 关 式 防 火 墙 中 , 不 管 是 哪 一 种 类 型 , 防 火 墙 本 身 就 是 一 个 路 由 器 , 因 此 在 部 署 防 火 墙 时 , 我 们 必 须 仔 细 考 虑 路 由 问 题 。 以 图 1 - 3 0 为 例 , 如 果 我 们 希 望 使 用 一 台 防 火 墙 主 机 来 保 护 原 有 的 M a i l 及 W e b 主 机 , 那 么 M a i l 及 W e b 的 I P 就 一 定 要 改 变,如果网络环境再复杂一点,那么要改变的设置也会更复杂。 图1-30  透明防火墙类型 可 以 使 用 透 明 防 火 墙 将 一 举 解 决 所 有 这 些 问 题 。 简 单 来 说 , 透 明 防 火 墙 就 是 一 个 网 桥 ( B r i d g e ) 设 备 , 并 且 在 网 桥 设 备 上 赋 予 了 过 滤 器 ( F i l t e r ) 功 能 。 因 为 网 桥 是 工 作 在 O S I 第 二 层 的 网 络 设 备 , 因 此 不 会 有 任 何 路 由 的 问 题 , 并 且 网 桥 上 可 以 不 需 要 设 置 任 何 的 I P , 如 此 就 没 有 路 由 的 问 题 。 又 因 为 防 火 墙 主 机 本 身 无 需 设 置 I P , 所 以 透 明 防 火 墙 的 部 署 能 力 相 当 强 , 隐 蔽 性 相 当 高 , 即 使 黑 客 要 攻 击 这 个 防 火 墙 , 也 可 能 会 因 为 没 有 目 的 端 I P 而 无 功 而 返 。 1.8 小结 本 章 介 绍 数 据 在 网 络 上 传 输 的 原 理 , 其 中 包 括 以 太 网 实 体 层 的 数 据 传 输 方 式 , 同 时 也 说 明 了 T C P / I P 的 基 本 概 念 以 及 应 用 层 协 议 的 概 念 , 虽 然 这 些 都 是 很 简 单 的 网 络 通 信 技 术 , 但 如 果 我 们 没 有 真 正 理 解 这 些 技 术 , 那 么 对 于 后 面 章 节 的 学 习 将 会 产 生 严 重 影 响 , 因 此 请 你 务 必 真正了解本章的内容。 第 章 Netfilter/iptables 2 01 02 03 04 05 06 07 08 25 Linux 2 Netfilter/iptables第2章 Linux 网络安全技术与实现 (第 版) 2 01 02 03 04 05 06 07 08 26 第 1 章 简 要 介 绍 了 防 火 墙 的 原 理 及 部 署 要 领 , 本 章 将 循 序 渐 进 地 介 绍 L i n u x 防 火 墙 的 核 心 部 分 , 并 采 用 深 入 浅 出 的 方 式 完 整 描 述 L i n u x 防 火 墙 的 四 大 功 能 , 分 别 是 : f i l t e r 、 n a t 、 mangle及raw,最后再结合我所设计的实际示例进行讨论。 2.1 何谓内核 内 核 ( K e r n e l ) 指 的 是 操 作 系 统 的 内 核 。 内 核 的 功 能 到 底 是 什 么 呢 ? 其 实 内 核 对 于 操 作 系 统 来 说 , 是 极 为 重 要 的 部 分 , 其 主 要 用 来 执 行 系 统 资 源 的 分 配 及 调 度 。 例 如 , 当 一 个 应 用 程 序 运 行 时 所 使 用 内 存 区 段 的 起 始 和 终 止 位 置 , 或 者 在 现 在 这 个 时 刻 哪 个 应 用 程 序 可 以 访 问 硬 盘等,都由内核来负责分配;而一个操作系统稳定与否,内核的优劣将是关键的指标。 虽 然 L i n u x 是 自 由 软 件 , 但 这 并 不 代 表 L i n u x 上 不 了 台 面 , 正 好 相 反 , L i n u x 拥 有 很 多 商 用 版 本 的 U N I X 操 作 系 统 尚 不 具 备 的 高 级 功 能 。 L i n u x 防 火 墙 就 是 一 个 很 好 的 例 子 , 无 论 其 扩 展 性 、 稳 定 性 还 是 安 全 性 , 绝 对 堪 称 业 界 的 翘 楚 。 L i n u x 内 置 的 防 火 墙 因 其 发 展 年 代 的 不 同 , 会有所差异,如表2-1所示。 表2-1  内核版本与防火墙机制的对应表 内核版本 主要的防火墙机制 Kernel 2.0 ipfwadm Kernel 2.2 ipchains Kernel 2.4 / 2.6 Netfilter/iptables 在 此 要 澄 清 一 个 概 念 , 就 是 L i n u x 这 个 名 词 的 含 义 , 很 多 人 都 曾 说 “ 我 所 使 用 的 是 L i n u x 操 作 系 统 ” , 但 这 样 的 叙 述 并 不 是 很 正 确 , 事 实 上 , 我 们 所 使 用 的 C e n t O S ( 或 者 F e d o r a Linux、Suse Linux、Red Had Enterprise Linux等)都由两大部分共同组成。如图2-1所示,图的 底 部 是 内 核 , 上 部 则 是 由 应 用 程 序 所 组 合 而 成 , 只 有 这 两 个 部 分 结 合 在 一 起 , 才 会 是 一 个 完 整 的 操 作 系 统 ; 而 其 中 内 核 是 由 L i n u s T o r v a l d s 所 带 领 的 团 队 开 发 完 成 的 ( 其 官 方 网 站 是 h t t p : / / w w w . k e r n e l . o r g ) , 而 应 用 程 序 部 分 则 由 因 特 网 上 无 私 的 程 序 设 计 师 们 所 贡 献 的 , 而 其 中 又 以 G N U 这 个 计 划 贡 献 得 最 多 , 因 此 一 个 完 整 的 操 作 系 统 应 该 包 含 “ L i n u s 所 带 领 的 团 队 ” , 再 加 上 “ G N U 这 个 计 划 ” 的 心 血 结 晶 而 成 , 所 以 这 个 系 统 比 较 正 确 的 名 称 应 该 是 G N U / L i n u x 。 因 此 , 千 万 别 再 说 你 所 学 的 系 统 叫 L i n u x , 因为Linux所指的只是“内核”部分而已。 图2-1 Linux系统的组成 第 章   Netfilter/iptables 2 01 02 03 04 05 06 07 08 27 2.2 何谓Netfilter 由于Linux的高安全性、高稳定性以及高性能的特性,加上Linux的源代码完全开放,因 而让Linux拥有极为广泛的使用群体,例如,航天工业、军事工业甚至IT产业都有Linux的身 影。但不管Linux多么强大,也不可能完全满足每种产业的需要,所幸Linux的源代码是完 全公开的,程序设计师可以依据自己的需要,在Linux内额外添加所需的功能,这样的例 子比比皆是。Netfilter就是在这种模式下诞生的,也因为这样的特性,Linux才会如此快速 地成长。 Netfilter可以说是Linux的第三代防火墙,在此之前,还有ipfwadm及ipchains两种防火 墙。但由于Netfilter防火墙比ipfwadm及ipchains出色得多,因此Linux组织就将Netfilter作为 其默认防火墙。虽然Netfilter是自由软件,但其功能、稳定性、安全性及可扩展性却丝毫 不逊于商用版的防火墙,甚至Netfilter有许多高级功能是商用版防火墙所不及的。例如, Netfilter在网络层位置就可以直接检查单一数据包所承载的数据内容,而无需用到应用层防 火墙。 2.3 Netfilter与Linux的关系 Netfilter与Linux是两个相互独立的组织,事实上,在Linux 2.4早期的版本中,并没有包 含Netfilter的功能,是到后期的版本,Linux这个组织才把Netfilter的功能收录进来。下面通过 图2-2来说明Netfilter、Linux、GNU/Linux发行组织以及使用者之间的一些关系。 从图2-2可以看到,Linux是由www.kernel.org这个组织所开发的,而Netfilter却是由www. netfilter.org组织为Linux所开发的一个新功能,但因为这个功能设计得非常完善,因此www. kernel.org这个组织每隔一段时间就会到www.netfilter.org下载最新版本的Netfilter源代码,并 且将之加入到自己所开发的Linux系统中。但www.kernel.org上所存放的都只是Linux的程序 源代码,而这些源代码只有经过编译,才能转换成CPU可以运行的二进制码。不过这个编译 过程漫长而复杂,并不是人人都有能力去做,所幸有些GNU/Linux版本的发行组织,例如, RedHat、Suse、CentOS等组织会不定期地到www.kernel.org下载最新的Linux源代码回来, 并将之制作成Linux的RPM软件。这样便可让最终用户通过RPM来管理程序,来安装最新的 Linux版本,当然,最新的Netfilter也会一起被安装进来。 Linux 网络安全技术与实现 (第 版) 2 01 02 03 04 05 06 07 08 28 图2-2 Netfilter与内核的关系 N e t f i l t e r 也 是 采 用 开 源 的 开 发 模 式 , 可 以 说 是 集 因 特 网 上 各 路 高 手 之 大 成 的 产 品 ; N e t f i l t e r 的 功 能 可 以 说 是 每 天 都 在 进 步 , 但 由 于 w w w . k e r n e l . o r g 不 可 能 每 天 都 更 新 其 内 置 的 N e t f i l t e r 版 本 , 再 加 上 G N U / L i n u x 版 本 的 发 行 组 织 , 也 不 可 能 每 天 制 作 最 新 的 L i n u x R P M 软 件 , 因 此 最 终 用 户 也 就 不 可 能 即 时 地 享 受 到 N e t f i l t e r 最 新 的 功 能 。 不 过 , 如 果 你 有 兴 趣 的 话 , 不 妨 自 己 研 究 , 或 到 w w w . k e r n e l . o r g 及 w w w . n e t f i l t e r . o r g 下 载 最 新 的 L i n u x 及 N e t f i l t e r 程 序 源 代 码 , 再 将 其 结 合 并 重 新 编 译 L i n u x , 就 可 以 使 用 N e t f i l t e r 的 最 新 功 能 了 。 2.4 Netfilter工作的位置 如 图 2 - 3 所 示 , N e t f i l t e r 是 运 行 在 L i n u x 中 的 一 个 小 功 能 , 因 为 Lin u x 是 一 个 极 度 “ 模 块 ” 化 的 内 核 , 所 以 Linu x 的 绝 大 多 数 功 能 都 以 模 块 形 式 扩 充 出 来 , 而 这 种 模 块 化 的 设 计 最 大 的 优 点 在 于 “ 弹 性 ” , 我 们 可 以 通 过 L i n u x 的 模 块 管 理 工 具 , 随 心 所 欲 地 将 模 块 载 入 内 存 , 或 者 将 某 一 个 目 前 不 需 要 使 用 的 模 块 从 内 存 中 移 除 , N e t f i l t e r 也 是 以 模 块 的 形 式 存 在 于 L i n u x 中 。 因 此 我 们 可 以 理 解 , 每 当 L i n u x 多 一 个 N e t f i l t e r 的 模 块 , 就 代 表 着 L i n u x 防 火 墙 的 功 能 多 了 一 项 , 当 然 , 有 了 更 多 模 块 , Linux防火墙的功能也就越多了。 不过在CentO S 6.0(RedH at Enterpris e Linux 6.0)开始有了点小改变,由于某些模块几乎一 定 会 被 用 到 , 因 此 R e d H a t 在 编 译 内 核 时 就 直 接 把 这 些 功 能 编 译 进 内 核 里 面 , 自 然 该 功 能 就 不 图2-3 Netfilter的工作位置 第 章   Netfilter/iptables 2 01 02 03 04 05 06 07 08 29 会有对应的模块出现。例如,在CentOS 5.x版本有一个名为xt_state.ko的模块已经不见了,但 其功能还是存在的。接下来将介绍Netfilter模块存放的目录,以及这些目录之间的差异。 /lib/modules/kernel_version/kernel/net/ipv4/netfilter/ ● arptable_filter.ko ip_conntrack_tftp.ko iptable_nat.ko ipt_MASQUERADE.ko arp_tables.ko ip_nat_amanda.ko iptable_raw.ko ipt_NETMAP.ko arpt_mangle.ko ip_nat_ftp.ko ip_tables.ko ipt_owner.ko ip_conntrack_amanda.ko ip_nat_h323.ko ipt_addrtype.ko ipt_recent.ko ip_conntrack_ftp.ko ip_nat_irc.ko ipt_ah.ko ipt_REDIRECT.ko ip_conntrack_h323.ko ip_nat.ko ipt_CLUSTERIP.ko ipt_REJECT.ko ip_conntrack_irc.ko ip_nat_pptp.ko ipt_dscp.ko ipt_SAME.ko ip_conntrack.ko ip_nat_sip.ko ipt_DSCP.ko ipt_TCPMSS.ko ip_conntrack_netbios_ns.ko ip_nat_snmp_basic.ko ipt_ecn.ko ipt_tos.ko ip_conntrack_netlink.ko ip_nat_tftp.ko ipt_ECN.ko ipt_TOS.ko ip_conntrack_pptp.ko ip_queue.ko ipt_hashlimit.ko ipt_ttl.ko ip_conntrack_proto_sctp.ko iptable_filter.ko ipt_iprange.ko ipt_TTL.ko ip_conntrack_sip.ko iptable_mangle.ko ipt_LOG.ko ipt_ULOG.ko 等 … /lib/modules/kernel_version/kernel/net/ipv6/netfilter/ ● ip6_queue.ko ip6table_raw.ko ip6t_dst.ko ip6t_hbh.ko ip6t_ipv6header.ko ip6t_REJECT.ko ip6table_filter.ko ip6_tables.ko ip6t_eui64.ko ip6t_hl.ko ip6t_LOG.ko ip6t_rt.ko ip6table_mangle.ko ip6t_ah.ko ip6t_frag.ko ip6t_HL.ko ip6t_owner.ko 等 … /lib/modules/kernel_version/kernel/net/ipv4/netfilter/目录中存放的模块只能运行在IPV4的 网络环境下;而/lib/modules/kernel_version/kernel/net/ipv6/netfilter/目录中存放的模块也只能 运行在IPV6的网络环境下。以上两个目录的模块的一个共性是都与“协议”有关。因此,我 们在使用这些模块时,必须特别留意哪个模块只能使用在哪个协议之下,这样的设计对于使 用者来说,是非常不方便的,对程序设计师而言,要维护这么多模块其实也是挺辛苦的;在 Linux 2.6.14之前的版本只有以上这两个目录。 /lib/modules/kernel_version/kernel/net/netfilter/ ● nfnetlink.ko xt_connbytes.ko xt_esp.ko xt_MARK.ko xt_policy.ko xt_statistic.ko nfnetlink_log.ko xt_connmark.ko xt_helper.ko xt_multiport.ko xt_quota.ko xt_string.ko nfnetlink_queue.ko xt_CONNMARK.ko xt_length.ko xt_NFQUEUE.ko xt_realm.ko xt_tcpmss.ko x_tables.ko xt_sctp.ko Linux 网络安全技术与实现 (第 版) 2 01 02 03 04 05 06 07 08 30 x t _ l i m i t . k o x t _ N O T R A C K . k o x t _ t c p u d p . k o x t _ C L A S S I F Y . k o x t _ c o n n t r a c k . k o x t _ m a c . k o x t _ p h y s d e v . k o x t _ S E C M A R K . k o x t _ c o m m e n t . k o x t _ d c c p . k o x t _ m a r k . k o x t _ p k t t y p e . k o x t _ s t a t e . k o x t _ C O N N S E C M A R K . k o 等 … L i n u x 从 2 . 6 . 1 4 版 本 开 始 , 其 内 置 的 N e t f i l t e r 模 块 在 设 计 上 有 了 重 大 改 变 , N e t f i l t e r 组 织 希 望 模 块 与 “ 协 议 ” 是 无 关 的 。 也 就 是 说 , 同 一 个 模 块 可 以 同 时 应 用 于 I P V 4 与 I P V 6 的 网 络 环 境 中 。 当 然 , 这 是 最 终 的 努 力 目 标 。 就 目 前 来 说 , 已 有 部 分 模 块 可 以 达 到 这 样 的 目 标 , 而 这 些 模块就存放在这个目录下。 2.5 Netfilter的命令结构 在 了 解 N e t f i l t e r 的 结 构 之 后 , 我 们 必 须 清 楚 , 这 些 模 块 只 是 提 供 某 些 过 滤 匹 配 的 功 能 而 已 , 如 果 希 望 N e t f i l t e r 能 为 我 们 做 些 事 , 就 必 须 给 予 N e t f i l t e r 执 行 “ 规 则 ” , 有 了 规 则 之 后 , N e t f i l t e r 才 会 知 道 哪 些 数 据 包 是 可 以 被 接 受 的 , 哪 些 数 据 包 是 必 须 丢 弃 的 , 又 有 哪 些 包 是 必 须 以 特 殊 方 式 来 处 理 的 。 而 赋 予 N e t f i l t e r 规 则 的 方 式 , 则 是 将 规 则 填 写 到 一 块 结 构 化 内 存 中 , 这 样 N e t f i l t e r 就 会 按 照 防 火 墙 管 理 人 员 所 给出的命令来运行。 图 2 - 4 即 为 N e t f i l t e r 存 放 规 则 的 内 存 块 , 从 图 中 可 以 看 到 内 存 被 分 为 四 个 表 ( T a b l e ) , 分 别 是 f i l t e r 、 n a t 、 m a n g l e 及 r a w 表 , 这 也 是 目 前 N e t f i l t e r 机 制 所 提 供 的 四 大 功 能 。 这 里 首 先 简 要 介 绍 这 四 个 功 能 的 用 途 , 稍 后 的 章 节 将 给 出 完 整 介 绍 及 实 际 应 用示例。 f i l t e r : f i l t e r 是 N e t f i l t e r 中 最 重 要 的 机 制 , 其 任 务 是 执 行 数 据 包 的 过 滤 操 作 , 也 就 是 起 到 ● 防火墙的作用。 n a t : n a t ( N e t w o r k A d d r e s s T r a n s l a t i o n , N A T ) 也 是 防 火 墙 上 一 个 不 可 或 缺 的 重 要 机 制 , ● 比 较 通 俗 的 方 式 来 说 , 其 功 能 就 是 I P 分 享 器 , 只 不 过 其 所 能 执 行 的 功 能 , 比 一 般 市 场 上的IP分享器功能强大得多。 表 链 filter INPUT FORWARD OUTPUT nat PREROUTING POSTROUTING OUTPUT mangle PREROUTING INPUT FORWARD OUTPUT POSTROUTING raw PREROUTING OUTPUT 图2-4 Netfilter的命令结构 第 章   Netfilter/iptables 2 01 02 03 04 05 06 07 08 31 mangle:mangle是一个很特殊的机制,我们可以通过mangle机制来修改经过防火墙内 ● 数据包的内容。 raw:负责加快数据包穿过防火墙机制的速度,由此提高防火墙的性能。 ● 在了解这四个表的用途之后,接着我们从图2-4中可以看到每个不同的表下,都有属于 各自独立的几个不同的链,而这个链的空间就是我们存放“规则”的地方。当然,不同的链 其功能及用途也是不一样的,接下来将根据防火墙的四大功能来分别介绍各个链的用途。 2.6 Netfilter的filter机制 filter是Netfilter中的防火墙机制,如果你想快速而且扎实地将防火墙功能学好,首先必须 明确理解“数据包的分类”。以图2-5为例,假设计算机上安装有两块网卡,并在计算机上 分别运行httpd及firefox两个程序。接下来将说明filter对于数据包的分类及其意义: httpd firefoxINPUT OUTPUT FORWARD eth0 eth1 图2-5 Netfilter下的数据包分类 INPUT类型:以图2-5为例,所谓INPUT类型是指“网络上其他主机发送给本机进程 ● 的数据包”,就是INPUT类型的数据包。例如,网络上其他使用者访问本机的httpd服 务时,就会生成这种类型的数据包。 OUTPUT类型:如果是“本机进程”所生成的数据包,即为OUTPUT类型的数据包。 ● 例如,使用者在本机启动firefox去访问网络上的其他主机时,就会生成这种类型的数 据包。 FORWARD类型:如果数据包对本机而言只是“路过”而已,那么这就是属于 ● FORWARD类型的数据包。在什么情况下会有这种类型的数据包产生呢?试想,如果 本机扮演的是路由器角色,是不是就会生成FORWARD类型的数据包呢? Linux 网络安全技术与实现 (第 版) 2 01 02 03 04 05 06 07 08 32 在 了 解 了 f i l t e r 对 数 据 包 的 分 类 之 后 , 接 下 来 以 f i l t e r 表 的 结 构 来 讨 论 。 图 2 - 6 就 是 f i l t e r 表 的 内容,其中有三个链,其名称分别是INPUT、FOR W ARD及OUTPUT。 filter表 INPUT链 FOR W ARD链 OUTPUT链 ………rule-1……… ………rule-1……… ………rule-1……… ………rule-2……… ………rule-2……… ………rule-2……… ………rule-3……… ………rule-3……… ………rule-3……… ………rule-4……… ………rule-4……… ………rule-4……… ………rule-5……… ………rule-5……… ………rule-5……… ………rule-6……… ………rule-6……… ………rule-7……… 图2-6 filter表结构 你 或 许 早 已 发 现 了 这 三 个 链 的 名 称 竟 与 三 种 数 据 包 类 型 的 名 称 是 一 样 的 ! 难 道 这 只 是 巧 合?其实这是特意设计的,以下将分别说明这三个链的功能。 I N P U T 链 : 请 以 图 2 - 5 为 例 来 思 考 一 个 问 题 , 如 果 我 们 要 保 护 本 机 的 h t t p d 这 个 进 程 , ● 应 该 要 注 意 哪 种 数 据 包 呢 ? 毫 无 疑 问 , 是 I N P U T 类 型 的 数 据 包 , 因 为 只 有 I N P U T 类 型 的 数 据 包 才 能 对 本 机 的 进 程 造 成 损 害 , 因 此 请 将 用 来 过 滤 I N P U T 类 型 数 据 包 的 “ 规 则 ” 填 写 在 I N P U T 链 之 中 。 例 如 , 我 们 可 以 在 I N P U T 链 中 填 写 : “ 如 果 传 入 的 数 据 包 要 到 本 机 的 T C P P o r t 8 0 , 而 且 这 个 数 据 包 是 由 1 9 2 . 1 6 8 . 2 . 1 主 机 送 来 的 , 就 将 该 数 据 包 丢 弃 ” , 如 此 即 可 达 到 保 护 h t t p d 这 个 进 程 的 目 的 。 由 以 上 的 解 释 可 以 得 知 , I N P U T 链 是 用 来 存 放 过 滤 I N P U T 类 型 数 据 包 的 规 则 , 也 就 是 说 , I N P U T 链 是 用 于 “ 保 护 ” 本 机 的机制。 O U T P U T 链 : 同 样 以 图 2 - 5 为 例 来 思 考 一 个 问 题 , 如 果 我 们 要 限 制 使 用 者 不 得 在 本 机 ● 上 使 用 F i r e f o x 来 浏 览 w w w . p l a y b o y . c o m 网 站 , 那 么 我 们 需 要 管 制 的 应 该 是 哪 一 种 类 型 的 数 据 包 ? 毫 无 疑 问 的 是 O U T P U T 类 型 的 数 据 包 , 因 此 请 将 用 来 过 滤 O U T P U T 类 型 数 据 包 的 “ 规 则 ” 填 写 在 O U T P U T 链 之 中 。 例 如 , 我 们 可 以 在 O U T P U T 链 中 填 写 : “ 如 果 数 据 包 是 由 本 机 的 进 程 所 生 成 的 , 而 且 数 据 包 是 要 送 往 w w w . p l a y b o y . c o m 网 站 的 TCP Port 80,就将该数据包丢弃掉”,如此即可限制本机进程的网络访问行为。 第 章   Netfilter/iptables 2 01 02 03 04 05 06 07 08 33 由以上可以得知,OUTPUT链用来存放过滤OUTPUT类型数据包的规则,也就是说, OUTPUT链用于“限制”本机应用程序的网络访问。 FORWARD链:以图2-5及图2-7为例来思考另一个问题,如果我们要以图2-7中的防火 ● 墙来保护Web 服务器,应该管制的是哪类数据包?毫无疑问的应该是FORWARD类型 的数据包,因此,请将用来过滤FORWARD类型数据包的“规则”填写在FORWARD 链之中。例如,我们可以在FORWARD链中填写:“如果数据包是由192.168.0.10主 机发送出来的,而且数据包要送往Web 服务器的TCP Port 80,那就将该数据包丢弃 掉”,如此可以达到以防火墙来保护Web 服务器的目的。 由以上解释可以得知,FORWARD链是用来存放过滤FORWARD类型数据包的规则,也 就是说,FORWARD链保护防火墙“后端”的主机。 图2-7 FORWARD链的功能 前面希望以一种容易理解及记忆的方法来介绍相关内容。最终,我们还是得真正去了解 Netfilter的完整结构。不过,由于Netfilter的完整结构有点复杂,因此将Netfilter的结构分成四 个部分来解释,最后将四个部分结合成完整的Netfilter机制。 图2-8是filter的完整结构图,这个结构图看起来较为复杂,但实际上并没有想象中的难 懂。首先,我们可以看到图中有两个路由表(Routing Table),虽然看到的是两个路由表,但 实际上是同一个,而这个路由表就是一般常用的路由表。在Linux系统下,我们可以使用 route-rn命令来查看路由表的内容,而路由表的目的是决定一个数据包被传输的路径, 我想这对一般使用者来说,绝对不是什么问题;另外,我们可以看到一个名为“本机进 程”的东西,这是代表在本机上所运行的应用程序,再来可以看到数据包传入(Packet IN) 及数据包传出(Packet OUT)的标识,这两个标识代表数据包进入及离开的位置,但请不要把 这两个标识与任何一个网络接口联系在一起,因为数据包传入及数据包传出不一定会与特定 的网络接口有关;最后,我们可以看到INPUT链、FORWARD链及OUTPUT链,这是filter表 的三个链。 Linux 网络安全技术与实现 (第 版) 2 01 02 03 04 05 06 07 08 34 图2-8  filter机制的结构图 在 了 解 图 2 - 8 的 内 容 之 后 , 接 下 来 将 分 三 种 不 同 的 状 况 来 解 释 网 络 数 据 包 在 f i l t e r 机 制 中 的 处理情形。 当网络数据包的目的端是本机进程时: ● 当 一 个 数 据 包 进 入 本 机 时 , 该 数 据 包 即 由 “ 数 据 包 传 入 ” 所 标 识 的 位 置 进 入 , 接 着 , 数 据 包 被 送 入 路 由 表 , 并 由 路 由 表 的 内 容 来 决 定 数 据 包 传 输 的 路 径 。 本 例 中 假 设 数 据 包 是 要 送 给 本 机 的 进 程 , 因 此 , 该 数 据 包 随 即 被 送 入 I N P U T 链 , 此 时 若 I N P U T 链 内 的 规 则 不 允 许 该 数 据 包 进 入 , 那 么 , 该 数 据 包 就 会 被 丢 弃 , 当 然 也 就 不 可 能 送 达 本 机 进 程 的 位 置 ; 反 之 , 如 果 I N P U T 链 内 的 规 则 允 许 该 数 据 包 进 入 , 该 数 据 包 即 被 送 入 本 机 进 程 的 位 置 。 从 这 个 例 子 我 们 可以看到,INPUT链机制是为保护本机进程而设计的。 当本机进程生成数据包往外发送时: ● 如 果 使 用 者 在 本 机 启 动 应 用 程 序 , 这 个 应 用 程 序 就 如 图 中 的 本 机 进 程 , 这 时 若 本 机 进 程 生 成 了 一 个 数 据 包 往 外 发 送 , 首 先 该 数 据 包 会 被 送 入 路 由 表 , 并 根 据 路 由 表 的 内 容 来 决 定 数 据 包 被 传 送 的 路 径 。 接 着 , 数 据 包 随 即 被 送 入 到 O U T P U T 链 , 此 时 若 O U T P U T 链 内 的 规 则 不 允 许 该 数 据 包 离 开 本 机 , 该 数 据 包 就 会 立 刻 被 丢 弃 掉 ; 反 之 , 该 数 据 包 即 可 由 “ 数 据 包 传 出”所标记的位置送离本机。 由 以 上 两 点 可 以 看 出 , 如 果 数 据 包 与 “ 本 机 ” 有 所 关 联 , 那 么 “ 数 据 包 传 入 ” 及 “ 数 据 出传出”应该是代表相同的一个接口,如eth0或eth1。 当网络数据包穿过本机时: ● 这 个 例 子 有 个 先 决 条 件 , 就 是 防 火 墙 是 部 署 在 网 关 位 置 , 也 就 是 网 关 式 防 火 墙 。 所 以 , 当 一 个 数 据 包 要 穿 过 防 火 墙 到 另 一 边 时 , 该 数 据 包 会 先 由 “ 数 据 包 传 入 ” 的 位 置 进 入 , 接 着 第 章   Netfilter/iptables 2 01 02 03 04 05 06 07 08 35 数据包进入路由表,由于该数据包的目的端并不是本机,因此系统会由路由表的内容来决 定,数据包是要由另一个接口送出的,并立即被送入FORWARD链,此时若FORWARD链内 的规则不允许该数据包穿过,该数据包就会被丢弃掉;反之,则该数据包即由“数据包传 出”的位置送离本机。 由以上的例子可以看到,如果数据包与“本机”是无关的,那么“数据包传入”及“数 据包传出”将分别代表两个不同的接口。 2.7 规则的匹配方式 到目前为止,相信你对filter机制已经有了更深入的了解,接下来将介绍Netfilter机制中另 一个极为重要的概念,就是数据包在每一个链之中被规则“匹配”的方式。因为在设置防火 墙规则时,一定会有为数不少的规则,而这些规则将会存在于不同的链中,当然,每个链所 包含的规则“数量”可能都不尽相同,不过不管是哪一个表的哪一个链,规则匹配的方法都 是“first match”,即所谓的“优先”匹配。以图2-9中的INPUT链为例,当我们在防火墙上 添加新规则时,这些规则是按照“先后顺序”一条一条被加入到INPUT链。因此,第一条被 加进来的规则,就会是存放在INPUT链内的第一条规则,及rule 1,最后被加进来的规则,当 然就是INPUT链中的最后一条规则。 图2-9 规则的匹配方式 当一个数据包进入INPUT链之后,filter机制就会根据该数据包的特征,从INPUT链中的 第一条规则逐一向下匹配。假设该数据包的特征在第一条规则就被匹配到,将由这条规则来 决定是否放弃该数据包,如果该规则说:“将数据包丢弃掉”,那么数据包马上就会被丢弃 掉,不管后面的规则内容是什么。相反,如果第一条规则说“该数据包可以进来”,那么该 数据包随即就进入到“本机进程”的位置,当然,不管后面的规则内容是什么也都不再重 Linux 网络安全技术与实现 (第 版) 2 01 02 03 04 05 06 07 08 36 要,这就是“优先匹配”。 不 过 , 还 有 另 一 种 情 况 必 须 加 以 讨 论 , 万 一 该 数 据 包 的 特 征 是 从 I N P U T 链 的 第 一 条 规 则 匹 配 到 最 后 一 条 规 则 , 却 都 没 有 匹 配 成 功 时 , 试 问 该 数 据 包 能 不 能 进 入 到 “ 本 机 进 程 ” ? 这 个 关 键 在 于 每 个 链 的 最 底 端 的 默 认 策 略 ( D e f a u l t P o l i c y ) 。 请 注 意 , 不 管 链 中 有 多 少 条 规 则 , 默 认 策 略 永 远 在 每 个 链 的 最 底 端 , 而 且 每 个 链 的 默 认 策 略 各 自 独 立 。 默 认 策 略 只 会 有 一 种 状 态 , 不 是 放 行 ( A C C E P T ) 就 是 丢 弃 ( D R O P ) , 因 此 如 果 默 认 策 略 的 状 态 是 A C C E P T , 那 么 该 数 据 包 就 可 以 进 入 “ 本 机 进 程 ” ; 如 果 是 D R O P , 则 该 数 据 包 就 会 在 默 认 策 略 的 位 置 上 被 丢 弃 掉,最后请注意,默认策略的默认状态是ACCEPT。 2.8 Netfilter与iptables的关系 我 们 常 听 说 L i n u x 防 火 墙 叫 做 “ i p t a b l e s ” , 其 实 这 样 的 称 呼 并 不 是 很 正 确 , 什 么 是 i p t a b l e s 呢 ? 在 前 面 我 们 提 过 N e t f i l t e r 所 需 要 的 规 则 是 存 放 在 内 存 中 的 , 但 问 题 是 防 火 墙 管 理 人 员 该 如 何 将 规 则 存 放 到 内 存 呢 ? 因 此 , 防 火 墙 管 理 人 员 会 需 要 一 个 规 则 编 辑 工 具 , 通 过 这 个 工 具 来 对 内 存 中 的 规 则 执 行 添 加 、 删 除 及 修 改 等 操 作 , 这 个 工 具 就 是 i p t a b l e s 以 及 i p 6 t a b l e s , 其 中 i p t a b l e s 是 在 I P V 4 网 络 环 境 中 使 用 , 而 i p 6 t a b l e s 是 在 I P V 6 网 络 环 境 中 使 用 , 因 此,Linux防火墙比较正确的名称应该是Netfilter/iptables。 此 外 , 对 于 i p t a b l e s 结 构 上 的 问 题 我 们 必 须 加 以 了 解 , 前 面 曾 提 到 , N e t f i l t e r 的 模 块 越 多 , 防 火 墙 的 功 能 也 就 越 多 , 而 且 我 们 可 以 通 过 升 级 内 核 的 方 式 来 达 到 一 起 升 级 N e t f i l t e r 的 目 的 。 不 过 , 防 火 墙 的 升 级 不 是 仅 仅 升 级 内 核 就 可 以 解 决 的 , 也 并 非 一 味 增 加 N e t f i l t e r 的 模 块 , 就 可 以 无 限 扩 充 N e t f i l t e r 的 功 能 。 我 们 要 知 道 , 防 火 墙 管 理 人 员 是 通 过 i p t a b l e s 工 具 , 将 “ 规 则 ” 写 入 到 N e t f i l t e r 的 规 则 数 据 库 ( 就 是 前 面 所 提 到 的 链 ) 中 , 而 这 些 规 则 有 特 定 的 “ 语 法 ” , 例 如 : “ i p t a b l e s - t f i l t e r - A I N P U T - p t c p - m s t a t e - - s t a t e E S T A B L I S H E D , R E L A T E D - j A C C E P T ” , 因 此 , 当 我 们 将 规 则 传 给 i p t a b l e s 工 具 时 , i p t a b l e s 工 具 会 先 检 查 语 法 是 否 正 确 , 如 果 不 正 确 , 则 ip tab les 工 具 会 显 示 语 法 错 误 的 警 告 信 息 ; 反 之 , ip tab les 就 会 把 这 些 规 则 写入到规则数据库中。问题是iptables工具如何得知一个“新模块”?其语法该如何下达呢? 事 实 上 , 不 是 只 有 N e t f i l t e r 有 模 块 , i p t a b l e s 工 具 也 有 模 块 , 这 些 模 块 就 存 放 在 / l i b / x T a b l e s 目 录 下 , 该 目 录 包 含 了 i p t a b l e s 及 i p 6 t a b l e s 两 个 工 具 的 模 块 。 表 2 - 2 即 为 i p t a b l e s 及 i p 6 t a b l e s 工 具 的 所 有 模 块 , 其 中 l i b x t 开 头 的 文 件 是 i p t a b l e s 的 模 块 , l i b i p 6 t 开 头 的 文 件 则 为 i p 6 t a b l e s 的 模 块 ; 这 些 模 块 理 应 与 N e t f i l t e r 的 模 块 是 一 一 对 应 的 , 如 / l i b / m o d u l e s / k e r n e l _ v e r s i o n / k e r n e l / n e t / n e t f i l t e r / 目 录 中 有 一 个 模 块 称 为 x t _ s t r i n g . k o , 在 / l i b / x T a b l e s / 目 录 中 就 会 有 一 第 章   Netfilter/iptables 2 01 02 03 04 05 06 07 08 37 个叫libxt_string.so的模块,也就是说,当我们下达与xt_string.ko相关的语法时,iptables工具 会根据libxt_string.so模块的指示去检查语法是否正确,并将Netfilter的libxt_string.ko模块载入 到系统内存中,iptables最后将规则写入到规则数据库中。 表2-2 iptables及ip6tables工具的模块列表 libipt_addrtype.so libipt_ecn.so libipt_MASQUERADE.so libipt_REDIRECT.so libipt_SET.so libipt_ULOG.so libipt_ah.so libipt_ECN.so libipt_MIRROR.so libipt_REJECT.so libipt_SNAT.so libipt_unclean.so libipt_CLUSTERIP.so libipt_icmp.so libipt_NETMAP.so libipt_SAME.so libipt_ttl.so libipt_DNAT.so libipt_LOG.so libipt_realm.so libipt_set.so libipt_TTL.so libip6t_ah.so libip6t_eui64.so libip6t_hbh.so libip6t_HL.so libip6t_ipv6header.so libip6t_mh.so libip6t_rt.so libip6t_dst.so libip6t_frag.so libip6t_hl.so libip6t_icmp6.so libip6t_LOG.so libip6t_REJECT.so libxt_CLASSIFY.so libxt_conntrack.so libxt_length.so libxt_NOTRACK.so libxt_RATEEST.so libxt_string.so libxt_TPROXY.so libxt_cluster.so libxt_dccp.so libxt_limit.so libxt_osf.so libxt_recent.so libxt_tcpmss.so libxt_TRACE.so libxt_comment.so libxt_dscp.so libxt_mac.so libxt_owner.so libxt_sctp.so libxt_TCPMSS.so libxt_u32.so libxt_connbytes.so libxt_DSCP.so libxt_mark.so libxt_physdev.so libxt_SECMARK.so libxt_TCPOPTSTRIP.so libxt_udp.so libxt_connlimit.so libxt_esp.so libxt_MARK.so libxt_pkttype.so libxt_socket.so libxt_tcp.so libxt_connmark.so libxt_hashlimit.so libxt_multiport.so libxt_policy.so libxt_standard.so libxt_time.so libxt_CONNMARK.so libxt_helper.so libxt_NFLOG.so libxt_quota.so libxt_state.so libxt_tos.so libxt_iprange.so libxt_NFQUEUE.so libxt_rateest.so libxt_statistic.so libxt_TOS.so libxt_CONNSECMARK.so 从以上内容我们可以推断,如果iptables工具没有包含下达规则中所需的模块,那么 iptables会说你所下达的语法不正确,又如果iptables包含了我们所下达语法的模块,但 Netfilter没有对应的模块可用,iptables会告诉我们某个Netfilter的模块不存在,因此,如果升 级内核或Netfilter,iptables的软件也应随之升级才行。 Linux 网络安全技术与实现 (第 版) 2 01 02 03 04 05 06 07 08 38 2.9 iptables工具的使用方法 由 于 i p t a b l e s 命 令 使 用 上 比 较 复 杂 , 导 致 很 多 有 心 学 好 N e t f i l t e r / i p t a b l e s 防 火 墙 的 人 望 而 却 步 。 其 实 i p t a b l e s 命 令 的 用 法 并 没 有 想 象 中 的 复 杂 , 只 要 跟 随 我 的 笔 触 , 你 很 快 就 会 在 不 经 意 间 把 该 记 的 东 西 通 通 都 记 了 下 来 。 因 此 , 请 千 万 别 急 着 去 参 考 任 何 有 关 i p t a b l e s 的 其 他 资 料 , 这只会增加学习上的困难。 i p t a b l e s 命 令 可 以 划 分 为 两 个 部 分 , 一 个 是 “ i p t a b l e s 命 令 参 数 ” , 另 一 个 则 是 “ 规 则 语 法 ” 。 2 . 9 . 1   i p t a b l e s 命 令 参 数 ❙ i p t a b l e s 的 参 数 相 当 多 , 但 这 并 不 表 示 你 需 要 记 住 所 有 参 数 , 我 们 实 际 上 用 到 的 参 数 并 不 多 , 只 需 要 记 住 几 个 特 定 参 数 即 可 , 而 且 i p t a b l e s 的 参 数 是 有 规 律 可 循 的 。 在 了 解 这 些 参 数 的 规 则 之 后 , 就 可 以 非 常 容 易 记 住 这 些 参 数 的 用 途 , 请 参 考 图 2 - 4 及 图 2 - 1 0 , 并 通 过 示 例 来 逐 一 理解每个参数的用法。 图2-10  规则的匹配方式 iptables的命令结构 ● i p t a b l e s - t T A B L E - 操 作 方 式 规 则 条 件 第 章   Netfilter/iptables 2 01 02 03 04 05 06 07 08 39 语法 说明 -t Table 目前的Netfilter版本内置有filter、nat、mangle及raw四个表,即Netfilter的四大功能。-t参数 的含义是选择我们所要操作的“功能”,如果这个字段没有输入,默认则是filter表 -操作方式 当我们选择好所要使用的表之后,接下来要决定如何操作这个表,在iptables工具中有很多不 同的操作方式,在此仅列出必须了解的操作方式,如下: · -L:将所选择的表内容列出 · -A:在指定的链中添加新规则 · -F:将所选择的表内容清除掉 · -P:设置某个链的默认策略 规则条件 关于规则条件稍后将有完整的说明,在此先提供三个规则,请你先不要关心其意义,只要照样 输入即可,毕竟目前我们的学习目的在于iptables的参数,而非语法。此处提供这三条规则的 目的是让你可以试着使用iptables工具,规则如下: · -p tcp -j ACCEPT · -p udp -j ACCEPT · -p icmp -j ACCEPT 示例2.1  列出filter表的所有内容 语法 ● iptables -t filter -L 语法解释 ● 语法 说明 -t filter 本次所要使用的功能是filter -L 本次对filter表所要执行的操作是list,就是将filter表的所有内容列出来。不过,我们也可以另外 加上链名,如此即可单独列出某一个链的内容,如示例2.2所示 执行结果(如图2-11所示) ●        图2-11 列出filter表的所有内容 Linux 网络安全技术与实现 (第 版) 2 01 02 03 04 05 06 07 08 40 标注代码 说明  INPUT链的所有内容  FORWARD链的所有内容,但其内容是空的,也就说,目前FORWARD链内没有任何规则存在  OUTPUT链的所有内容,但其内容是空的,也就说,目前OUTPUT链内没有任何规则存在  为INPUT链内的所有规则,从图2-11中我们可以看到,INPUT链目前只有三条规则  INPUT链的默认策略,其当前状态为ACCEPT(允许)  FORWARD链的默认策略,其当前状态为ACCEPT(允许)  OUTPUT链的默认策略,其当前状态为ACCEPT(允许) 示例2.2  列出filter表中的INPUT链的内容 语法 ● i p t a b l e s - t f i l t e r - L I N P U T 语法解释 ● 语法 说明 -t filter 本次所要使用的功能是filter - L INPUT 本次对filter表所要执行的操作是list,就是将filter表中的INPUT链内容列出 执行结果(如图2-12所示) ● 图2-12 列出filter表的INPUT链内容 示例2.3  清除filter表中的所有内容 语法 ● i p t a b l e s - t f i l t e r - F 语法解释 ● 语法 说明 -t filter 本次所要使用的功能是filter - F 本 次 操 作 是 清 除 f i l t e r 表 的 所 有 内 容 , 此 外 , 也 可 以 如 示 例 2 . 2 那 样 设 置 所 要 清 除 的 链 , 如 此 即 可 对特定的链执行清除操作 第 章   Netfilter/iptables 2 01 02 03 04 05 06 07 08 41 执行结果(如图2-13所示) ● 图2-13 将filter表所有内容清除后的结果 示例2.4  将规则添加到filter表的INPUT链中 语法 ● iptables -t filter -A INPUT -p icmp -j ACCEPT 语法解释 ● 语法 说明 -t filter 本次所要使用的功能是filter -A INPUT 将规则加入到INPUT链中 规则 -p icmp -j ACCEPT,为本次添加到INPUT链的规则,在此暂时不必关心规则的内容 执行结果(如图2-14所示) ●  图2-14 将规则添加到INPUT链后的结果 标注代码 说明  为本次所添加的规则 示例2.5  将FORWARD链的默认策略设置为DROP 语法 ● iptables -t filter -P FORWARD DROP Linux 网络安全技术与实现 (第 版) 2 01 02 03 04 05 06 07 08 42 语法解释 ● 语法 说明 -t filter 本次所要使用的功能是filter -P FORWARD 本次所要设置的是FORWARD链的策略 DROP 将FORWARD链的默认策略设置为DROP 执行结果(如图2-15所示) ●  图2-15 将FORWARD链的默认策略设置为DROP后的结果 标注代码 说明  FORWARD链的默认策略已经被设置为DROP 注意事项 ● i p t a b l e s 的 - F 参 数 不 会 影 响 到 默 认 策 略 的 状 态 , 要 改 变 默 认 策 略 的 状 态 , 一 定 要 使 用 - P 的 参数来设置。 示例2.6  在INPUT链中插入新的规则 语法 ● i p t a b l e s - t f i l t e r - I I N P U T 2 - p t c p - j A C C E P T 语法解释 ● 语法 说明 -t filter 本次要使用的功能是filter -I INPUT 在INPUT链中插入新的规则 2 插入到第二条规则的位置 规则 -p tcp -j ACCEPT是本次要插入的规则内容 第 章   Netfilter/iptables 2 01 02 03 04 05 06 07 08 43 执行结果(如图2-16所示) ●      图2-16 在INPUT链中插入新的规则 标注代码 说明  INPUT链的原有内容  我们可以在-L参数后面加上--line-number参数,这样就会在规则前面自动加上行号  将-p icmp -j ACCEPT插入到INPUT链的第二行  验证步骤的操作是否成功  在INPUT链的第二行位置果真添加了一条新的规则 示例2.7  取代INPUT链内已经存在的规则 语法 ● iptables -t filter -R INPUT 2 -p tcp -j ACCEPT 语法解释 ● 语法 说明 -t filter 本次所要使用的功能是filter -R INPUT 取代INPUT链已经存在的规则 2 取代原来的第二条规则 规则 -p tcp -j ACCEPT,用本规则取代原来的规则 Linux 网络安全技术与实现 (第 版) 2 01 02 03 04 05 06 07 08 44 执行结果(如图2-17所示) ●     图2-17 取代INPUT链中原来的规则 标注代码 说明  INPUT链的原来的第二条规则  用-p tcp -j ACCEPT取代原来的第二条规则  验证步骤  的操作是否成功  INPUT链原来的第二条规则已经被取代 示例2.8  删除INPUT链中已经存在的规则 语法 ● i p t a b l e s - t f i l t e r - D I N P U T 2 语法解释 ● 语法 说明 -t filter 本次所要使用的功能是filter -D INPUT 删除INPUT链已经存在的规则 2 删除原来的第二条规则 执行结果(如图2-18所示) ●     图2-18 删除INPUT链中原有的规则 第 章   Netfilter/iptables 2 01 02 03 04 05 06 07 08 45 标注代码 说明  INPUT链原来的第二条规则  删除INPUT链的第二条规则  验证步骤的操作是否成功  INPUT链原来的第二条规则已经被删除 看完以上七个参数后,你是否在“不小心”的情况下就记住了呢?事实上,你所记住 的比你以为记住的还要多,怎么说呢?你可以将刚刚所学的七个参数套用到其他表上。下 面将演示如果在其他表中使用这些参数,当然啦!其他较为具体的内容会在稍后章节详细 介绍,现在你只需了解如何使用这七个参数就可以了。 示范2.1  nat表的操作 操作过程(如图2-19所示) ●         图2-19 nat表的操作示范 Linux 网络安全技术与实现 (第 版) 2 01 02 03 04 05 06 07 08 46 流程解释 ● 标注代码 字段解释  使用iptables工具将nat表的内容列出  nat表的内容,并且我们可以看到nat表中的三个链,也可以看到每个链的默认策略  将规则-o eth0 -s 192.168.0.0/24 -j SNAT --to 192.168.5.178添加到NAT表的POSTROUTING链中  使用iptables工具将nat表的内容列出,以验证步骤  的操作是否成功  我们可以看到步骤  的规则已经正确地添加到POSTROUTING链之中  使用iptables工具将nat表中的内容清空  验证步骤  的操作是否成功  POSTROUTING链的内容已成功地被清空了 示范2.2  mangle表的操作 操作过程(如图2-20所示) ●         图2-20 mangle表的操作示例 第 章   Netfilter/iptables 2 01 02 03 04 05 06 07 08 47 流程解释 ● 标注代码 说明  使用iptables工具将mangle表的内容列出  mangle表的内容,并且我们可以看到mangle表中的五个链,也可以看到每个链的默认策略  将规则-p icmp -j ACCEPT添加到mangle表的INPUT链中  使用iptables工具将mangle表的内容列出,以验证步骤的操作是否成功  我们可以看到步骤的规则已经正确添加到INPUT链之中  使用iptables工具将mangle表中的内容清空  验证步骤的操作是否成功  INPUT链的内容已成功地被清空了 示范2.3  raw表的操作 操作过程(如图2-21所示) ●         图2-21 raw表的操作示例 Linux 网络安全技术与实现 (第 版) 2 01 02 03 04 05 06 07 08 48 流程解释 ● 标注代码 说明  使用iptables工具将raw表的内容列出  raw表的内容,并且我们可以看到raw表中的两个链,也可以看到每个链的默认策略  将规则-p tcp -j NOTRACK添加到raw表的OUTPUT链之中  使用iptables工具将raw表的内容列出来,以验证步骤  的操作是否成功  我们可以看到步骤  的规则,已经正确的加入到OUTPUT链之中  使用iptables工具将raw表中的内容清空  验证步骤  的操作是否成功  OUTPUT链的内容已成功地被清空了 从 以 上 示 例 , 你 是 否 已 经 找 到 了 共 性 呢 ? 其 实 在 使 用 i p t a b l e s 工 具 时 , 只 需 设 置 所 要 使 用 的 功 能 ( T a b l e s ) 、 操 作 方 法 以 及 选 择 正 确 的 链 , 即 可 轻 松 地 使 用 i p t a b l e s 工 具 。 其 余 三 个 参 数 就不多做说明了,你不妨自己动手操作看看。 2 . 9 . 2   i p t a b l e s 规 则 语 法 ❙ 在 了 解 了 i p t a b l e s 参 数 的 用 法 之 后 , 接 下 来 要 进 入 较 复 杂 的 “ 语 法 ” 部 分 。 不 过 , 实 际 上 也 没 想 象 中 的 复 杂 , 只 要 能 够 了 解 语 法 间 的 关 联 性 , 即 可 很 容 易 理 解 及 记 忆 。 此 处 将 i p t a b l e s 的语法分成两部分,其一是“基本语法”,其二是“高级语法”,如下例所示。 基本语法 ● i p t a b l e s - t f i l t e r - A I N P U T - p i c m p - j D R O P 高级语法 ● i p t a b l e s - t f i l t e r - A I N P U T - m m a c - - m a c - s o u r c e 0 0 : E 0 : 1 8 : 0 0 : 7 C : A 4 - j D R O P 如 何 区 分 基 本 语 法 及 高 级 语 法 呢 ? 首 先 要 了 解 一 点 , f i l t e r 机 制 是 由 i p T a b l e _ f i l t e r . k o 模 块 提 供 的 功 能 , 而 这 个 模 块 本 身 就 已 经 提 供 了 一 些 简 单 的 匹 配 及 过 滤 方 式 , 而 所 谓 基 本 语 法 是 指 只 使 用 i p T a b l e _ f i l t e r . k o 模 块 自 身 所 提 供 的 功 能 ; 那 高 级 语 法 呢 ? 因 为 基 本 语 法 本 身 所 能 执 行 的 匹 配 及 过 滤 操 作 较 简 单 , 因 此 如 果 我 们 要 进 行 较 复 杂 的 过 滤 操 作 , 就 必 须 调 用 其 他 模 块 的 功 能 。 从 高 级 语 法 的 示 例 来 看 , - m m a c 就 是 告 知 i p t a b l e s 工 具 , 我 们 要 调 用 x t _ m a c . k o 这 个 模 块 的 功 能 , 由 于 是 调 用 其 他 模 块 , 因 此 语 法 部 分 将 会 因 模 块 而 异 , 且 每 个 模 块 的 语 法 都 是 不一样的,这部分称为“高级语法”。 由 于 i p t a b l e s 的 语 法 部 分 变 化 比 较 大 , 因 此 经 常 成 为 想 跨 入 N e t f i l t e r / i p t a b l e s 领 域 的 人 最 大 的 障 碍 。 其 实 你 根 本 不 用 担 心 这 个 问 题 , 只 要 按 照 这 里 描 述 的 步 骤 去 做 , 很 快 就 可 以 学 会 , 第 章   Netfilter/iptables 2 01 02 03 04 05 06 07 08 49 现阶段我们先学会一部分基本语法,高级语法部分则安排在下一单元中介绍。 下面将列举几个不同示例来引导你快速学习iptables基本语法部分。 示例2.9  将192.168.0.200进入本机的icmp协议包都丢弃 语法 ● iptables -A INPUT -p icmp -s 192.168.0.200 -j DROP 语法解释 ● -A INPUT ● 保护的对象 因为本示例所使用的是INPUT链,故其保护的对象是本机 -p icmp ● 原文 -p、Protocol 目的 匹配某种特定协议的数据包,本示例是匹配icmp协议包 语法 -p icmp、-p udp、-p tcp、-p all等,稍后章节将更完整地介绍其他更高级的用法 -s 192.168.0.200 ● 原文 -s、Source 对应的参数 -d、Destination 目的 匹配数据包中“来源”或“目的”端的IP 语法 - s 1 9 2 . 1 6 8 . 1 . 1 0 、 - s 1 9 2 . 1 6 8 . 1 . 0 / 2 4 、 - s w w w . p l a y b o y . c o m 、 - d 1 9 2 . 1 6 8 . 1 . 1 0 、 - d 1 9 2 . 1 6 8 . 1 . 0 / 2 4 、 - d w w w . p l a y b o y . c o m , 从以上这几个示例可以得知,IP位置的标识方法可以是单一IP或者标准的CIDR网段,至于FQDN 的部分,事实上,当使用者按下Enter键时,iptables工具会将FQDN送到DNS去执行名称解 析,最后添加的规则还以IP形式表示 -j ● 原文 JUMP 目的 将符合以上两个条件的数据包以特定方式来处理 常见的处理方式 ● ACCEPT 允许通过 DROP 将数据包丢弃掉,此种处理方式将导致来源端误以为数据包丢失而不断重新发送数据包,这个 动作将持续到连接超时为止 REJECT 将数据包丢弃掉,并回送一个Destination Unreachable的icmp数据包给发送端,发送端的应 用程序在收到这个错误信息数据包后,会终止连接 Linux 网络安全技术与实现 (第 版) 2 01 02 03 04 05 06 07 08 50 示例2.10  不允许192.168.0.200主机通过本机的DNS服务来执行名称解析 语法 ● i p t a b l e s - A I N P U T - p u d p - s 1 9 2 . 1 6 8 . 0 . 2 0 0 - - d p o r t 5 3 - j R E J E C T 语法解释 ● -A INPUT ● 保护的对象 因为本示例所使用的是INPUT链,故其保护的对象是本机 -p udp ● 目的 匹配udp协议的数据包 -s 192.168.0.200 ● 目的 匹配来源端IP为192.168.0.200的数据包 --dport 53 ● 原文 --dport、Destination Port 对应的参数 --sport、Source Port 目的 匹 配 T C P 、 U D P 包 头 中 的 “ 来 源 端 端 口 ” 或 “ 目 的 端 端 口 ” , 如 此 即 可 判 断 连 接 要 访 问 的 服 务 。 例如-p udp --dport 53代表客户端要访问udp的53端口,而udp的53端口就是DNS服务 语法 - - d p o r t 8 0 、 - - s p o r t 8 0 , 但 请 注 意 , 当 使 用 - - d p o r t 或 - - s p o r t 参 数 时 , 一 定 要 指 明 是 t c p 或 u d p 协 议 , 不 能 写 成 i p t a b l e s - A I N P U T - s 1 9 2 . 1 6 8 . 1 . 1 0 - - d p o r t 8 0 - j D R O P , 原 因 是 我 们 没 有 设 置 所 要 匹 配 的 协 议 。 因 此 不 管 是 t c p 、 u d p 或 i c m p 协 议 都 会 符 合 , 也 就 是 说 , 这 个 示 例 至 少 符 合 以下三种情况: · iptables -A INPUT -p tcp -s 192.168.1.10 --dport 80 -j DROP · iptabl es -A INPUT -p udp -s 192.168.1.10 --dport 80 -j DROP · iptables -A INPUT -p icmp -s 192.168.1.10 --dport 80 -j DROP 第 一 种 为 匹 配 t c p 协 议 及 目 的 端 端 口 为 8 0 者 , 这 并 没 有 什 么 问 题 ; 第 二 种 为 匹 配 u d p 协 议 及 目 的 端 端 口 为 8 0 者 , 这 也 没 有 什 么 问 题 ; 但 第 三 种 就 不 行 了 , 因 为 第 三 种 情 况 所 要 匹 配 的 是 i c m p 协 议及目的端端口为80者,问题是icmp协议哪来的端口 80,所以这个语法是错误的。 最后请记住一点,只要规则语法中使用到“端口参数”,一定要加上-p tcp或-p udp参数 -j REJECT ● 目的 将符合以上三项条件的数据包丢弃,并回送ICMP的错误信息数据包给来源端 示例2.11  允许192.168.0.200主机连接到本机的TELNET服务 语法 ● i p t a b l e s - A I N P U T - p t c p - s 1 9 2 . 1 6 8 . 0 . 2 0 0 - - d p o r t 2 3 - j A C C E P T 第 章   Netfilter/iptables 2 01 02 03 04 05 06 07 08 51 语法解释 ● -A INPUT ● 保护的对象 因为本示例使用INPUT链,故其保护的对象是本机 -p tcp ● 目的 匹配tcp协议的数据包 -s 192.168.0.200 ● 目的 匹配来源端IP为192.168.0.200的数据包 --dport 23 ● 目的 匹配目的端Port为23的数据包,而TCP Port 23即为TELNET服务 -j ACCEPT ● 目的 允许符合以上三个条件的数据包进入 示例2.12  允许192.168.1.0/24网段的主机向本机192.168.0.1提出任何服务请求 语法 ● iptables -A INPUT -p all -s 192.168.1.0/24 -d 192.168.0.1 -j ACCEPT 语法解释 ● -A INPUT ● 保护的对象 因为本示例使用INPUT链,故其保护的对象是本机 -p all ● 目的 匹配任何协议的数据包 -s 192.168.1.0/24 ● 目的 匹配来源端IP为192.168.1.0/24网段的数据包 -d 192.168.0.1 ● 目的 匹配目的端IP为192.168.0.1的数据包 Linux 网络安全技术与实现 (第 版) 2 01 02 03 04 05 06 07 08 52 -j ACCEPT ● 目的 允许符合以上三个条件的数据包进入 示例2.13  只允许客户端主机从eth1这个接口访问本机的SSH服务 语法 ● i p t a b l e s - A I N P U T - p t c p - i e t h 1 - - d p o r t 2 2 - j A C C E P T 语法解释 ● -A INPUT ● 保护的对象 因为本示例所使用的是INPUT链,故其保护的对象是本机 -p tcp ● 目的 匹配tcp协议的数据包 -i eth1 ● 来源 -i、in-interface 对应的参数 -o、out-interface 目的 匹配数据包的进出接口 语法 -i eth1、-o eth2 --dport 22 ● 目的 匹配目的端端口为22的数据包 -j ACCEPT ● 目的 允许符合以上三个条件的数据包进入 示例2.14  不允许本机的应用程序从eth0接口发送数据包去访问edu.uuu.com.tw以 外的网站 语法 ● i p t a b l e s - A O U T P U T - o e t h 0 - p t c p - d ! e d u . u u u . c o m . t w - - d p o r t 8 0 - j R E J E C T 语法解释 ● -A OUTPUT ● 限制的对象 因为本示例所使用的是OUTPUT链,故其目的是限制本机对外访问 第 章   Netfilter/iptables 2 01 02 03 04 05 06 07 08 53 -o eth0 ● 目的 匹配数据包是否由eth0接口送出的 -p tcp ● 目的 匹配tcp协议的数据包 -d ! edu.uuu.com.tw ● 目的 请先不要看“!”部分,所以我们看的是-d edu.uuu.com.tw,整个规则意思是“如果本机 的应用程序要从eth0接口发送tcp协议的数据包到edu.uuu.com.tw的端口80,是不允许 的”,不过当我们把“!”考虑进来时,结果就不一样了。“!”是反向的意思,因此,这个 规则的意思将变成“如果本机的应用程序要从eth0接口发送tcp协议的数据包到edu.uuu. com.tw以外其他主机的端口80,是不允许的” --dport 80 ● 目的 匹配目的端端口为80的数据包 -j REJECT ● 目的 将符合以上四个条件的数据包丢弃,并回送ICMP的错误信息包给来源端 示例2.15  不允许本企业内部的主机访问企业以外的任何网站 语法 ● iptables -A FORWARD -i eth1 -o eth0 -p tcp --dport 80 -j DROP 补充说明 ● 本示例使用网关式防护墙,因此所使用的链是FORWARD,另外假设这台防火墙主机的 eth0接口连接到因特网,而eth1连接到企业内部。 语法解释 ● -A FORWARD ● 保护的对象 因为本示例所使用的是FORWARD链,因此被保护或限制的对象是防护墙后面的主机 -i eth1 ● 目的 匹配数据包进入的接口进入 -o eth0 ● 目的 匹配数据包离开的接口,因此结合-i及-o两个参数即可匹配数据包的流向 -p tcp ● 目的 匹配tcp协议的数据包 Linux 网络安全技术与实现 (第 版) 2 01 02 03 04 05 06 07 08 54 --dport 80 ● 目的 匹配目的端端口为80的数据包 -j REJECT ● 目的 将符合以上四个条件的数据包丢弃 看 完 以 上 这 几 个 示 例 之 后 , 相 信 你 已 经 了 解 i p t a b l e s 的 基 本 语 法 , 但 为 了 更 清 楚 地 记 住 这 些参数,此处将所使用的参数进行了整理,如下整理。 接口的匹配参数 ● 参数名称 -i、-o 参数值 参数值会因为防火墙主机所使用的网络实体接口而异,以下为常见的网络接口名称: eth0:以太网的接口名称 ppp0:ppp接口的名称 lo:Local Loopback接口 fddi0:光纤网络接口 使用示例 -i eth0:匹配从eth0接口送入的数据包 -o eth0:匹配从eth0接口离开的数据包 意义 匹配数据包进出的接口 补充 可搭配“!”来代表反向,例如“-i ! eth0”,即代表匹配不是从eth0接口进入的数据包 上层协议(upper layer protocol)的匹配参数 ● 参数名称 -p 参数值 这些参数会因匹配的上层协议而异,一般常见的参数如下: tcp:匹配的上层协议是为tcp协议 udp:匹配的上层协议是为udp协议 icmp:匹配的上层协议是为icmp协议 all:匹配所有的上层协议 其 实 , 上 层 协 议 不 止 这 三 项 , 关 于 上 层 协 议 你 可 以 参 考 / e t c / p r o t o c o l s 文 件 , 下 面 摘 选 其 部 分内容: i p 0 I P i c m p 1 I C M P i g m p 2 I G M P g g p 3 G G P i p e n c a p 4 I P - E N C A P s t 5 S T t c p 6 T C P 其 中 第 一 列 是 上 层 协 议 的 名 称 ( 给 系 统 看 的 ) , 第 二 列 是 上 层 协 议 的 代 码 ( 给 系 统 看 的 ) , 第 三 列 是 上 层 协 议 的 名 称 ( 给 系 统 管 理 员 看 的 ) 。 因 此 在 使 用 - p 参 数 时 , 除 了 可 以 使 用 “ t c p ” 来 表 示 TCP协议之外,还可以使用“6”来表示TCP协议 第 章   Netfilter/iptables 2 01 02 03 04 05 06 07 08 55 参数名称 -p 使用示例 -p tcp、-p 6:匹配tcp协议 -p icmp、-p 1:匹配icmp协议 意义 匹配上层通信协议 补充 可搭配“!”来代表反向,例如“-p ! icmp”表示匹配的不是icmp的数据包 匹配来源/目的的IP地址 ● 参数名称 -s、-d 参数值 来源及目的IP地址匹配,其可以识别的IP地址格式如下: 192.168.0.1:匹配单一IP 172.10.0.0/16:匹配一个B类的网段 192.168.0.0/24:匹配一个C类的网段 192.168.0.0/28:也可以是任何标准CIDR的网段 www.playboy.com:可以是FQDN,但最后存放到链中的值还是IP 使用示例 -s 192.168.0.1:匹配从192.168.0.1主机发送来的数据包 -s 192.168.0.0/24:匹配从192.168.0.0/24网段所发送来的数据包 -d 192.168.0.10:匹配要发送到192.168.0.10主机的数据包 意义 匹配数据包的来源或目的IP地址 补充 可搭配“!”来代表反向,例如“-s ! 192.168.0.0/24”代表匹配来源端IP不是192.168.0.0/24 网段的数据包 匹配来源/目的的端口 ● 参数名称 --sport、--dport 参数值 匹配端口的用意在于匹配连接所需访问的服务。例如,我们可以使用--dport 80参数来匹配所 有要访问Web 服务的数据包,也可以使用--sport 80参数来匹配所有由Web 服务应答给客户 端的数据包 使用示例 --dport 80:匹配要访问Web 服务的数据包 --sport 110:匹配由POP3 服务应答给客户端的数据包 意义 匹配数据包的来源或目的端口 补充 可搭配“!”来代表反向,例如“--sport ! 80”代表匹配不是从Web 服务发送出去的数据包 处理方式 ● 参数名称 -j 参数值 较常见的处理方式有三种,其分别如下: ACCEPT:允许 DROP:将数据包丢弃 REJECT:将数据包丢弃,并回送给发送端一个ICMP数据包 使用示例 -j ACCEPT:允许 -j DROP:将数据包丢弃 意义 采用特定方式来处理符合条件的数据包 (续表) Linux 网络安全技术与实现 (第 版) 2 01 02 03 04 05 06 07 08 56 2 . 9 . 3   学 以 致 用 : i p t a b l e s 的 规 则 语 法 ❙ 看 完 以 上 内 容 之 后 , 你 是 否 对 i p t a b l e s 工 具 的 使 用 方 式 以 及 规 则 语 法 有 了 初 步 认 识 呢 ? 接 下来以图2-22为例,列举几个例子试试看是否真能达到期望的进度。 图2-22  iptables示例 题目 第1题 假 设 在 防 火 墙 主 机 上 执 行 “ i p t a b l e s - A I N P U T - p i c m p - j D R O P ” 命 令 , 请 问 1 9 2 . 1 6 8 . 2 . 1 5 及 192.168.0.20哪一台主机可以Ping到防火墙主机? 第2题 假设在防火墙主机上执行“iptables -A INPUT -i eth0 -p icmp -d 192.168.0.2 -j DROP”命令,请问 192.168.2.15及192.168.0.20哪一台主机可以Ping到防火墙主机的192.168.0.2这个IP? 第3题 假 设 在 防 火 墙 主 机 上 有 W e b 服 务 正 在 运 行 中 , 其 我 们 在 防 火 墙 主 机 上 执 行 “ i p t a b l e s - A I N P U T - i e t h 1 - - d p o r t 8 0 - s 1 9 2 . 1 6 8 . 0 . 0 / 2 4 - j R E J E C T ” 命 令 , 请 问 在 图 2 - 2 2 中 有 哪 些 主 机 可 以 访 问 到 该 W e b 服 务 ? 第4题 假 设 1 9 2 . 1 6 8 . 2 . 5 主 机 为 W e b 服 务 器 , 且 我 们 在 防 火 墙 主 机 上 执 行 “ i p t a b l e s - A I N P U T - i e t h 1 - p t c p - d 1 9 2 . 1 6 8 . 2 . 5 - - d p o r t 8 0 - j R E J E C T ” 命 令 , 请 问 1 9 2 . 1 6 8 . 0 . 2 0 及 1 9 2 . 1 6 8 . 2 . 1 5 哪 一 台 主 机 可 以 访问到该Web 服务? 第5题 假 设 1 9 2 . 1 6 8 . 2 . 5 及 1 9 2 . 1 6 8 . 0 . 1 0 主 机 都 是 W e b 服 务 器 , 且 我 们 在 防 火 墙 主 机 上 执 行 “ i p t a b l e s - A FORWARD -i eth0 -o eth1 -p tcp --dport 80 -j REJECT”命令,请问: · 192.168.0.20可以访问到哪一台Web 服务器? · 192.168.2.15可以访问到哪一台Web 服务器? 解答 第1题 都 不 行 。 因 为 在 这 个 示 例 中 的 匹 配 条 件 只 有 一 个 “ - p i c m p ” , 因 此 不 管 是 哪 一 台 主 机 去 p i n g 防 火 墙 主机,该数据包都会符合-p icmp的条件,如此数据包就会被丢弃掉 第2题 只 有 1 9 2 . 1 6 8 . 0 . 2 0 可 以 P i n g 到 。 因 为 在 这 个 例 子 中 有 两 个 条 件 , 分 别 是 “ - i e t h 0 ” 和 “ - p i c m p ” , 因 此 如 果 是 1 9 2 . 1 6 8 . 2 . 1 5 发 送 i c m p 包 到 1 9 2 . 1 6 8 . 0 . 2 , 该 数 据 包 就 会 符 合 以 上 两 个 条 件 , 并 遭 到 丢 弃 ; 但 如 果 是 1 9 2 . 1 6 8 . 0 . 2 0 发 送 来 的 数 据 包 , 因 为 该 包 是 从 e t h 1 进 来 的 , 因 此 并 不 会 全 部 符 合 我 们 所 设定的条件,所以192.168.0.20就可以成功ping到防火墙主机192.168.0.2的IP 第3题 都 可 以 。 因 为 这 个 语 法 是 不 正 确 的 , 前 面 特 意 提 到 过 , 如 果 在 语 法 中 有 使 用 到 - - s p o r t 或 - - d p o r t 参 数,那么就一定要指明是TCP还是UDP协议 第 章   Netfilter/iptables 2 01 02 03 04 05 06 07 08 57 第4题 都可以。因为192.168.2.15与192.168.2.5是在同一个网络实体层上,所以无论如何,防火墙都不可能 干涉到192.168.2.15对192.168.2.5的访问操作,而192.168.0.20为何也可以访问到192.168.2.5主机? 因为这个示例的规则使用的是INPUT链,而INPUT链是用来保护防火墙本机用的,因此根本不可能干涉 到192.168.0.20对192.168.2.5的访问操作,除非改用FORWARD链 第5题 · 192.168.0.20可以访问到两台Web Server,因为192.168.0.20与192.168.0.10是在防火墙的同一 侧,因此防火墙无法干涉,而192.168.0.20也可以访问到192.168.2.5,因为规则条件指的是“-i eth0 -o eth1”,也就是说,从eth0进入,并从eth1送出的数据包才符合;192.168.0.20访问 192.168.2.5主机时,该数据包并不符合这个条件 · 192.168.2.15可以访问到192.168.2.5,因为192.168.2.15与192.168.2.5是在防火墙的同一侧,因 此防火墙干涉不到这个访问操作。但当192.168.2.15要访问192.168.0.10主机时,这个数据包正好 符合条件中的-i eth0 -o eth1及--dport 80两个条件,然后数据包就会被丢弃了 如果以上示例你没有全部答对,则建议你从第2.9.1一节开始再复习一次;如果全部答对 了,恭喜你,对iptables的基本语法应该已经掌握80%以上了,且对于接下来章节所提到的语 法,也应该可以很快进入状态。 2.10 使用iptables机制来构建简单的单机防火墙 本节将以图2-23为例来构建一个简单的单 机防火墙,图中192.168.0.1即为这个示例的主 角,我们在192.168.0.1主机上分别启用SSH、 TELNET、SMTP、WEB及POP3五项服务。此 外,测试用的客户端主机分别为192.168.0.100 及192.168.0.200这两台主机,为了确保服务器 192.168.0.1的系统安全,我们使用Linux内置的防 火墙来保护服务器本身的安全,为了使防火墙的 规则更为安全可靠,请你在设置这些规则之前, 务必先将我们所需要的需求列出来之后,再来实际搭建防火墙,本示例的需求如下: 网络上的任何主机都能正常访问192.168.0.1主机上的SSH及TELNET以外的服务。 ● 网络上只有192.168.0.200这台主机可正常访问192.168.0.1主机上的所有服务。 ● 制定出规则后,接着就是将规则转换成iptables看得懂的语法,而在转换成iptables语 法时,请务必记住撰写防火墙规则的原则:“先拒绝所有连接,再逐一开放对外提供的服 务”,因此将规则转成如表2-3所示的iptables语法。 图2-23  单机防火墙示例 (续表) Linux 网络安全技术与实现 (第 版) 2 01 02 03 04 05 06 07 08 58 表2-3  单机防火墙的规则列表 1 . i p t a b l e s - P I N P U T D R O P 2 . i p t a b l e s - A I N P U T - p t c p - d 1 9 2 . 1 6 8 . 0 . 1 - - d p o r t 2 5 - j A C C E P T 3 . i p t a b l e s - A I N P U T - p t c p - d 1 9 2 . 1 6 8 . 0 . 1 - - d p o r t 8 0 - j A C C E P T 4 . i p t a b l e s - A I N P U T - p t c p - d 1 9 2 . 1 6 8 . 0 . 1 - - d p o r t 1 1 0 - j A C C E P T 5 . i p t a b l e s - A I N P U T - p t c p - s 1 9 2 . 1 6 8 . 0 . 2 0 0 - d 1 9 2 . 1 6 8 . 0 . 1 - - d p o r t 2 2 - j A C C E P T 6 . i p t a b l e s - A I N P U T - p t c p - s 1 9 2 . 1 6 8 . 0 . 2 0 0 - d 1 9 2 . 1 6 8 . 0 . 1 - - d p o r t 2 3 - j A C C E P T 当 按 照 表 2 - 3 的 内 容 运 行 i p t a b l e s 后 , I N P U T 链 的 内 容 就 会 如 图 2 - 2 4 所 示 。 前 面 曾 说 过 设 置 防 火 墙 规 则 的 原 则 : “ 先 拒 绝 所 有 连 接 , 再 逐 一 开 放 对 外 提 供 的 服 务 ” , 所 以 表 2 - 3 内 容 的 第 一 行 “ i p t a b l e s - P I N P U T D R O P ” 意 即 拒 绝 所 有 连 接 。 试 想 , 如 果 I N P U T 链 中 没 有 任 何 内 容 , 而 且 默 认 策 略 又 处 于 D R O P 状 态 , 那 么 任 何 进 入 到 I N P U T 链 的 数 据 包 都 会 直 接 进 入 默 认 策 略 而 遭 到 丢 弃 , 所 以 防 火 墙 的 规 则 不 可 能 只 写 这 一 行 。 图2-24  单机防火墙INPUT链列表 表 2 - 3 的 第 2 ~ 4 行 规 则 中 设 置 了 三 个 条 件 , 分 别 是 “ - p t c p ” 、 “ - d 1 9 2 . 1 6 8 . 0 . 1 ” 及 “ - - d p o r t X X ” 。 这 三 行 规 则 刚 好 符 合 我 们 需 求 的 第 一 项 : “ 网 络 上 的 任 何 主 机 皆 可 正 常 访 问 1 9 2 . 1 6 8 . 0 . 1 主 机 上 的 S S H 及 T E L N E T 以 外 的 服 务 ” , 我 们 来 看 看 这 三 条 规 则 是 如 何 符 合 第 一 项 需 求 的 。 假 设 网 络 上 有 一 台 主 机 需 要 访 问 服 务 器 上 的 P O P 3 服 务 , 接 下 来 分 析 一 下 这 个 访 问 操 作 能 否 成 功 。 当 访 问 P O P 3 的 数 据 包 进 入 I N P U T 链 之 后 , 将 会 由 表 2 - 3 的 第 二 行 开 始 执 行 匹 配 ( 别 忘 了 , 前 面 所 学 的 默 认 策 略 永 远 在 每 个 链 的 最 后 一 行 才 会 被 匹 配 ) , 第 二 行 规 则 中 有 三 项 匹 配 条 件 , 分 别 是 “ - p t c p ” 、 “ - d 1 9 2 . 1 6 8 . 0 . 1 ” 、 “ - - d p o r t 2 5 ” 。 而 进 来 的 数 据 包 将 会 符 合 “ - p t c p ” 及 “ - d 1 9 2 . 1 6 8 . 0 . 1 ” 两 个 条 件 , 不 过 , 第 三 个 条 件 “ - - d p o r t 2 5 ” 则 无 法 符 合 , 因 为 该 数 据 包 要 访 问 的 是 P O P 3 服 务 , 也 就 是 该 数 据 包 中 的 目 的 端 端 口 应 为 1 1 0 , 故 第 三 个 条 件 是 无 法 符 合 的 。 既 然 无 法 符 合 , 数 据 包 必 定 将 进 行 第 三 行 规 则 的 匹 配 , 在 第 三 行 规 则 中 一 样 有 三 个 条 件 , 其 实 与 上 一 行 规 则 差 不 多 , 只 有 第 三 个 条 件 不 一 样 , 是 “ - - d p o r t 8 0 ” , 因 此 这 个 访 问 P O P 3 服 务 的 数 据 包 当 然 也 符 合 完 全 符 合 第 三 行 规 则 。 接 着 数 据 包 进 入 第 四 行 规 则 进 行 匹 配 操 作 , 而 这 个 访 问 P O P 3 服 务 的 数 据 包 , 将 会 符 合 第 四 行 规 则 中 的 三 个 条 件 。 如 此 一 来 , 这 个 数 据 包 就 会 被 第 四 行 规 则 A C C E P T 进 来 , 当 然 该 数 据 包 就 无 需 继 续 往 下 匹 配 ( 别 忘 了 , 前 面 所 学 的 N e t f i l t e r 匹 配 原 则 是 优 先 匹 配 — — F i r s t M a t c h ) , 当 然 也 就 不 会 因 为 遇 到 默 认 策 略 而 遭 丢 弃 了 。 第 章   Netfilter/iptables 2 01 02 03 04 05 06 07 08 59 接着将以上的文字以图形来解说。如图2-25所示,图中的防火墙就好比默认策略,如果 这道墙上没有打开任何洞口,任何由客户端送 来的数据包都会撞壁而死。因此,如果我们要 让客户端可以正常访问某些服务,就必须在墙 上“挖洞”,当我们在服务对应的位置挖开一 个洞时,如端口 110,这时客户端送来的POP3 服务请求包就可以通过我们在防火墙上所挖开 的洞口钻进来,然后送到POP3服务上。 那如果网络上的主机试图访问服务器 的TELNET或SSH服务,是否会成功呢?其实这个访问操作并不一定会成功,因为在表2-3 的第5条及第6条规则中,比前面的规则多了一个条件“-s 192.168.0.200”;因此,网络上 除了192.168.0.200这台主机之外,任何主机都无法访问服务器上的TELNET及SSH服务, 而这两条规则将满足我们的第二项需求:“网络上只有192.168.0.200这台主机可正常访问 192.168.0.1主机上的所有服务。” 2.10.1 如何测试防火墙规则正确与否 ❙ 设置完防火墙上的规则后,就可以开始测试单机防火墙的设定值是否符合自己的需要, 而整个测试流程则分为“网络上任意主机对服务器的访问测试”及“服务器主机对网络上其 他主机的访问测试”两个阶段。 1. 网络上任意主机对服务器的访问测试 这个测试过程并不难,我们只需在192.168.0.100及192.168.0.200这两台主机上,分别对 服务器主机192.168.0.1提出各种不同的服务请求即可。如果请求有得到回应,那就表示防火 墙上对该项服务是开放的;如果没有得到回应,就代表防火墙对该项服务是没有开放的,在 此请注意以下几点: 当客户端访问一个防火墙没有开启的服务时,因为默认策略状态为DROP,因此客户 ● 端的应用程序将会有卡住的现象而不会立即断线,如果要等到断线,通常需要等一段 时间,而这段时间约为3分钟左右。 在这个试验中,如果你在客户端主机,尝试去访问服务器上防火墙有开放的服务时, ● 有可能在等很久之后,服务器才会给你应答,这个问题并不是每一台服务器都会如此, 所以当你在客户端主机上连接服务器时,服务器如果没有立即应答,就请耐心等候。为 何会有此类现象?解决办法是什么?稍后会有完整且详细的说明,现阶段请暂时把这个 图2-25  单机防火墙机制 Linux 网络安全技术与实现 (第 版) 2 01 02 03 04 05 06 07 08 60 现 象 视 为 正 常 。 如 果 网 络 状 态 机 防 火 墙 的 参 数 设 置 都 没 有 问 题 , 那 么 这 项 测 试 应 该 可 以 很 顺 利 地 完 成 , 并 且 符 合 我 们 的 需 求 。 图 2 - 2 6 为 笔 者 实 际 的 测 试 流 程 , 首 先 可 以 看 到  五 个 服 务 的 测试,其分别指代表2-4显示的内容。 表2-4  标注与测试服务的对应表 注标 测试的服务项目  Port 25、SMTP测试服务  Port 80、HTTP测试服务  Port 110、POP3测试服务  Port 22、SSH测试服务  Port 23、TELNET测试服务              图2-26  网络上任意主机对服务器的访问测试 正在连接192.168.0.180… 连接上了。 已发送HTTP请求,正在等待应答… 200 OK 长度:1701(1.7K)[text/html] 已存储 第 章   Netfilter/iptables 2 01 02 03 04 05 06 07 08 61 第 ● 阶段测试说明: 在SMTP的测试中,笔者使用Telnet 客户端工具去连接192.168.0.1主机的端口25②,接下 来需要一些时间来等待服务器的应答;当看到服务器有应答之后,就代表防火墙是允许这个 连接操作的。接着输入quit命令,以终止与SMTP 服务的连接②。 第 ● 阶段测试说明: 在HTTP的测试中,笔者使用wget工具去下载服务器上的index.html文件③,接着,我们 可以从标注④的地方清楚看到,index.html文件已经成功被下载回来了,由此也可以确定防 火墙是允许这个连接操作的。 第 ● 阶段测试说明: 在POP3的测试中,笔者使用Telnet客户端工具去连接192.168.0.1主机的端口110⑤,并且 即刻就可以得到服务器的应答,由此可以证明防火墙是允许这个连接请求操作,接着可以输 入quit命令来终止与POP3 服务的连接⑥。 第 ● 阶段测试说明: 在这个项目中,我们测试的是SSH服务,因此使用SSH客户端工具来连接192.168.0.1 服务器的SSH服务⑦,接着,大约需要约三分钟时间等待结果,最后会看到⑦中的“ssh: connect to host 192.168.0.1 port 22:Connection timed out”错误信息,这可以证明防火墙不允 许这个连接请求操作。 第 ● 阶段测试说明: 在这个项目中,我们测试的是TELNET服务,因此使用Telnet客户端工具来连接 192.168.0.1服务器的TELNET服务⑧,接着,约需三分钟的时间等待结果,最后就会看到 ⑧的“telnet:connect to address 192.168.0.1:Connection timed out;telnet:Unable to connect to remote host:Connection timed out”错误信息,这也可以证明防火墙是不允许这个连接操 作的。 2. 服务器对网络上其他主机的访问测试 在测试完“网络上任意主机对服务器的访问测试”项目之后,接着要做的是“服务器对 网络上其他主机的访问测试”。表2-3是我们在服务器上所设置的规则条件,请问在这个规 则条件下,如果我们在服务器上使用SSH 客户端去连接192.168.0.100主机上的SSH服务(该主 机并没有设置任何的防火墙参数),这个SSH的连接请求操作是否可以成功? 当你看完表2-3之后,可能很快就能回答“可以”,因为服务器上并没有对OUTPUT链 施加任何限制,乍看之下好像蛮有道理的,但可惜答案是“行不通”。我们以图2-27来解 释“行不通”的理由。首先,我们假设客户端主机上的SSH服务已经正常启动,并且在TCP Linux 网络安全技术与实现 (第 版) 2 01 02 03 04 05 06 07 08 62 Port 22位置正确运行,接着在服务器上启动SSH 客户端,我们假设SSH 客户端这次使用的是 T C P P o r t 1 2 3 4 5 ; 然 后 , 服 务 器 上 的 S S H 客 户 端 从 端 口 1 2 3 4 5 发 出 服 务 请 求 数 据 包 给 客 户 端 主 机的端口 22,而这个请求包一定可以成功送达客户端主机,因为服务器上的OUTPUT链并没 有 设 置 任 何 规 则 , 但 此 时 收 到 请 求 包 的 客 户 端 主 机 , 自 然 会 回 应 数 据 包 给 这 个 S S H 客 户 端 , 不过,这个数据包将会从192.168.0.100的TCP Port 22回送到192.168.0.1的TCP Port 12345. 试 问 , 服 务 器 的 I N P U T 链 允 许 网 络 上 的 主 机 发 送 数 据 包 到 T C P P o r t 1 2 3 4 5 吗 ? 如 果 不 允 许 , 那 么 这 个 应 答 包 当 然 就 无 法 正 确 地 回 送 到 服 务 器 上 , 因 此 , 我 们 从 服 务 器 上 连 接 网 络 上 其 他 主 机 的 操 作 将 无 法 成 功 。 或 许 你 会 问 , 在 I N P U T 链 中 将 T C P P o r t 1 2 3 4 5 打 开 不 就 可 以 了 ! 别 忘 了 , 我 们 在 第 1 章 曾 经 提 过 , 客 户 端 的 应 用 程 序 所 使 用 的 端 口 是 随 机 的 ( R a n d o m ) , 所 以 我 们 不 可 能 事 先 预 知 客 户 端 的 应 用 程 序 会 使 用 哪 个 端 口 , 也 就 不 可 能 事 先 帮 客 户 端 把 端 口打开等着客户端来使用。该如何解决这个问题呢?请耐心地往下看。 图2-27  服务器对网络上其他主机的访问操作 2 . 1 0 . 2   解 决 无 法 在 防 火 墙 主 机 上 对 外 建 立 连 接 的 问 题 ❙ 要 解 决 无 法 在 防 火 墙 主 机 上 对 外 建 立 连 接 的 问 题 , 其 实 比 想 象 中 简 单 多 了 。 在 i p c h a i n s 防 火 墙 的 年 代 , 要 解 决 这 个 问 题 的 做 法 是 将 1 0 2 4 以 上 的 端 口 全 部 打 开 , 因 为 我 们 可 以 确 认 一 点 , 客 户 端 的 应 用 程 序 必 定 使 用 大 于 1 0 2 4 以 上 的 端 口 , 所 以 只 要 将 1 0 2 4 以 上 的 端 口 打 开 , 这 个 问 题 就 解 决 了 , 而 且 这 种 方 法 同 样 可 以 用 在 N e t f i l t e r / i p t a b l e s 防 火 墙 上 。 但 这 种 做 法 实 在 令 人 难 以 接 受 , 因 为 部 署 防 火 墙 的 目 的 就 是 为 了 限 制 某 些 连 接 的 建 立 , 现 在 却 将 1 0 2 4 以 上 的 端 口全部打开,不就违反了防火墙的部署目的吗? 或 许 你 无 法 接 受 以 上 做 法 , 但 在 i p c h a i n s 防 火 墙 的 年 代 , 这 是 唯 一 的 选 择 。 到 了 N e t f i l t e r / i p t a b l e s 防 火 墙 世 界 中 , 我 们 还 有 更 简 单 、 更 安 全 的 解 决 方 案 , 那 就 是 N e t f i l t e r / i p t a b l e s 的 “ 连 接跟踪”功能,这个功能由xt_state.ko 模块所提供,这也是本章唯一介绍的模块。 第 章   Netfilter/iptables 2 01 02 03 04 05 06 07 08 63 在开始使用xt_state.ko模块之前,你必须先对xt_state.ko模块有所了解。首先,这个模块 在iptables的使用叫做state,而其在Netfilter机制中是以xt_state.ko文件存在,在此我们称其为 state模块。另一个很重要的概念你一定要确切了解,否则就无法发挥Netfilter机制的过滤器 功能,那就是state模块定义的数据包连接状态。要知道在标准TCP/IP模型中,连接状态共分 为十二种,但在state模块的描述中只有四种,分别是ESTABLISHED、NEW、RELATED及 INVALID,切勿将这四种状态与TCP/IP的十二种状态混为一谈,因为这是两种完全不相干的 定义。 例如,在TCP/IP标准的定义中,UDP及ICMP数据包是没有连接状态的,但在state模块的 定义中,任何数据包都有连接状态。接下来首先简单介绍state模块定义的四种连接状态。 1. ESTABLISHED 在刚才的实验中,客户端对服务器提出服务请求时,服务器要等很久才会应答客户端,而 且应用程序无法从防火墙主机上对外建立连接;下面以图2-28为例来解释如何处理这些问题。 图2-28  ESTABLISHED状态解释 ESTABLISHED状态与TCP、UDP及ICMP协议的关系 以图2-28为例来说明ESTABLISHED状态与TCP、UDP及ICMP协议的关系,假设图的右 边为一台设置为单机防火墙的主机,并且我们在该主机上分别进行以下三个实验。 与TCP包的关系 ● 首先在防火墙主机上运行SSH 客户端,并对网络上的SSH服务提出服务请求,而这时送 出的第一个数据包就是服务请求数据包,如果这个数据包能够“成功穿过防火墙”,那么, 接下来不管是哪个方向的数据包,其状态都会是ESTABLISHED。 Linux 网络安全技术与实现 (第 版) 2 01 02 03 04 05 06 07 08 64 与UDP包的关系 ● 假 设 我 们 在 防 火 墙 主 机 上 使 用 F i r e f o x 应 用 程 序 来 浏 览 网 页 , 而 浏 览 网 页 的 操 作 则 需 要 名 称 解 析 服 务 的 帮 助 , 才 能 顺 利 浏 览 到 网 页 , 因 此 F i r e f o x 会 发 送 一 个 U D P 数 据 包 给 D N S 服 务 器 , 以 请 求 名 称 解 析 服 务 ; 如 果 这 个 数 据 包 能 够 “ 成 功 穿 过 防 火 墙 ” , 那 么 , 接 下 来 不 管 是  哪个方向上的数据包,其状态都会是EST ABLISHED。 与ICMP包的关系 ● 假 设 我 们 在 防 火 墙 主 机 上 使 用 P i n g 命 令 来 检 测 网 络 上 其 他 主 机 , 如 果 P i n g 命 令 所 发 送 的 第 一 个 I C M P 包 可 以 “ 成 功 穿 过 防 火 墙 ” , 那 么 接 下 来 不 管 是  哪 个 方 向 上 的 数 据 包 , 其 状 态都会是EST ABLISHED。 由 以 上 解 释 可 以 得 知 , 只 要 数 据 包 能 够 成 功 穿 过 防 火 墙 , 那 么 之 后 的 所 有 数 据 包 ( 包 括 反向的所有数据包),其状态都会是EST ABLISHED。 为什么服务器要等很久才会应答客户端 这 个 问 题 的 关 键 在 于 L i n u x 主 机 上 某 些 服 务 在 接 收 到 客 户 端 的 服 务 请 求 时 , 会 将 客 户 端 的 I P 地 址 送 到 D N S 进 行 反 向 名 称 解 析 。 以 图 2 - 2 9 为 例 , 当 S S H 客 户 端 对 S S H D 提 出 服 务 请 求 时  , S S H D 即 会 将 S S H 客 户 端 所 在 主 机 的 I P 地 址 送 至 D N S 服 务 器 执 行 反 向 名 称 解 析  , 但 这 是 有 点 像 第 2 . 1 0 . 2 一 节 中 所 讨 论 的 情 况 。 这 时 数 据 包  一 定 能 够 成 功 发 送 给 D N S 服 务 器 , 因 为 防 火 墙 的 O U T P U T 链 并 没 有 设 置 任 何 参 数 , 而 D N S 服 务 器 在 收 到 这 个 数 据 包 之 后 , 当 然 也 会 回 应  。 不 过 , 这 个 数 据 包 将 会 因 匹 配 到 I N P U T 链 的 默 认 策 略 而 遭 到 丢 弃 , 这 时 , S S H D 会 因 为 等 不 到 D N S 服 务 器 的 应 答 , 而 不 断 重 复 名 称 解 析 的 操 作  , 这 个 重 复 的 操 作 要 一 直 等 到 请 求 超 时 为 止 , 此 后 S S H D 才 会 应 答 给 S S H 客 户 端  , 以 上 就 是 为 什 么 服 务 器 要 等 很 久 才 会 应 答 给 客 户 端 的 原 因 。 了 解 了 这 个 原 理 之 后 , 你 是 否 已 经 想 出 了 解 决 办 法 呢 ? 其 实 方 法 很 简 单 , 当 S S H D 发 送 数 据 包 给 D N S 服 务 器 时 , 标 注 为  的 数 据 包 已 经 成 功 穿 过 防 火 墙 , 那 么 , 接 下 来 S S H D 与 D N S 服 务 器 “ 在 这 条 连 接 上 ” 的 所 有 数 据 包 及 所 有 反 向 的 数 据 包 不 就 是 E S T A B L I S H E D 状 态 的 数 据 包 吗 ? 因 此 , 我 们 只 要 运 用 s t a t e 模 块 去 判 断 E S T A B L I S H E D 状 态 的 数 据 包 , 并 让 EST ABLISHED状态的数据包可以成功返回,就可以解决问题了。 图2-29  ESTABLISHED状态应用示例 第 章   Netfilter/iptables 2 01 02 03 04 05 06 07 08 65 解决应用程序无法从防火墙主机上对外建立新连接的问题 这个问题其实与前一个问题是完全相同的,解决方法一样,只要运用state模块去判断 ESTABLISHED状态的数据包,并让ESTABLISHED状态的数据包可以成功返回,问题就轻 松解决了。 在了解了数据包ESTABLIESHED状态的含义之后,你是否迫不及待想试试这个功能强 大的模块呢?接下来就列举一个例子,使用state模块来匹配TCP协议下ESTABLISHED状态 的数据包。 iptables -A INPUT -p tcp -m state --state ESTABLISHED -j ACCEPT 语法 说明 -p tcp 本次所匹配的是tcp协议数据包 -m state 本规则需要引用state模块 --state ESTABLISHED 给state模块的参数,告知所要匹配的是ESTABLISHED状态的数据包 -j ACCEPT 只有符合以上两个条件的数据包才能进入 要解决“单机防火墙示例”中所遇到的所有问题,我们只需要把本示例的规则加入 INPUT链之中即可,至于要加在第几行,可是一门学问了。后面将进行完整详细的说明,现 阶段就请你先加入到最后一行即可。 2. NEW 在了解ESTABLISHED这个重要的状态之后,接下来要解释的NEW也是一个非常重要的 状态,因此请务必牢记。以图2-30为例来解释什么是NEW状态,首先我们要知道NEW与协 议完全无关,其所指的是每一条连接中的第一个数据包。如图所示,客户端主机使用TCP Port 50 000,连接服务器端TCP Port 22,而这一条连接中的第一个数据包其状态就是NEW,其他又 如客户端使用TCP Port 50 001,连接到服务器端的TCP Port 22,;客户端的UDP Port 50 000,连 接到服务器端的UDP Port 53,还有客户端对服务器端送出的第一个icmp包,以上这些例子的 第一个数据包状态都是NEW。 或许你会觉得奇怪,为什么去匹配连接中 的第一个数据包?其实这个操作在设置“高级 防火墙规则”时,是很重要的一个状态,但因 为在高级防火墙规则才会用到,所以现阶段并 不打算介绍NEW状态的应用,第3.1.2一节的 第8部分将会有完整且详细的说明。 图2-30  NEW的状态解释 Linux 网络安全技术与实现 (第 版) 2 01 02 03 04 05 06 07 08 66 3. RELA TED 另 一 个 重 要 的 状 态 是 R E L A T E D , 这 个 状 态 在 “ 高 级 防 火 墙 规 则 ” 中 也 是 很 重 要 的 , 但 现 阶 段 不 介 绍 R E L A T E D 状 态 的 应 用 , 在 第 3 . 1 . 2 一 节 的 第 8 部 分 将 会 有 完 整 且 详 细 的 说 明 。 不 过,我们还是可以先大略了解什么是RELA TED状态。 你 应 该 有 在 W i n d o w s 平 台 上 使 用 t r a c e r t 这 个 命 令 的 经 验 吧 ! 图 2 - 3 1 即 为 t r a c e r t 命 令 执 行 的 结 果 , 而 这 个 工 具 的 目 的 就 是 让 我 们 去 检 测 两 台 主 机 之 间 , 总 共 间 隔 了 多 少 个 路 由 器 。 但 你 是 否 曾 经 想 过 这 个 工 具 的 工 作 原 理 ? 其 实 t r a c e r t 工 具 的 工 作 原 理 相 当 简 单 , 首 先 我 们 得 从 I P 包 头 中 的 T T L 值 谈 起 , 这 个 T T L 值 是 指 数 据 包 在 网 络 上 所 能 存 活 的 时 间 , 在 早 期 是 以 秒 为 单 位,不过,现在则改为“所能跨越的路由器数量”。 C : \ > t r a c e r t 2 1 1 . 2 2 . 3 4 . 7 8 T r a c i n g r o u t e t o t p - s 6 - c 1 2 r 1 . r o u t e r . h i n e t . n e t [ 2 1 1 . 2 2 . 3 4 . 7 8 ] o v e r a m a x i m u m o f 3 0 h o p s : 1 < 1 m s < 1 m s < 1 m s 1 0 . 0 . 1 . 2 5 4 2 1 m s < 1 m s < 1 m s 1 0 . 1 0 . 1 5 . 1 3 1 m s < 1 m s < 1 m s 1 0 . 1 0 . 1 2 . 2 7 4 2 4 m s 2 4 m s 2 7 m s 6 1 - 2 1 9 - 2 3 - 2 5 4 . H I N E T - I P . h i n e t . n e t [ 6 1 . 2 1 9 . 2 3 . 2 5 4 ] 5 2 4 m s 2 3 m s 2 4 m s t p - s 2 - c 7 6 r 5 . r o u t e r . h i n e t . n e t [ 1 6 8 . 9 1 . 8 4 . 2 0 2 ] 6 2 3 m s 3 7 m s 2 4 m s t p - s 2 - c 1 2 r 1 . r o u t e r . h i n e t . n e t [ 2 1 1 . 2 2 . 3 4 . 7 8 ] T r a c e c o m p l e t e . 图2-31  tracert命令执行的结果 下 面 以 图 2 - 3 2 为 例 来 看 看 t r a c e r t 工 具 是 如 何 查 询 图 中 最 右 边 与 最 左 边 的 主 机 , 且 总 共 间 隔 了 多 少 个 路 由 器 ? 首 先 t r a c e r t 工 具 会 发 送 第 一 个 数 据 包 , 这 个 数 据 包 的 目 的 端 I P 就 是 最 左 边 主 机 的 I P , 并 且 可 以 将 这 个 数 据 包 的 T T L 值 设 定 为 1 。 接 着 , 这 个 数 据 包 就 被 送 到 第 一 个 路 由 器  , 而 第 一 个 路 由 器 在 收 到 这 个 数 据 包 之 后 , 即 会 将 数 据 包 内 的 TTL值 减 1 , 因 此 , 这 个 数 据 包 的 T T L 值 变 为 0 , 这 个 值 代 表 数 据 包 生 命 周 期 已 尽 , 所 以 第 一 个 路 由 器 即 会 丢 弃 这 个 数 据 包 , 并 且 回 送 一 个 I C M P T y p e 1 1 ( T i m e t o l i v e e x c e e d e d ) 的 数 据 包 给 包 的 发 送 端 主 机 , 告 知 “ 你 发 送 的 数 据 包 因 生 命 周 期 已 尽 , 故 已 遭 到 丢 弃 ” , 如 此 t r a c e r t 工 具 就 可 从 这 个 I C M P 数 据包得知第一个路由器的IP地址。 t r a c e r t 接 着 会 送 出 第 二 个 数 据 包 , 不 过 , 这 个 数 据 包 的 T T L 值 会 特 意 设 置 为 2 , 接 着 , 第 二 个 数 据 包 会 被 送 到 第 一 个 路 由 器  , 第 一 个 路 由 器 收 到 这 个 数 据 包 之 后 , 会 将 其 T T L 值 减 1 , 这 是 数 据 包 内 的 T T L 值 将 会 变 为 1 , 因 为 T T L 值 不 为 0 , 故 其 生 命 周 期 未 尽 , 因 此 第 一 个 路 由 器 会 将 这 个 数 据 包 转 发 给 第 二 个 路 由 器  。 不 过 , 当 第 二 个 路 由 器 把 数 据 包 内 的 TTL减 1 之 后 , 这 个 数 据 包 内 的 T T L 值 即 为 0 , 代 表 这 个 数 据 包 的 生 命 周 期 已 尽 , 因 此 第 二 个 路 由 器 即 会 丢 弃 这 个 数 据 包 , 并 且 回 送 一 个 I C M P T y p e 1 1 ( T i m e t o l i v e e x c e e d e d ) 的 数 据 包 给 发 送 端 主 第 章   Netfilter/iptables 2 01 02 03 04 05 06 07 08 67 机,告知“你所发送的数据包因生命周期已尽,故已遭到丢弃”。如此一来,tracert工具就 可从这个ICMP数据包得知第二个路由器的IP地址。 �� � � 图2-32  RELATED的状态解释 紧接着,tracert会送出第三个数据包,不过,这个数据包的TTL值会特意设置为3,接 着,这个数据包会被送到第一个路由器,第一个路由器收到这个数据包之后,会将其TTL 值减1,这是数据包内的TTL值将会变为2,因为TTL值不为0,故其生命周期未尽,因此第 一个路由器会将这个数据包转发给第二个路由器。接着,第二个路由器收到这个数据包之 后,也会将数据包内的TTL值减1,这是数据包内的TTL值将会变为1,因为TTL值不为0,故 其生命周期未尽,因此,第二个路由器会将数据包转发给第三个路由器。接着,第三个路 由器收到这个数据包之后再把TTL值减1,这时数据包内的TTL值将变为0,则数据包的生命 周期已尽,因此,第三个路由器会丢弃这个数据包,并且回送一个ICMP Tpye 11(Time to live exceeded)的数据包给发送端主机,告知“你所发送的数据包因生命周期已尽,故已遭到丢 弃”。如此tracert工具就可以从这个ICMP包得知第三个路由器的IP地址是什么,最后tracert 工具就可以通过收集数据来了解到整个路径上的路由器有几个,其IP地址是什么。 看完tracert的工作原理之后,我们回头来看哪种数据包的状态会是RELATED。以图2-32 为例,标注这个数据包的状态就是RELATED状态,RELATED状态的数据包其含义是指 “被动产生的应答数据包,而且这个数据包不属于现在任何的连接”。例如,图2-32最右边 的主机送出一个TCP协议的数据包,但因为这个数据包的生命周期已尽,而遭到第三个路由 器丢弃。接着,第三个路由器会回送一个ICMP数据包给发送端,请注意!最右边的主机送 出的是TCP包,这是一条“连接”,但第三个路由器所回送的是ICMP数据包,很明显,这 绝对是另一条新的连接,而这个数据包之所以会产生,完全是因为第一条连接的存在才产生 应答的数据包,且该数据包不属于任意现有的连接。 最后要澄清一个概念,在上例中以应答的“ICMP”数据包为例,但是RELATED状态的 数据包与“协议”无关,“只要应答的数据包是因为本机先送出一个数据包而导致另一条连 接的产生,那么这个新连接的所有数据包都属于RELATED状态的数据包”。 4. INVALID INVALID虽然是一个容易了解的状态,但它同样是十分重要的。所谓INVALID状态是指 Linux 网络安全技术与实现 (第 版) 2 01 02 03 04 05 06 07 08 68 “ 状 态 不 明 的 数 据 包 ” , 也 就 是 不 属 于 E S T A B L I S H E D 、 N E W 及 R E L A T E D 状 态 的 数 据 包 。 凡 是 I N V A L I D 状 态 的 数 据 包 皆 视 为 “ 恶 意 ” 的 数 据 包 , 因 此 , 请 将 所 有 I N V A L I D 状 态 的 数 据 包丢弃掉;匹配INV ALID状态数据包的方法如下例所示。 i p t a b l e s - A I N P U T - p a l l - m s t a t e - - s t a t e I N V A L I D - j D R O P 再 举 个 小 例 子 , 如 果 防 火 墙 所 需 的 规 则 如 表 2 - 4 所 示 , 请 问 我 们 应 该 将 匹 配 I N V A L I D 状 态数据包的规则插入到表2-5的第几条规则中? 表2-5  单机防火墙的规则列表 1 . 2 . i p t a b l e s - P I N P U T D R O P 3 . i p t a b l e s - A I N P U T - p t c p - d 1 9 2 . 1 6 8 . 0 . 1 - - d p o r t 2 5 - j A C C E P T 4 . i p t a b l e s - A I N P U T - p t c p - d 1 9 2 . 1 6 8 . 0 . 1 - - d p o r t 8 0 - j A C C E P T 5 . i p t a b l e s - A I N P U T - p t c p - d 1 9 2 . 1 6 8 . 0 . 1 - - d p o r t 1 1 0 - j A C C E P T 6 . i p t a b l e s - A I N P U T - p t c p - s 1 9 2 . 1 6 8 . 0 . 2 0 0 - d 1 9 2 . 1 6 8 . 0 . 1 - - d p o r t 2 2 - j A C C E P T 7 . i p t a b l e s - A I N P U T - p t c p - s 1 9 2 . 1 6 8 . 0 . 2 0 0 - d 1 9 2 . 1 6 8 . 0 . 1 - - d p o r t 2 3 - j A C C E P T 8 . 最 正 确 的 答 案 是 第 一 条 , 因 为 规 则 的 匹 配 方 式 是 由 第 一 条 开 始 往 下 逐 一 匹 配 的 , 如 果 我 们 将 匹 配 I N V A L I D 状 态 数 据 包 的 规 则 放 在 第 一 的 位 置 , 那 么 数 据 包 只 要 已 进 入 I N P U T C h a i n , 就 会 先 被 匹 配 其 是 否 为 I N V A L I D 状 态 的 数 据 包 , 如 果 是 I N V A L I D 状 态 的 数 据 包 , 那 么马上就会将这个数据包丢弃掉,如此才能更周密地保护我们的服务器。 2 . 1 0 . 3   管 理 防 火 墙 规 则 数 据 库 的 办 法 ❙ 到 目 前 为 止 , 相 信 你 已 具 有 足 够 的 能 力 来 构 建 一 个 简 单 的 防 火 墙 , 但 问 题 来 了 , 该 如 何 管 理 防 火 墙 的 “ 规 则 数 据 库 ” 呢 ? 因 为 当 我 们 执 行 完 i p t a b l e s 命 令 之 后 , 规 则 即 被 存 储 在 各 个 不 同 的 链 中 , 但 每 次 计 算 机 重 新 开 机 之 后 , 这 些 原 本 在 链 中 的 规 则 将 会 全 部 消 失 , 该 不 会 每 次 重 新 开 机 之 后 , 系 统 管 理 人 员 都 要 重 新 输 入 一 次 吧 ? 因 此 , 我 们 需 要 一 个 数 据 库 来 存 储 iptables的规则,以免在计算机重新开机之后,遗失掉所有的防火墙规则。 1. 使用iptables工具的规则数据库 其 实 这 个 问 题 , N e t f i l t e r / i p t a b l e s 的 工 程 师 早 就 帮 我 们 设 计 好 了 , 在 修 改 完 N e t f i l t e r 的 规 则 之 后 , 可 以 使 用 “ s e r v i c e i p t a b l e s s a v e ” 命 令 把 所 有 N e t f i l t e r 规 则 存 储 到 “ / e t c / s y s c o n f i g / i p t a b l e s ” 文 件 中 。 接 着 使 用 “ c h k c o n f i g i p t a b l e s o n ” 命 令 设 置 系 统 , 以 便 在 重 新 开 机 之 后 , 自 动 将 “ / e t c / s y s c o n f i g / i p t a b l e s ” 文 件 中 的 规 则 载 入 到 N e t f i l t e r 的 各 个 链 中 , 如 此 就 不 用 担 心 防 火墙规则消失的问题了。 第 章   Netfilter/iptables 2 01 02 03 04 05 06 07 08 69 这个功能看来相当贴心,但强烈建议你“绝对不要使用”!否则以后在管理这些规则, 只能用“欲哭无泪”四个字来形容。试想,如果防火墙内有100条规则,而每条规则都有 “-d 192.168.0.100”这个条件,如果有一天,192.168.0.100这台主机更改了IP,请问你该如 何更改这些Netfilter数据库中的规则呢?全部删除再重新输入一次?还是使用iptables命令的 “-R;replace”参数,一条条更新规则?其实这些都是非常低效的管理方式,有没有什么比 较好的管理办法呢? 2. 使用Shell 脚本来管理规则数据库 在所有的“资料管理库”管理办法中,我认为最实用的办法就是使用Shell 脚本来记录 防火墙的规则数据库,如果把之前示例的内容改写成Shell 脚本的样式,将如表2-6所示。 表2-6  使用Shell 脚本管理防火墙的规则 1. #/bin/bash #=========================< Set Variable >>=========================== 2. IPT=/sbin/iptables 3. SERVER=192.168.0.1 4. PARTNER=192.168.0.200 #=======================< Clear Original Rule >>====================== 5. iptables -t filter -F #=========================< Set INPUT RULE >>========================= 6. $IPT -A INPUT -p tcp -m state --state INVALID -j DROP 7. $IPT -A INPUT -p tcp -d $SERVER --dport 25 -j ACCEPT 8. $IPT -A INPUT -p tcp -d $SERVER --dport 80 -j ACCEPT 9. $IPT -A INPUT -p tcp -d $SERVER --dport 110 -j ACCEPT 10. $IPT -A INPUT -p tcp -s $PARTNER -d $SERVER --dport 22 -j ACCEPT 11. $IPT -A INPUT -p tcp -s $PARTNER -d $SERVER --dport 23 -j ACCEPT 12. $IPT -A INPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT 把表2-6内的规则保存为firewall.sh文件,最后分别将文件的“Owner”及“Group”设置 为root,并将权限设置为700。设置权限的目的在于确保除了root之外,任何人都无法使用这 个文件,如此才能正确保护防火墙数据库的安全。 下面列出使用Shell 脚本来管理防火墙数据库的优缺点。 优点 ● 提升管理防火墙规则的简便性: ● 使用Shell 脚本的第一个好处就是不需要记忆太多iptables参数(例如-D、-R、-I之类),即 可快速方便地管理防火墙的规则。我们只需使用文本编辑器来修改Shell脚本的内容,然后 再重新执行一次Shell 脚本即可。不过,当你在写防火墙的Shell 脚本时,别忘了加上表2-6的 Linux 网络安全技术与实现 (第 版) 2 01 02 03 04 05 06 07 08 70 第 五 行 , 先 把 已 经 存 在 的 旧 规 则 清 除 掉 , 然 后 再 加 上 这 次 的 新 规 则 , 否 则 防 火 墙 规 则 一 定 会 “越加越多”。 可以在Shell ● 脚本 中使用变量: 稍 早 曾 经 假 设 过 一 个 例 子 : “ 如 果 防 火 墙 内 有 1 0 0 条 规 则 , 而 每 一 条 规 则 中 都 有 ‘ - d 1 9 2 . 1 6 8 . 0 . 1 0 0 ’ 这 个 条 件 , 如 果 有 一 天 , 1 9 2 . 1 6 8 . 0 . 1 0 0 这 台 主 机 更 改 了 I P , 请 问 , 该 如 何 更 改 这 些 N e t f i l t e r 数 据 库 中 的 规 则 呢 ? ” 其 实 , 如 果 是 使 用 S h e l l 脚 本 , 这 个 令 人 头 痛 的 问 题 根 本就不会存在,怎么说呢?在表2-6的Shell 脚本中就可以得到答案了,在其中的第2~4行设置 了 3 个 变 量 , 例 如 “ S E R V E R = 1 9 2 . 1 6 8 . 0 . 1 0 0 ” 即 为 一 个 变 量 , 而 用 设 置 变 量 的 优 点 在 于 , 如 果 S e r v e r 的 I P 变 更 了 , 我 们 只 需 要 用 文 本 编 辑 器 将 S h e l l 脚 本 中 的 “ S E R V E R = 1 9 2 . 1 6 8 . 0 . 1 0 0 ” 改 为 “ S E R V E R = 1 9 2 . 1 6 8 . 0 . 5 0 ” , 接 着 再 重 新 执 行 一 次 S h e l l 脚 本 , 防 火 墙 中 的 规 则 就 变 更 完 毕了。 防火墙规则容易阅读: ● 由 于 i p t a b l e s 的 规 则 语 法 与 实 际 存 在 于 各 个 链 中 的 规 则 语 法 在 写 法 上 稍 有 差 异 , 因 此 , 如 果 链 中 的 规 则 条 件 较 多 , 使 用 “ i p t a b l e s - t f i l t e r - L ” 命 令 来 阅 读 防 火 墙 规 则 实 在 不 是 一 种 很 好 的 方 式 , 但 如 果 是 以 S h e l l 脚 本 的 方 式 来 记 录 防 火 墙 规 则 , 因 为 S h e l l 脚 本 所 呈 现 出 来 的 规 则 就 是 我 们 下 发 给 i p t a b l e s 命 令 的 语 法 , 所 以 阅 读 上 就 轻 松 多 了 , 特 别 是 S h e l l 脚 本 可 以 加 “注释”,如此将可以确保长时间后,依然可以清楚了解当初设置防火墙规则的目的。 备份防火墙规则数据库极为方便: ● 如 果 以 S h e l l 脚 本 的 方 式 来 记 录 防 火 墙 的 规 则 数 据 库 , 我 们 只 需 要 将 这 个 S h e l l 脚 本 的 文 件 备 份 起 来 即 可 , 如 果 哪 天 防 火 墙 主 机 的 硬 盘 损 坏 了 , 只 需 要 换 个 硬 盘 , 然 后 将 系 统 安 装 起 来,最后再把Shell 脚本重新复制回硬盘即可。 缺点 ● 无法在开机后自动载入规则数 据库: ● 使 用 S h e l l 脚 本 来 作 为 防 火 墙 的 规 则 数 据 库 , 最 麻 烦 的 就 是 无 法 使 用 “ c h k c o n f i g i p t a b l e s o n ” 方 法 来 设 置 开 机 后 自 动 载 入 规 则 数 据 库 的 内 容 。 不 过 , 这 也 不 是 什 么 困 难 的 问 题 , 因 为 L i n u x 系 统 有 一 个 类 似 D O S 下 的 a u t o e x e c . b a t , 这 个 文 件 为 / e t c / r c . d / r c . l o c a l , 如 果 我 们 的Shell 脚本文件为/root/firewall.sh,那么,只需要在/etc/rc.d/rc.local文件中加入下列命令,则 系统在重新开机后,就会自动执行firewall.sh,当然其内的规则也就可以顺利地加入到各个不 同的链中了。 / r o o t / f i r e w a l l . s h 第 章   Netfilter/iptables 2 01 02 03 04 05 06 07 08 71 2.11 使用filter机制来构建网关式防火墙 在前一节中,我们基本了解了单机防火墙构建的基 础,接着以图2-33为例来构建一个简单的网关式防火墙。 假设10.0.1.100是因特网上的一台主机,且其上运 行了SMTP、POP3及HTTP三项服务,由于我们尚未介 绍nat机制,因此本示例先假设企业内所使用的IP是公网 IP,其网段是192.168.0.0/24。在这个示例中,我们希望 达到的环境需求如下: 192.168.0.200这台主机只能访问10.0.1.100主机的 ● SMTP及POP3服务。 192.168.0.0/24网段上的其他主机只可以访问因特网 ● 上的DNS、SMTP、POP3、HTTP及HTTPS服务。 因特网上的主机不得访问企业内的任何主机。 ● 有了明确地需求后,接下来就可以把它写成iptables的规则语法,如表2-7所示。这些规 则语法较容易理解。因为与单机防火墙的设置原理差不多,在此仅简单介绍与表2-7有关的内容。 表2-7  简单网关式防火墙的规则数据库 1. #/bin/bash #====================< Set Variable >>============================= 2. IPT=/sbin/iptables 3. MAIL_SRV=10.0.1.100 4. ACC_PC=192.168.0.200 #==================< Set Default Policy >>========================= 5. $IPT -t filter -P INPUT DROP 6. $IPT -t filter -P FORWARD DROP #==================< Clear Original Rule >>======================== 7. $IPT -t filter -F #====================< Set INPUT RULE >>=========================== 8. $IPT -A INPUT -p tcp -m state --state INVALID -j DROP 9. $IPT -A INPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT #======================< Set FORWARD RULE >>======================= 10. $IPT -A FORWARD -i eth0 -o eth1 -m state --state INVALID -j DROP 11. $IPT -A FORWARD -i eth0 -o eth1 -m state --state ESTABLISHED,RELATED -j \ACCEPT 12. $IPT -A FORWARD -i eth1 -o eth0 -p tcp -s $ACC_PC -d $MAIL_SRV --dport \ 25:110 -j ACCEPT 13. $IPT -A FORWARD -i eth1 -o eth0 -p all -s $ACC_PC -j DROP 14. $IPT -A FORWARD -i eth1 -o eth0 -p tcp --dport 25,110 -j ACCEPT 15. $IPT -A FORWARD -i eth1 -o eth0 -p tcp --dport 80,443 -j ACCEPT 16. $IPT -A FORWARD -i eth1 -o eth0 -p udp --dport 53 -j ACCEPT 图2-33  网关式防火墙 Linux 网络安全技术与实现 (第 版) 2 01 02 03 04 05 06 07 08 72 第1行 ● 设置Shell解释器的路径。 第2~4行 ● 将未来可能会变动的信息或太长的命令简化成“变量”。 第5~6行 ● 设置INPUT 及FOR W ARD链的默认策略为DROP,其目的分别如下: 设 置 I N P U T 链 的 ● 默认策略 为 D R O P 的 目 的 : 虽 然 本 示 例 的 主 要 目 的 是 使 用 网 关 式 防 火 墙 来 保 护 及 限 制 企 业 内 的 主 机 , 但 请 千 万 别 忽 略 了 防 火 墙 自 身 的 安 全 , 否 则 防 火 墙 若 被 入 侵 了 , 整 个 企 业 的 安 全 防 护 就 形 同 虚 设 了 。 因 此 , 我 们 拒 绝 了 所 有 对 防 火 墙 的 连 接 操 作 , 但 别 忘 了 , 因 为 我 们 有 可 能 在 防 火 墙 主 机 上 执 行 如 软 件 更 新 等 需 要 对 外 产 生 连 接 的 操 作 , 所 以 在 此 并 没 有 将 O U T P U T 链 的 默认策略 设 置 为 DROP。 设 置 F O R W A R D 链 的 ● 默认策略 为 D R O P 的 目 的 : 因 为 本 示 例 是 以 严 格 的 方 式 来 管 制 企 业 对 外 的 连 接 , 以 及 因 特 网 对 企 业 内 的 连 接 , 因 此 , 笔 者 将 F O R W A R D 链 的 默认 策略 设 置 为 D R O P , 如 此 一 来 , 企 业 内 外 就 等 于 “ 断 线 ” 的 状 态 。 稍 后 , 我 们 再 从 FOR W ARD链中逐一启用允 许的对外连接通道即可。 第7行 ● 清除原有的防火墙规则。 第8~9行 ● 因 为 I N P U T 链 的 默 认 策 略 已 设 置 为 D R O P , 因 此 将 导 致 对 外 建 立 连 接 时 应 答 数 据 包 无 法 正 常 穿 过 防 火 墙 的 问 题 , 我 们 必 须 在 I N P U T 链 中 设 置 E S T A B L I S H E D 及 R E L A T E D 状 态 的 数 据 包,才可以正常地返回。 第10行 ● 将所有从因特网送到企业内部且状态是INV ALID的数据包丢弃。 第1 1行 ● 允许所有由企业内部对外建立连接时所产生的应答数据包正常返回企业内部。 第12~13行 ● 设置192.168.0.200主机只能访问因特网上10.0.1.100这台主机的SMTP及POP3服务。 第14~16行 ● 在 1 9 2 . 1 6 8 . 0 . 0 / 2 4 网 段 中 的 主 机 只 能 访 问 因 特 网 上 的 S M T P 、 P O P 3 、 H T T P 、 H T T P S 及 第 章   Netfilter/iptables 2 01 02 03 04 05 06 07 08 73 DNS服务。 相信你对以上的防火墙规则应该都可以轻松了解,以上示例中的单机防火墙及网关式防 火墙都只是一个非常基础的防火墙,如果要构建企业级防火墙则绝对是不够的。不过,你无 须担心,稍后章节将逐一介绍防火墙的高级功能,以便你能运用这些高级功能来构建企业 级的防火墙。但你必须对这两个示例的内容及概念有全面的了解,这样才能顺利地学习后 面章节。 2.12 Netfilter的NAT机制 NAT是Network Address Translation的缩写,意即“网络地址转换”。NAT机制可以应用 在服务器端,也可以应用在客户端,当然其用意是不一样的。比方说,NAT应用在客户端的 主要目的是隐藏客户端的IP,由此达到保护客户端主机免于遭受因特网的攻击行为,以及节 省公用IP的使用量;而在服务器端的主要用途是保护服务器端主机在因特网上的安全。NAT 种类繁多,有一对多、多对多、一对一和NATP等四种,而这四种NAT架构将在本章中逐一 介绍,请拭目以待。 2.12.1 IP网段的划分 ❙ 你一定很清楚在因特网上识别计算机主机的方式就是IP地址,而IP地址是由一组二进制 的数据所构成,其长度是32位,但长度32位的二进制数据实在是让人太难记忆了,于是有人 想到把这一长串的二进制数字,分割为4组8位长度的二进制数字,接着再将其转换成人们容 易记忆的十进制数字,如192.168.1.10。然而,这些数字如果没有适当的规划,使用起来也会 有很大的困难,因此,IANA将IP地址划分为三类,分别是A类、B类及C类,而其范围如表 2-8所示。 表2-8  IP地址的分类 类别 范围 子网掩码 A 1.*.*.*~127.*.** 255.0.0.0 B 128.*.*.*~191.*.*.* 255.255.0.0 C 192.*.*.*~223.*.*.* 255.255.255.0 Linux 网络安全技术与实现 (第 版) 2 01 02 03 04 05 06 07 08 74 2 . 1 2 . 2   私 有 I P ❙ 因 为 I P 是 由 3 2 位 的 二 进 制 数 字 所 组 成 的 , 所 以 其 能 代 表 的 主 机 数 量 是 有 限 的 , 而 这 个 上 限 是 2 3 2 = 4 2 9 4 9 6 7 2 9 6 台 主 机 , 这 个 数 字 看 起 来 相 当 惊 人 , 有 4 2 亿 多 台 计 算 机 ! 但 现 在 地 球 上 需 要 设 置 I P 的 设 备 ( 计 算 机 、 路 由 器 、 网 络 设 备 、 P D A 、 无 线 网 络 电 话 等 ) 很 多 , 这 4 2 亿 多 个IP真的够用吗?未来不会再有增长吗?事实上,这42亿的数字是绝对不够用的。 当 初 I A N A 在 划 分 因 特 网 I P 时 , 早 就 考 虑 到 这 个 问 题 , 因 此 I A N A 分 别 在 A 类 、 B 类 及 C 类 网 段 中 , 各 保 留 了 一 段 私 有 I P 区 间 , 这 些 区 段 的 划 分 请 参 考 表 2 - 9 。 何 谓 私 有 I P ? 私 有 I P 是 指 这 些 I P 只 能 在 企 业 内 部 使 用 , 而 无 法 应 用 在 因 特 网 上 。 也 就 是 说 , 因 特 网 上 的 路 由 器 如 果 看 到 这 些 私 有 I P , 就 会 将 之 丢 弃 掉 , 这 有 点 像 企 业 内 每 个 成 员 都 会 有 一 组 分 机 号 码 , 而 这 个 分 机 号 码 在 企 业 内 部 是 可 以 彼 此 互 通 的 , 但 你 的 朋 友 不 可 能 用 他 家 里 的 电 话 直 接 拨 这 组 分 机 号 码 给 你 , 两 者 是 一 样 的 原 理 。 私 有 I P 只 能 让 企 业 内 的 计 算 机 彼 此 互 通 , 却 无 法 让 企 业 内 的 计 算机与因特网上的计算机彼此互通。 表2-9  私有IP的分布区域 类别 范围 子网掩码 A 10.0.0.0~10.255.255.255 255.0.0.0 B 172.16.0.0~172.31.255.255 255.255.0.0 C 192.168.0.0~192.168.255.255 255.255.255.0 2 . 1 2 . 3   N A T ❙ 私 有 I P 是 无 法 在 因 特 网 上 使 用 的 , 而 如 今 普 遍 使 用 的 宽 带 网 络 ( A D S L ) 最 多 所 能 提 供 给 用 户 的 I P 为 1 6 个 , 最 少 则 为 一 个 , 万 一 企 业 内 部 有 5 0 台 计 算 机 要 同 时 连 接 上 因 特 网 , 该 如 何 解 决呢? 额外加一个路由器 或 许 你 会 想 到 额 外 加 一 个 路 由 器 来 解 决 这 个 问 题 , 但 加 一 个 路 由 器 真 的 可 以 解 决 这 个 问 题 吗 ? 以 图 2 - 3 4 来 说 明 。 在 图 中 , 我 们 在 1 9 2 . 1 6 8 . 0 . 0 / 2 4 这 个 私 有 I P 与 1 0 . 0 . 1 . 0 / 2 4 这 个 公 网 I P 区 段 间 加 了 一 个 路 由 器 , 而 这 台 A D S L 只 有 3 个 公 网 I P , 因 此 , 我 们 把 一 个 公 网 I P 设 置 在 路 由 器 的 接 口 上 ( 假 设 1 0 . 0 . 1 . 2 0 0 是 公 网 I P ) 。 另 外 , 私 有 I P 区 段 上 的 两 台 主 机 的 默 认 网 关 则 是 指 向 路 由器的另一个接口。 第 章   Netfilter/iptables 2 01 02 03 04 05 06 07 08 75 图2-34  NAT原理(一) 首先,192.168.0.1这台主机尝试访问因特网上的1.2.3.4主机,因此,192.168.0.1主机会 发送一个请求数据包到默认网关,这个数据包内的“来源”及“目的”IP分别如所示, 来源IP为192.168.0.1,目的IP为1.2.3.4,由于是路由器的缘故,所以这个数据包的来源及目 的IP并不会有任何的改变。接着,路由器会将该数据包原封不动地发送给1.2.3.4这台主机, 当1.2.3.4主机收到这个数据包时,该数据包内的来源及目的IP就如所示,或许你会觉得奇 怪,私有IP不是不能在因特网上传输吗?为什么1.2.3.4还可以收到这个数据包呢? 为了提高因特网上的数据包的传输效率,因特网上的路由器通常不检查数据包中的 “来源端IP”,而只会看目的端的IP,所以192.168.0.1主机所发送的数据包,是可以被正 常传输到1.2.3.4主机上。而当1.2.3.4主机接到这个数据包之后,其会认定数据包的发送者为 192.168.0.1,因此,1.2.3.4主机即会应答192.168.0.1的请求,所以就会送了一个数据包给来源 端,这个数据包就如所示,来源端IP为1.2.3.4,目的端IP为192.168.0.1。但这下麻烦了,因 为数据包中的“目的端IP”为私有IP,因此,这个数据包是不可能被送回192.168.0.1的,因 为目的端的IP为私有IP而遭到因特网上路由器的丢弃,外加路由器的方式是不能解决当前问 题的。 通用NAT 这个问题的正确解决办法是使用NAT,只要通过NAT的机制,就可以让成千上万台计算 机同时通过一个公网IP来连上因特网。乍听之下好像很神奇,其实原理很简单,以图2-35为 例来说明NAT机制。假设图中192.168.0.1要通过NAT主机来访问因特网上的1.2.3.4主机,此 外,我们假设NAT主机上所设定的10.0.1.200为公网IP,而NAT后方所设置的是192.168.0.0/24 的私有IP网段。 Linux 网络安全技术与实现 (第 版) 2 01 02 03 04 05 06 07 08 76 NAT eth0 10.0.1.200 192.168.0.0/24 src ip dst ip 10.0.1.200 1.2.3. 4 src ip dst ip 10.0.1.200 1.2.3. 4 src ip dst ip 1.2.3.4 10.0.1.200 src ip dst ip 1.2.3.4 10.0.1.200 src ip dst ip 1.2.3.4 192.168.0. 1 src ip dst ip 192.168.0.1 1.2.3. 4 1.2.3.4 � � � � � � 图2-35  NAT原理(二) 首 先 , 1 9 2 . 1 6 8 . 0 . 1 会 发 送 数 据 包 给 1 . 2 . 3 . 4 这 台 主 机 , 而 这 个 数 据 包 的 内 容 就 如  所 示 , 其 来 源 端 I P 为 1 9 2 . 1 6 8 . 0 . 1 , 目 的 端 I P 为 1 . 2 . 3 . 4 , 当 然 , 这 个 数 据 包 一 定 会 交 给 默 认 的 网 关 来 处 理 , 也 就 是 交 给 N A T 主 机 来 处 理 , 接 着 N A T 主 机 会 将 这 个 数 据 包 内 的 “ 来 源 端 I P ” 改 成 N A T 主 机 上 的 公 网 I P , 如  所 示 , 如 此 来 源 及 目 的 I P 都 会 变 成 公 网 I P , 同 时 , N A T 主 机 会 将 这 个 数 据 包 的 信 息 记 录 起 来 。 接 着 , 这 个 数 据 包 当 然 可 以 被 发 送 到 1 . 2 . 3 . 4 主 机 上  , 而 主 机 1 . 2 . 3 . 4 当 然 也 会 应 答 给 这 个 发 送 端 , 这 个 应 答 的 数 据 包 就 如 同  所 示 , 但 这 次 应 答 的 目 的 端 主 机 为 1 0 . 0 . 1 . 2 0 0 这 个 公 网 I P , 而 不 会 是 1 9 2 . 1 6 8 . 0 . 1 这 个 私 有 I P 。 如 此 一 来 , 这 个 数 据 包 当 然 就 可 以 被 送 回 N A T 主 机  , 当 N A T 主 机 收 到 这 个 数 据 包 后 , 就 可 以 从 之 前 记 录 下 来 的 信 息 中 找 到 当 初 N A T 主 机 把 1 9 2 . 1 6 8 . 0 . 1 转 成 1 0 . 0 . 1 . 2 0 0 的 记 录 , 因 此 , N A T 主 机 就 会 把 这 个 数 据 包 内 的目的端IP改成192.168.0.1  。 从 以 上 流 程 可 以 看 到 , 当 1 9 2 . 1 6 8 . 0 . 1 主 机 发 送 数 据 包 给 1 . 2 . 3 . 4 主 机 之 后 , 其 所 希 望 得 到 的 是 1 . 2 . 3 . 4 应 答 给 1 9 2 . 1 6 8 . 0 . 1 , 如 果 能 够 符 合 这 个 条 件 , 1 9 2 . 1 6 8 . 0 . 1 当 然 就 可 以 正 常 访 问 1 . 2 . 3 . 4 主机上的资源,也就代表私有IP的主机真的可以通过NA T主机去访问因特网上的资源。 2 . 1 2 . 4   数 据 包 传 输 方 向 与 S N A T 及 D N A T 的 关 系 ❙ 在 了 解 N A T 的 原 理 之 后 , 有 两 个 很 重 要 的 名 词 请 一 定 要 了 解 且 牢 记 , 那 就 是 S N A T 及 DNA T,下面将进行简单说明。请注意图2-35中  到  的步骤,谁被改变了?是Source IP,对 吧 ? 变 更 S o u r c e I P 的 机 制 称 为 S N A T , 而 在  到  的 步 骤 中 , D e s t i n a t i o n I P 被 改 变 了 , 因 此 变 更Destination IP的机制就叫做DNA T。 N A T 机 制 有 很 多 种 , 有 一 对 多 , 多 对 多 , 一 对 一 及 N A P T , 基 本 上 , 不 管 是 哪 一 种 第 章   Netfilter/iptables 2 01 02 03 04 05 06 07 08 77 NAT,都是由SNAT及DNAT所共同搭配出来的,因此,如果你可以完全了解NAT的原理,那 么在稍后学习这几种不同的NAT机制时,就容易理解和上手。 以图2-36为例来进一步解说SNAT及DNAT机制。图中这台主机共安装了两块网卡,假设有 一个数据包由eth1接口送入,并从eth0接口离开,那么这个数据包将流经三个不同的机制,其先 后顺序分别为PREROUTING、路由表(Routing Table)及POSTROUTING机制。此外,如果数据包 是由eth0接口送入并由eth1接口离开,数据包同样会流经三个不同的机制,其先后顺序分别为 PREROUTING、路由表及POSTROUTING机制。由此可以得出一个结论,PREROUTING、路由表 及POSTROUTING并没有规定在特定的一侧,关键在于数据包的流向。 图2-36  数据包流向与SNAT及DNAT的关系 究竟PREROUTING和POSTROUTING是什么呢?从图2-37可以看到nat表内所有的链,以 及一个名为PREROUTING及名为POSTROUTING的链,而图2-36中所谈到的PREROUTING及 POSTROUTING就是指这两个链。此外,我们还可以看到一个名为OUTPUT链的机制,不过请 你注意,这个OUTPUT链与filter机制中的OUTPUT链可是各自独立、毫无关系的两个机制。 [root@test ~]# iptables -t nat -L Chain PREROUTING (policy ACCEPT) target prot opt source destination Chain POSTROUTING (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination [root@test ~]# 图2-37  nat表的结构 前面的解说中希望以一种比较容易思考及记忆的方式来帮助你可以快速记忆。接下来以 图2-38为例介绍NAT的完整结构,并解释每个链的用途。 Linux 网络安全技术与实现 (第 版) 2 01 02 03 04 05 06 07 08 78 图2-38  NAT的结构 PREROUTING ● N A T 有 很 多 不 同 的 种 类 , 但 不 管 是 哪 一 种 N A T , 都 是 由 S N A T 及 D N A T 搭 配 组 合 而 成 的 , 因 此 , 当 我 们 下 发 “ 规 则 ” 要 去 修 改 数 据 包 的 “ D e s t i n a t i o n I P ” 时 , 请 将 该 规 则 放 在 PREROUTING链中,因为PREROUTING链的功能在于执行DNA T的任务。 此 外 , 可 以 从 图 2 - 3 8 看 到 , P R E R O U T I N G 链 的 位 置 在 整 个 N A T 机 制 的 最 前 面 。 因 此 在 执 行 D N A T 时 , 几 乎 是 数 据 包 一 旦 进 入 N A T 机 制 , 数 据 包 内 的 “ D e s t i n a t i o n I P ” 即 被 修 改 , 而 这个“顺序”问题在整个防火墙的设置上是非常重要的。 POSTROUTING ● 与 P R E R O U T I N G 链 不 同 的 是 , P O S T R O U T I N G 链 的 任 务 是 修 改 数 据 包 内 的 “ 来 源 端 I P ” , 也 就 是 说 , P O S T R O U T I N G 链 的 功 能 在 于 执 行 S N A T 的 任 务 。 此 外 注 意 P O S T R O U T I N G 链 的 位 置 , P O S T R O U T I N G 链 位 于 整 个 N A T 机 制 的 最 末 端 , 因 此 当 我 们 执 行 SNA T操作时,Source IP是在整个NA T机制的最末端才会被修改的。 OUTPUT ● 最 后 以 图 2 - 3 8 为 例 来 介 绍 N A T 机 制 中 的 O U T P U T 链 , 不 过 请 你 先 看 图 2 - 3 8 来 回 答 下 列 问 题 : ( 1 ) 如 果 网 络 上 有 一 个 数 据 包 是 要 送 给 本 机 进 程 , 请 问 在 这 个 数 据 包 送 达 进 程 之 前 , 我 们可以对该数据包执行DNA T的操作吗? ( 2 ) 如 果 本 机 进 程 生 成 了 一 个 数 据 包 往 外 发 送 , 请 问 在 这 个 数 据 包 离 开 本 机 之 前 , 我 们 可以对这个数据包执行SNA T的操作吗? ( 3 ) 如 果 本 机 进 程 生 成 了 一 个 数 据 包 往 外 发 送 , 请 问 在 这 个 数 据 包 离 开 本 机 之 前 , 我 们 可以对这个数据包执行DNA T的操作吗? 你心中是否已经有答案了呢?下列是笔者的分析: ( 1 ) 从 图 2 - 3 8 可 以 看 到 , 如 果 一 个 数 据 包 要 送 给 本 机 进 程 , 这 个 数 据 包 进 入 系 统 之 后 , 第 章   Netfilter/iptables 2 01 02 03 04 05 06 07 08 79 就会先进入PREROUTING链,所以我们可以在PREROUTING链内执行DNAT任务,接着数 据包才会送到路由表进行路由判断,最后抵达进程。第1题的答案是“可以”。 (2) 当本机进程生成数据包并向外发送时,该数据包会先交给路由表来判别路由,接着 数据包进入OUTPUT链,最后进入POSTROUTING链,接着送离本机。因此,如果我们要 改变该数据包的Source IP,可以在POSTROUTING链中执行SNAT的操作。第2题的答案是 “可以”。 (3) 当本机进程生成数据包并向外发送时,这个数据包会先交给路由表来判断路由,接 着数据包进入OUTPUT链,最后进入POSTROUTING链,然后送离本机。因此,这个数据包 绝不可能送到PREROUTING链内,即使你在PREROUTING链内写再多的规则,都不可能改 变这个数据包的Destination IP。为了解决这个问题,NAT特别设计了一个名为OUTPUT链的 机制,而这个链的功能就是执行DNAT的任务,其对象就是本机进程产生并要外送的这些数 据包。因此,第3题的答案是“可以”,但DNAT的规则是要放在OUTPUT链之内。 2.12.5 NAT的分类 ❙ NAT会因为其所要执行的任务而异,而在技术的应用上会有所差异,常见的NAT机制 大概可分为“一对多NAT”、“多对多NAT”、“一对一NAT”及“NAPT(Network Address Port Translation)”四种。不过,你不用担心,只要对NAT的原理够了解,不管构建哪一种 NAT都是很容易的,如果你对NAT的原理还不是很了解的话,建议你不妨再回顾一下前一节 中介绍的内容,将NAT的原理及Netfilter的NAT机制好好地再研读一次。接下来将逐一介绍每 种NAT的使用环境、构建方式及原理。 1. 一对多NAT 在这四种NAT机制中,使用率最高的就是一对多NAT。或许一对多NAT这个名词大家不 太熟悉,但如果换个方式来形容它,或许你就豁然开朗。IP分享器有听过吧?其实IP分享器 就是一种一对多的NAT机制,这种机制最主要有如下两项功能。 节省公网IP的使用量: ● 由于因特网发展速度惊人,网民数量飙升,因此,造成了因特网上的公网IP日益吃紧, 即使企业申请的是T1数据专线,但要能拿到64个公网IP已经很困难了,更别说企业若申请 ADSL上网,那能拿到的公网IP就更少了。为了使企业内所有人都可以同时上网,一对多 NAT可说是一个很好的解决方案,而所谓的一对多NAT就是“让大家共用一个公网IP来上 网”,如此,即使企业内有再多的使用者,也只需一个公网IP就够了,如此即可大量减少公 网IP的消耗量。 Linux 网络安全技术与实现 (第 版) 2 01 02 03 04 05 06 07 08 80 隐藏企业内部主机的IP地址: ● 以 图 2 - 3 9 为 例 , 一 般 在 规 划 企 业 网 络 时 , 企 业 内 部 的 网 段 都 会 使 用 私 有 I P 来 当 做 企 业 内 的 网 络 地 址 , 然 后 使 用 N A T 的 机 制 将 私 有 I P 转 成 公 网 I P 再 连 上 因 特 网 , 也 因 为 企 业 内 部 是 躲 在 N A T 后 方 , 因 此 , 因 特 网 使 用 者 根 本 不 知 道 原 来 某 个 公 网 I P 后 方 藏 着 一 群 主 机 , 即 便 知 道 了 , 因 N A T 后 方 通 常 都 是 使 用 私 有 I P , 也 提 高 了 黑 客 攻 击 企 业 网 络 内 部 主 机 的 难 度 。 因 此 , 一对多NA T机制对于企业网络在安全性的考虑上具有一定的帮助。 接 下 来 以 图 2 - 3 9 为 例 来 构 建 一 对 多 N A T 的 网 络 环 境 。 首 先 在 N A T 主 机 上 安 装 两 块 网 卡 , 并 在 e t h 0 接 口 上 设 置 1 0 . 0 . 1 . 2 0 0 这 个 公 网 I P , 此 外 , 在 e t h 1 接 口 上 设 置 1 9 2 . 1 6 8 . 0 . 2 5 4 这 个 私 有 I P , 而 企 业 内 的 主 机 都 将 是 1 9 2 . 1 6 8 . 0 . 0 / 2 4 网 段 上 的 主 机 , 且 其 默认网关是192.168.0.254。 在 设 置 N A T 机 制 时 , 我 们 必 须 考 虑 数 据 包 的 进 出 。 首 先 考 虑 企 业 内 部 发 送 数 据 包 到 因 特 网 的 情 况 , 如 果 1 9 2 . 1 6 8 . 0 . 0 / 2 4 网 段 的 主 机 要 访 问 因 特 网 上 的 主 机 , 其 服 务 请 求 数 据 包 内 的 S o u r c e I P 必 然 是 私 有 I P 。 如 果 让 这 个 数 据 包 直 接 送 往 因 特 网 , 这 个 访 问 操 作 必 然 会 失 败 , 因 此 , 当 数 据 包 有 企 业 内 部 送 出 时 , 我 们 必 须 通 过 N A T 主 机 上 的 S N A T 机 制 , 将 外 送数据包内的Source IP改为NA T主机上的公网IP,如 此 才 能 让 因 特 网 上 主 机 应 答 回 来 的 数 据 包 能 顺 利 返 回到NA T主机对外的公网IP上,这个SNA T的规则语法如下: 语法 ● i p t a b l e s - t n a t - A P O S T R O U T I N G - o e t h 0 - s 1 9 2 . 1 6 8 . 0 . 0 / 2 4 \ - j S N A T - - t o 1 0 . 0 . 1 . 2 0 0 语法解释 ● -t nat ● 选择表 选择所要使用的功能为Netfilter的NAT机制 -A POSTROUTING ● 选择功能 选择所要执行的操作为SNAT机制 图2-39  一对多NAT 第 章   Netfilter/iptables 2 01 02 03 04 05 06 07 08 81 -o eth0 ● 标明数据包的流向 前面章节曾提到,POSTROUTING及PREROUTING并没有固定在具体哪个方向,关键在于 数据包的流向,因此在执行SNAT或DNAT操作时务必设置这项参数,否则iptables一定会 告诉你“语法错误” -s 192.168.0.0/24 ● 设置私有IP网段 只有来自192.168.0.0/24网段的数据包才符合本规则 -j SNAT --to 10.0.1.200 ● 执行的操作 如果数据包符合以上所有条件,就将其Source IP的内容改为10.0.1.200,但请注意,这 个IP必须为NAT主机对外的公网IP 在将以上规则添加到POSTROUTING链后,192.168.0.0/24网段的主机就可以正常连接到 因特网上了。你可能会觉得很奇怪,不是要考虑数据包的进出吗?而刚刚也才设置好数据包 出去的方向,回来的方向都还没设置,为什么现在192.168.0.0/24网段的主机就可以正常连接 上因特网?有这样的想法很正确的,不过,如果NAT机制每次都要写“双向”规则,那也未 免太累了吧!所以Netfilter的程序设计师们早就帮我们考虑到这个问题,不管我们下达的是 SNAT或DNAT的规则,NAT机制都会自动帮我们判别“另一个方向的应答数据包”,因此, 我们只需要下达单一方向的规则即可。 看完以上内容,你是否觉得一对多NAT的设置真的很简单呢?最后再补充以下几点供你参考。 接口名称的问题: ● 因为本示例使用的是以太网,因此,在-o的参数后面加的是eth0,但如果你所使用的是 拨号ADSL,那么接口名称将会是ppp0或pppX。-o参数后面的‘“接口名称”请务必设置为 当时所使用的接口名称,如果你不确定接口名称,可以试着执行ifconfig命令,即可看到公网 IP所使用的接口名称是什么。 如果公网IP不是固定的: ● 本示例所设置的公网IP是10.0.1.200,因此语法规则是“-j SNAT --to 10.0.1.200”。请注 意,10.0.1.200在我们的Shell 脚本中是被写死的,但如果你所使用的对外连接为拨号ADSL或 Cable Modem的话,每次所拿到的公网IP都是不固定的,不就每次连上因特网之后,就要修 改一次Shell 脚本中的“-j SNAT --to Public IP”?这个问题倒不用担心,因为Netfilter程序设 计师们早就帮我们想到,如果你对外的公网IP不固定,请将规则修改如下,如此一来,我们 的规则就与公网IP无关了。 iptables -t nat -A POSTROUTING -o eth0 -s 192.168.0.0/24 -j MASQUERADE Linux 网络安全技术与实现 (第 版) 2 01 02 03 04 05 06 07 08 82 2. 多对多NA T 学 习 完 一 对 多 N A T 机 制 之 后 , 你 会 发 现 一 对 多 N A T 可 能 存 在 的 一 些 问 题 , 因 为 1 9 2 . 1 6 8 . 0 . 0 / 2 4 这 个 私 有 I P 网 段 的 主 机 , 都 是 转 到 1 0 . 0 . 1 . 2 0 0 这 个 公 网 I P , 然 后 再 连 上 因 特 网 的 , 因 此 , 不 管 是 企 业 内 部 哪 一 台 主 机 对 因 特 网 上 的 主 机 进 行 访 问 , 对 因 特 网 上 的 主 机 而 言 , 都 是 1 0 . 0 . 1 . 2 0 0 这 台 主 机 在 进 行 访 问 , 但 这 可 能 造 成 某 些 因 特 网 上 应 用 服 务 无 法 正 常 运 行。例如,少数的网络游戏主机就无法接受相同 一 个 I P 对 其 进 行 多 次 的 连 接 操 作 , 而 最 终 可 能 导 致 相 同 一 个 N A T 下 的 主 机 , 只 有 一 台 主 机 可 以 玩 某个网游,不过,这样的网络游戏已经越来越少 了,游戏玩家们不必过于担心。 不 过 , 对 N A T 机 制 而 言 , 也 有 相 对 应 的 解 决 办 法 , 只 是 看 够 不 够 完 美 罢 了 ! 多 对 多 N A T 或 许 可 以 减 少 这 种 问 题 发 生 的 概 率 。 什 么 是 多 对 多 N A T ? 要 能 够 进 行 多 对 多 N A T 的 先 决 条 件 是 你 必 须 拥 有 多 个 公 网 I P , 而 且 这 些 公 网 I P 必 须 是 “ 连 续 ” 的 , 否 则 无 法 进 行 多 对 多 N A T 的 操 作 。 以 图 2 - 4 0 为 例 , 我 们 先 将 拥 有 的 这 五 个 公 网 I P 设 置 在 NA T主机的对外接口上,并运行以下命令: i p t a b l e s - t n a t - A P O S T R O U T I N G - o e t h 0 - s 1 9 2 . 1 6 8 . 0 . 0 / 2 4 \ - j S N A T - - t o 1 0 . 0 . 1 . 2 0 0 - 1 0 . 0 . 1 . 2 0 5 以 上 命 令 你 一 定 会 觉 得 很 熟 悉 , 几 乎 与 一 对 多 N A T 的 语 法 一 样 ! 唯 一 的 差 别 只 有 最 后 所 转 换 的 公 网 I P 部 分 有 所 改 变 而 已 。 当 以 上 的 规 则 生 效 之 后 , 企 业 内 对 外 建 立 的 第 一 条 连 接 , 将 会 带 着 第 一 个 公 网 I P 连 上 因 特 网 , 而 第 二 条 连 接 产 生 时 , 将 会 带 着 第 二 个 公 网 I P 连 上 因 特 网 , 当 然 第 三 条 连 接 产 生 时 , 将 会 带 着 第 三 个 公 网 I P 连 上 因 特 网 , 如 此 不 断 地 循 环 到 了 第 六 条 连 接 时 , 将 会 轮 回 到 第 一 个 公 网 I P 上 , 如 此 就 可 以 降 低 相 同 公 网 I P 连 接 到 同 一 台 因 特 网 主 机的概 率。当然,公网IP的数量越多,发生冲突的概率就越低。 3. 一对一NA T 一 对 一 N A T 机 制 的 主 要 目 的 是 提 供 给 对 外 服 务 主 机 一 个 更 安 全 的 运 行 环 境 。 第 1 章 中 曾 提 过 , 把 服 务 主 机 直 接 部 署 在 因 特 网 之 上 对 服 务 主 机 本 身 的 安 全 性 而 言 是 不 好 的 。 因 此 , 为 了 给 服 务 主 机 提 供 一 个 较 安 全 的 运 行 环 境 , 我 们 可 以 将 服 务 主 机 部 署 在 企 业 内 部 。 如 图 2 - 4 1 所 示 , 在 N A T 主 机 上 安 装 三 张 网 卡 , 并 将 服 务 主 机 部 署 在 e t h 1 接 口 的 网 段 上 , 我 们 可 以 随 意 图2-40  多对多NAT 第 章   Netfilter/iptables 2 01 02 03 04 05 06 07 08 83 设置一个私有IP的网段,例如将Web 服务器的IP设置为192.168.0.1,Mail 服务器的IP设置为 192.168.0.2。 图2-41  一对一NAT 你或许会觉得奇怪,对外服务主机部署在私有IP的网段上,因特网使用者能够访问到其 所需的服务吗?这个问题我们只需要通过一对一NAT的机制就可以轻松解决了。首先必须准 备足够数量的公网IP,如图2-41所示,我们将10.0.1.200、10.0.1.201及10.0.1.202三个公网IP设置 在eth0的接口上,并分配10.0.1.200给内部网络执行一对多NAT使用,10.0.1.201给Web 服务器使 用,10.0.1.202给Mail 服务器使用;接着在NAT主机上设置:当有数据包要送给10.0.1.201这个 IP时,就将数据包内的目的端IP改为192.168.0.1,如此这个数据包就会被转发给Web 服务器; 但当Web 服务器应答给客户端时,我们就要特别处理这个数据包了,因为这个数据包是由Web 服务器应答的,而Web 服务器的IP是192.168.0.1,所以客户端收到的应答包将会是192.168.0.1 主机所送出的,但是客户端期望收到的应该是由10.0.1.201主机所应答的数据包。因此,当数 据包应答给客户端时,我们应当设法将数据包内的192.168.0.1改回10.0.1.201,如此才可以正常 提供服务,这就是一对一NAT的原理。 接下来分析如何设置一对一NAT的运行环境,同样我们必须考虑到数据包的“进入”及 “出去”两个部分,因此将其分开来讨论。 Linux 网络安全技术与实现 (第 版) 2 01 02 03 04 05 06 07 08 84 数据包的“进入”: ● 由 于 我 们 设 置 1 0 . 0 . 1 . 2 0 1 为 W e b 服 务 器 的 I P , 必 然 将 D N S 内 的 W W W 记 录 指 向 1 0 . 0 . 1 . 2 0 1 这 个 I P 。 因 此 , 因 特 网 使 用 者 在 浏 览 网 页 时 , 所 有 网 页 的 请 求 包 势 必 都 会 送 往 1 0 . 0 . 1 . 2 0 1 这 个 I P 。 接 着 , 我 们 必 须 将 这 些 数 据 包 内 的 D e s t i n a t i o n I P 改 为 1 9 2 . 1 6 8 . 0 . 1 , 这 些 数 据 包 才 能 真 正 地送达到W eb 服务器上,以下是这个DNA T的规则语法。 i p t a b l e s - t n a t - A P R E R O U T I N G - i e t h 0 - d 1 0 . 0 . 1 . 2 0 1 \ - j D N A T - - t o 1 9 2 . 1 6 8 . 0 . 1 从 这 语 法 不 难 发 现 , 这 个 语 法 与 一 对 多 N A T 的 语 法 相 当 类 似 , 因 为 我 们 所 运 行 的 是 D N A T , 因 此 , 必 须 将 规 则 加 入 到 P R E R O U T I N G 链 。 另 外 需 要 注 意 的 是 , P O S T R O U T I N G 链 是 以 数 据 包 “ 离 开 ” 的 接 口 来 标 明 数 据 包 的 流 向 , 如 - o e t h 0 , 但 P R E R O U T I N G 链 则 是 以 数 据 包 “ 进 入 ” 的 接 口 来 标 明 数 据 包 的 流 向 , 如 - i e t h 0 , 务 必 要 注 意 这 一 点 。 此 外 , 还 必 须 特 别 注 明 , 我 们 要 处 理 的 数 据 包 是 送 给 1 0 . 0 . 1 . 2 0 1 这 个 I P 的 , 因 此 将 - d 1 0 . 0 . 1 . 2 0 1 作 为 筛 选 条 件 之 一 。 最 后 如 果 进 入 的 数 据 包 符 合 以 上 规 则 , 就 执 行 D N A T 的 任 务 , 将 数 据 包 内 的 D e s t i n a t i o n I P 改 为 1 9 2 . 1 6 8 . 0 . 1 , 如 此 就 完 成 了 一 对 一 N A T 机 制 。 也 就 是 说 , 如 果 现 在 有 因 特 网 使 用 者 来 访 问 1 0 . 0 . 1 . 2 0 1 这 台 主 机 , 实 际 上 , 其 所 访 问 到 的 就 是 1 9 2 . 1 6 8 . 0 . 1 这 台 主 机 。 数据包的“出去”: ● 或 许 你 会 问 , 前 面 不 是 才 说 过 , 不 管 我 们 执 行 的 是 S N A T 或 D N A T 操 作 , N A T 机 制 都 会 自 动 帮 我 们 判 别 另 一 方 向 的 应 答 数 据 包 , 因 此 , 我 们 只 需 要 下 达 单 一 方 向 的 规 则 即 可 , 为 什 么 还 需 要 考 虑 数 据 包 出 去 的 问 题 呢 ? 没 错 ! 如 果 要 让 因 特 网 使 用 者 正 常 访 问 我 们 的 W e b 服 务 器 , 只 需 要 设 置 D N A T 的 部 分 即 可 , 但 是 别 忘 了 , 我 们 会 不 会 在 W e b 服 务 器 上 访 问 因 特 网 上 的 主 机 呢 ? 如 果 不 会 , 数 据 包 “ 出 去 ” 的 部 分 就 大 可 不 必 理 会 ; 但 如 果 会 , 就 请 你 帮 W e b 服 务 器 设 置 一 个 出 去 的 管 道 吧 ! 这 条 S N A T 的 规 则 如 下 。 设 置 好 规 则 之 后 , 每 当 你 在 W e b 服 务 器 上 访 问因特网上的其他主机时,你的W eb 服务器就是以10.0.1.201这个公网IP在因特网上活动的。 i p t a b l e s - t n a t - A P O S T R O U T I N G - o e t h 0 - s 1 9 2 . 1 6 8 . 0 . 1 \ - j S N A T - - t o 1 0 . 0 . 1 . 2 0 1 关于Mail 服务器的部分,其原理与W eb 服务器是相同的,就留给你自己去思考了。 4. NAPT 在 了 解 了 一 对 一 N A T 之 后 , 你 或 许 会 觉 得 设 置 很 麻 烦 。 笔 者 经 常 在 教 室 里 和 同 学 说 , 有 多 个 I P 让 你 可 以 使 用 一 对 一 N A T 是 幸 福 的 , 万 一 你 工 作 的 公 司 所 使 用 的 A D S L 就 只 有 一 个 公 网 I P , 或 者 公 网 I P 不 够 用 时 该 怎 么 办 ? 其 实 这 个 问 题 并 没 有 想 象 中 的 那 么 难 , 我 们 只 需 要 通 过 N A P T 机 制 就 可 以 轻 松 解 决 这 个 问 题 。 什 么 是 N A P T ? N A P T ( N e t w o r k A d d r e s s P o r t T r a n s l a t i o n ) 第 章   Netfilter/iptables 2 01 02 03 04 05 06 07 08 85 以端口为单位来执行NAT任务。以图2-42为例,假设我们只有一个公网IP可以使用,因此,我 们将这个宝贵的公网IP设置在eth0接口上,另外将对外服务的主机部署于192.168.0.0/24的网段 上,分别使用192.168.0.1及192.168.0.2两个IP。接着来分析该如何设置这个NAPT。在这个示例 中,我们只有两台对外服务的主机,分别是Web 服务器及Mail 服务器,下面首先进行归类。 图2-42  NAPT Web 服务器:Web 服务器所需要使用到的端口只有TCP Port 80及TCP Port 443,因 ● 此,我们只需将访问10.0.1.200这个IP的TCP Port 80及TCP Port 443的数据包转发给 192.168.0.1即可。 Mail 服务器:Mail 服务器所需要使用到的端口只有TCP Port 25及TCP Port 110,因 ● 此,我们只需将访问10.0.1.200这个IP的TCP Port 25及TCP Port 110的数据包转发给 192.168.0.2即可。 分析完以上事项之后,就可以着手编写这些规则了,规则如下。 Web 服务器: ● iptables -t nat -A PREROUTING -i eth0 -p tcp ---dport 80 \ -j DNAT --to 192.168.0.1:80 iptables -t nat -A PREROUTING -i eth0 -p tcp ---dport 443 \ -j DNAT --to 192.168.0.1:443 Linux 网络安全技术与实现 (第 版) 2 01 02 03 04 05 06 07 08 86 请 注 意 , 因 为 以 上 规 则 中 使 用 到 - - d p o r t 的 参 数 , 因 此 , 我 们 必 须 额 外 添 加 - p t c p 参 数 。 当 以上命令下达完毕后,因特网上使用者就可以正常访问W eb 服务器了。 Mail 服务器: ● i p t a b l e s - t n a t - A P R E R O U T I N G - i e t h 0 - p t c p - - - d p o r t 2 5 \ - j D N A T - - t o 1 9 2 . 1 6 8 . 0 . 2 : 2 5 i p t a b l e s - t n a t - A P R E R O U T I N G - i e t h 0 - p t c p - - - d p o r t 1 1 0 \ - j D N A T - - t o 1 9 2 . 1 6 8 . 0 . 2 : 1 1 0 如W eb 服务器一样,因为规则中使用--dport的参数,因此需要加上-p tcp参数。当以上命 令下达完毕后,因特网使用者就 可以正常访问Mail 服务器了。 虽 然 以 上 命 令 就 可 以 让 因 特 网 使 用 者 正 常 访 问 W e b 及 M a i l 的 服 务 , 但 还 是 要 讨 论 一 下 有 关 数 据 包 出 去 的 部 分 , 如 一 对 一 N A T 。 如 果 你 不 需 要 在 W e b 服 务 器 或 M a i l 服 务 器 上 访 问 其 他 因 特 网 上 的 主 机 , 那 么 数 据 包 出 去 的 部 分 就 不 需 要 考 虑 ; 但 如 果 有 这 个 需 求 , 就 请 你 帮 W e b 服 务 器 及 M a i l 服 务 器 执 行 一 个 S N A T 操 作 吧 ! 不 过 , 在 此 并 不 需 要 为 1 9 2 . 1 6 8 . 0 . 0 / 2 4 网 段 的 每 一 台 主 机 单 独 写 一 条 S N A T 规 则 , 因 为 在 这 个 例 子 中 不 管 你 怎 么 写 , 最 后 还 是 只 能 转 到 10.0.1.200这个公网IP上,因此,我们的规则只需要如下一行即可。 i p t a b l e s - t n a t - A P O S T R O U T I N G - o e t h 0 - s 1 9 2 . 1 6 8 . 0 . 0 / 2 4 \ - j S N A T - - t o 1 0 . 0 . 1 . 2 0 0 2 . 1 2 . 6   N A T 并 非 无 所 不 能 ❙ 看 完 以 上 的 示 例 , 相 信 你 已 具 备 构 建 N A T 环 境 的 能 力 。 但 有 一 点 必 须 先 提 醒 你 , N A T 不 是 万 能 的 , 并 不 是 把 服 务 于 因 特 网 上 的 主 机 搬 到 N A T 后 方 , 它 就 安 全 了 。 事 实 上 , 以 一 对 一 N A T 为 例 , 当 因 特 网 上 的 使 用 者 攻 击 一 对 一 N A T 的 公 网 I P 时 , 这 个 攻 击 包 是 会 被 转 发 到 N A T 后 方 的 服 务 主 机 上 , 因 此 , 真 正 提 供 服 务 的 主 机 并 没 有 因 为 N A T 的 存 在 而 得 到 任 何 安 全 性 的 提 升 。 你 一 定 会 觉 得 很 奇 怪 , 那 为 什 么 还 要 把 服 务 主 机 放 到 N A T 后 方 呢 ? 因 为 N A T 要 与 F i l t e r 机 制 结 合 使 用 , 才 能 使 服 务 主 机 得 到 真 正 的 安 全 , 至 于 N A T 与 F i l t e r 机 制 该 如 何 结 合 ? 这 部 分 将在2.14.1一节中给出非常清楚的解释,请耐心等待,因为还有很多基本知识需要你了解。 2.13  Netfilter的Mangle机制 M a n g l e 是 一 个 比 较 容 易 被 人 忽 略 的 机 制 , 而 且 M a n g l e 的 使 用 机 会 并 不 是 很 多 , 但 如 果 需 要时又不懂Mangle机制,也是件很麻烦的事,在此还是要说明 一下Mangle机制。 当 一 个 数 据 包 “ 穿 过 ” 防 火 墙 时 , 我 们 可 以 通 过 M a n g l e 的 机 制 来 修 改 数 据 包 的 内 容 , 至 第 章   Netfilter/iptables 2 01 02 03 04 05 06 07 08 87 于修改范围有多大?就得看Mangle机制里模块的支持程度。目前支持Mangle机制的模块并不 多,所以我们的选择范围也不大,为什么需要修改路过防火墙数据包的内容呢?下面将用两 个示例来说明Mangle目前能提供的功能及用途。 修改IP包头的TTL值: ● 由于每一种操作系统所生成的数据包的IP包头内TTL的默认值都不一样,因此我们只需 要通过ping这个命令,就可检查出某一台主机所使用的操作系统是什么。为了增加黑客的入 侵难度,可以修改所有由Linux主机所发送的数据包,将这些数据包内的TTL值改为128,让 黑客误以为是Windows操作系统;也可以将所有由Windows操作系统所送出的数据包TTL值 改为64,让黑客误以为是Linux系统。 修改IP包头的DSCP值或对特定的数据包设置特征: ● 在网络应用中,有时对某些特定通信协议会有特别的需求。例如,在网络电话的应用 环境里,我们会希望“不管网络多么拥塞,VoIP的数据包都要能在不延迟的情况下发送出 去”。因此就有了QOS(Quality of Service)机制,QOS机制可以让我们在有限的带宽中,有效 分配不同的带宽给不同的协议来使用。如图2-43所示,总带宽是1.5MB/s,我们可以将其分 为几部分:512KB/s给HTTP协议来使用、384KB/s给SMTP协议使用、256KB/s给Voice的数据 包使用,最后剩下来的带宽则留给未定义的协议。 总带宽 1.5M HTTP 512K SMTP 384K Voice 526K Other 384K 图2-43  QOS带宽分配图 QOS机制是由两个不同部分组成,其一为“数据包分类器”,其二为“带宽分配器”。 如图2-44所示,当一个数据包进入“数据包分类器”之后,数据包即会被加以分类,被分类 后的数据包接着进入“带宽分配器”,再由带宽分配器来决定各类数据包可以使用多少网络 带宽,问题是如何分类数据包呢?我们至少可以运用Mangle机制中的两个模块来达到此目 的,如下。 Linux 网络安全技术与实现 (第 版) 2 01 02 03 04 05 06 07 08 88 通过IP包内的DSCP值来分类: ● 我 们 可 以 通 过 M a n g l e 机 制 来 修 改 I P 包 内 的 D S C P 值 , 例 如 , 把 D S C P 值 改 为 0 0 0 0 - 0 1 , 接 着 在 “ 带 宽 分 配 器 ” 上 设 置 , 如 果 数 据 包 内 的 D S C P 值 为 0 0 0 0 - 0 1 的 话 , 就 给 予 6 4 K B / s 的 带 宽 。 使用Mangle机制为数据包标示识别码: ● M a n g l e 机 制 可 以 为 特 定 的 数 据 包 来 标 示 不 同 的 识 别 码 , 例 如 , 如 果 数 据 包 内 的 S o u r c e P o r t 为 8 0 , 就 标 示 该 数 据 包 的 识 别 码 为 8 0 。 接 着 在 “ 带 宽 分 配 器 ” 上 设 置 , 如 果 数 据 包 的 识 别码为80,就给予512KB/s的带宽,如此也可以达到带宽分类的目的。 图2-44  QOS结构图 图 2 - 4 5 是 M a n g l e 机 制 的 结 构 图 , 从 图 中 不 难 发 现 , M a n g l e 机 制 的 链 很 多 , 但 你 必 须 要 了 解 , 不 管 是 f i l t e r 、 n a t 、 m a n g l e 或 是 稍 后 会 提 到 的 r a w 机 制 , 它 们 的 链 都 各 自 独 立 。 因 此 , f i l t e r 机 制 的 I N P U T 链 内 容 与 M a n g l e 机 制 的 I N P U T 链 内 容 绝 对 是 不 相 同 的 , 请 务 必 认 清 这 一 点 。 而 数 据 包 在 图 2 - 4 5 中 的 处 理 方 式 则 与 f i l t e r 及 N A T 相 同 , 因 此 如 果 想 要 改 变 本 机 进 程 所 生 成 的 数 据 包 内 的 D S C P 值 , 就 必 须 将 规 则 放 置 于 O U T P U T 链 之 中 , 或 是 P O S T R O U T I N G 链 之 内 都 可 以 达 到 我 们 的 目 的 , 因 为 本 机 进 程 所 产 生 的 数 据 包 , 除 了 会 流 经 O U T P U T 链 之 外 , 也 会经过POSTROUTING链,因此,这两个链都可供使用。 图2-45  Mangle的结构 最 后 以 “ 修 改 数 据 包 的 D S C P 值 ” 为 例 进 行 讨 论 。 我 们 希 望 在 Q O S 机 制 中 将 S S H 协 议 的 数 据 包 设 置 为 较 为 优 先 传 输 的 数 据 包 , 因 此 使 用 M a n g l e 机 制 来 修 改 数 据 包 内 的 D S C P 值 。 在 尚 未 修 改 D S C P 值 之 前 , 先 抓 取 几 个 数 据 包 来 分 析 , 图 2 - 4 6 即 为 数 据 包 I P 包 头 的 内 容 , 其 中 表 示  的位置就是DSCP值,默认值为0000-00。 第 章   Netfilter/iptables 2 01 02 03 04 05 06 07 08 89  图2-46  Linux系统默认的DSCP值 接着在本机使用Mangle机制修改本机进程所产生的数据包,并且设置所要修改的数据包 为SSH协议的数据包,而修改后的DSCP值为43,其规则如下。 iptables -t mangle -A OUTPUT -p tcp --dport 22 -j DSCP --set-dscp 43 图2-47为使用Mangle机制修改后的数据包,并且我们从标示的位置看到DSCP值已被 修改为1010-11,而1010-11的十进制刚好就是43,以上即可证明Mangle机制真的可以修改数 据包的内容。  图2-47  修改后的DSCP值 2.14 Netfilter的raw机制 RAW是目前Netfilter发展历程中的最后一个表,不过raw表的功能会与一个被称为“连接 跟踪”的机制有关。连接跟踪的机制在第3章中才会提到,因此我们将在连接跟踪机制介绍 完毕之后,再介绍raw表的功能。 Netfilter的完整结构 图2-48为Netfilter的完整结构图,从图中可以清楚看到整个Netfilter的完整结构,这个结 构共由四个不同的机制组合而成,分别是filter、nat、mangle及raw四个表,而每个机制所含 有的链都不一样,图2-48可以帮助我们了解每个机制与机制之间的关系。此外,请务必熟记 Linux 网络安全技术与实现 (第 版) 2 01 02 03 04 05 06 07 08 90 链 与 链 之 间 的 先 后 顺 序 , 因 为 “ 顺 序 ” 在 防 火 墙 的 规 则 设 计 上 时 非 常 重 要 的 , 无 论 如 何 , 请 你都要把图2-48全部记住。 图2-48  Netfilter的完整机构 如 果 你 还 是 无 法 了 解 这 整 个 结 构 顺 序 的 重 要 性 , 可 以 通 过 图 2 - 4 9 来 了 解 “ 顺 序 ” 上 的 重 要 性 。 图 2 - 4 9 是 一 个 一 对 一 N A T 的 结 构 , 假 设 1 0 . 0 . 1 . 2 0 0 、 1 0 . 0 . 1 . 2 0 1 及 1 0 . 0 . 1 . 2 0 2 都 是 公 网 I P , 并 且 将 1 0 . 0 . 1 . 2 0 1 对 应 到 1 9 2 . 1 6 8 . 0 . 1 , 也 就 是 我 们 的 W e b 服 务 器 ; 接 着 再 假 设 有 一 黑 客 其 I P 为 1 9 2 . 1 6 8 . 1 0 . 1 2 , 该 黑 客 目 前 正 在 攻 击 1 0 . 0 . 1 . 2 0 1 这 个 I P , 我 们 稍 早 曾 经 说 过 “ N A T 并 非 万 能 的 ” , N A T 无 法 保 护 我 们 对 外 公 开 的 服 务 主 机 , 因 为 当 有 任 何 的 攻 击 数 据 包 送 到 1 0 . 0 . 1 . 2 0 1 这 个 I P 时 , N A T 也 会 把 攻 击 数 据 包 转 发 到 真 正 的 W e b 服 务 器 上 , 因 此 , 必 须 通 过 f i l t e r 机 制 来 保 护 我 们 的 W e b 服 务 器 , 问 题 是 这 个 f i l t e r 的 语 法 该 如 何 下 达 呢 ? 笔 者 将 规 则 改 写 为 如 下 形 式 。 i p t a b l e s - t f i l t e r - A X X X - s 1 9 2 . 1 6 8 . 1 0 . 1 2 - d w w . x x . y y . z z - j D R O P 请试着思考以下两个问题: 规则中XXX应该设置为哪个链? ● 规则中的ww .xx.yy .zz应该设置为10.0.1.201还是192.168.0.1呢? ● 要 真 正 了 解 这 两 个 问 题 , 就 得 从 N e t f i l t e r 的 结 构 图 来 着 手 , 以 图 2 - 5 0 为 例 , 当 黑 客 发 出 攻 击 包 时 , 这 个 包 的 D e s t i n a t i o n I P 为 1 0 . 0 . 1 . 2 0 1 。 因 此 , 当 数 据 包 送 达 防 火 墙 时  , 其 De st i na t i on I P应该 是1 0. 0. 1. 20 1, 但当 这个 数据 包经 过NA T 的PR E R OUT ING链之后 ,由 于我 们 执 行 D N A T 操 作 , 因 此 数 据 包 到 达  的 位 置 时 , 其 D e s t i n a t i o n I P 已 被 改 变 成 1 9 2 . 1 6 8 . 0 . 1 。 当 数 据 包 进 入 路 由 表 判 断 后 , 数 据 包 即 会 被 转 送 到 F O R W A R D 链 , 而 由 于 数 据 包 到 达 F O R W A R D 第 章   Netfilter/iptables 2 01 02 03 04 05 06 07 08 91 链之前,其Destination IP已被改变成192.168.0.1了,因此在FORWARD链中根本不可能看到 10.0.1.201这个IP(DNAT机制在FORWARD链之前)。 图2-49  一对一NAT 图2-50  简化的Netfilter结构 以上两个问题的答案分别为FORWARD链及192.168.0.1,你答对了吗?如果没有的话, 请再次好好品味一下图2-48。 2.15 小结 本章介绍了Netfilter的结构、iptables工具的使用方法以及Netfilter的规则语法,虽然这些 都是Linux防火墙最基础的部分,但也是Linux防火墙在许多运用中进行扩展的基础,因此无 论如何这个章节中的每一个细节都请你要明确地理解,否则将严重影响到后续章节的学习, 也会直接导致所设计的防火墙系统不够可靠。 Linux 10 基于策略的路由及多路带宽合并第10章 Linux 网络安全技术与实现(第 版) 2 09 10 11 12 13 14 15 16 294 L i n u x 的 防 火 墙 功 能 表 现 优 异 , 此 外 L i n u x 还 有 另 一 项 鲜 为 人 知 的 特 殊 功 能 , 那 就 是 基 于 策 略 的 路 由 功 能 ( L i n u x Ad v a n c e R o u t i n g ) , 这 项 功 能 通 常 只 会存 在 于非 常 高级 的 路由 设 备 上 , 但 通 过 开 源 组 织 志 愿 者 们 的 努 力 , 我 们 可 以 免 费 使 用 到 这 种 强 大 的 网 络 路 由 机 制 。 在 讨 论 基 于 策 略 的 路 由 时 , 有 必 要 讨 论 一 下 多 路 带 宽 合 并 , 因 此 , 本 章 除 讨 论 基 于 策 略 的 路 由 之 外 , 还会增加多路带宽合并的相关话题。 10.1  何谓基于策略的路由 在 开 始 讨 论 基 于 策 略 的 路 由 前 , 我 们 先 来 熟 悉 一 下 传 统 L i n u x 系 统 的 路 由 机 制 。 首 先 在 实 验 用 的 主 机 上 安 装 三 块 网 卡 , 并 设 定 其 I P 分 别 是 1 9 2 . 1 6 8 . 0 . 1 、 1 9 2 . 1 6 8 . 1 . 1 、 1 9 2 . 1 6 8 . 2 . 1 ( 假 设 这 些 I P 都 是 公 网 I P ) , 在 网 络 服 务 重 新 启 动 后 , 可 以 使 用 r o u t e 命 令 来 观 察 主 机 上 的 路 由 表 , 如 图 1 0 - 1 所 示 。 路 由 表 的 作 用 是 指 导 主 机 该 如 何 向 外 发 送 数 据 包 , 如 图 1 0 - 2 所 示 。 当 本 机 有 数 据 包 要 送 往 1 6 8 . 9 5 . 1 . 1 时 , 这 个 数 据 包 必 然 标 记 来 源 端 I P 为 1 9 2 . 1 6 8 . 0 . 2 及 目 的 端 I P 为 1 6 8 . 9 5 . 1 . 1 ( 在 I P 包 头 内 ) , 接 着 系 统 就 会 以 数 据 包 内 的 目 的 端 I P 1 6 8 . 9 5 . 1 . 1 作 为 路 由 匹 配 的 依 据 , 首 先 将 1 6 8 . 9 5 . 1 . 1 匹 配 路 由 表 的 第  条 规 则 , 结 果 发 现 1 6 8 . 9 5 . 1 . 1 并 不 包 含 在 1 9 2 . 1 6 8 . 0 . 0 / 2 4 的 网 段 内 , 接 着 只 能 向 下 匹 配 第  条 规 则 , 结 果 发 现 1 6 8 . 9 5 . 1 . 1 还 是 不 包 含 在 1 9 2 . 1 6 8 . 1 . 0 / 2 4 的 网 段 内 , 接 着 向 下 匹 配 第  规 则 , 但 结 果 还 是 一 样 , 最 后 匹 配 第  条 规 则 , 不 过 , 第  条 规 则 的 标 记 比 较 特 殊 , 其 d e s t i n a t i o n 标 记 为 0 . 0 . 0 . 0 , 且 网 关 标 示 为 0 . 0 . 0 . 0 , 这 0 . 0 . 0 . 0 / 0 . 0 . 0 . 0 的 含 义 是 任 何 目 的 端 都 符 合 , 其 实 最 后 一 条 规 则 就 是 在 网 络 配 置 中 所 设 置 的 “ 默 认 网 关 ” , 因 此 , 可 以 看 到 第  条 规 则 的 网 关 值 是 1 9 2 . 1 6 8 . 0 . 2 5 4 , 正 是 我 们 所 设 置 的 默 认网关地址 。 图10-1  何谓基于策略的路由 第 章   基于策略的路由及多路带宽合并 10 09 10 11 12 13 14 15 16 295 eth1 eth0 eth2 ip :192.168.1.10 gw:192.168.1.1 ip :192.168.0.2 gw:192.168.0.254 ip :192.168.1.1 ip :192.168.2.1 ip :192.168.0.254 图10-2  Linux路由解释 再列举一个例子,如果本机要将数据包发送 到192.168.1.10,又该如何发送数据包呢?如果数 据包是由本机送给192.168.1.10,那么系统就会以 192.168.1.10为依据与路由表从上到下逐条进行匹 配。首先匹配第条规则发现,192.168.1.10并不包 含在192.168.0.0/24的网段内,接着匹配第条规则发 现,192.168.1.10正是属于192.168.1.0/24这个网段内 的IP,系统就会将这个数据包从eth1接口(由规则中最 后一个字段所设置)送出,从而完成一个数据包的转 发操作。 由以上的处理流程可以了解到,Linux判断数据 包转发的依据是目的端IP,因此,Linux系统无法提 供一些较高级的路由机制,以图10-3为例,Linux系 统无法提供: Group A的计算机经由HiNet线路上网。 ● Group B的计算机经由Seednet线路上网。 ● 所有POP3及FTP通信协议经由Seednet线路上网。 ● 所有HTTP及SMTP协议经由HiNet线路上网。 ● 以上仅列举几个简单例子,只要是以目的端IP为路由依据以外的规则,传统的Linux路 由机制是无法做到的,其实,大多数的一般路由器也都无法提供此类功能,而这种可以随着 需求而任意设置路由路径的方式,我们称为基于策略的路由。 图10-3  何谓基于策略的路由 Linux 网络安全技术与实现(第 版) 2 09 10 11 12 13 14 15 16 296 10.2  了解Linux的路由机制 L i n u x 历 经 无 数 岁 月 的 洗 礼 后 , 在 L i n u x 2 . 2 版 本 正 式 加 入 了 A d v a n c e d R o u t i n g 机 制 , 使 得 L i n u x 系 统 的 路 由 机 制 超 越 了 大 多 数 的 商 用 路 由 器 , 因 此 , 也 使 得 L i n u x 系 统 的 路 由 表 变 得 更 加 复 杂 。 图 1 0 - 4 显 示 了 当 今 L i n u x 系 统 的 路 由 表 , 从 图 中 可 以 看 到 , L i n u x 系 统 可 同 时 存 在 多 个 路 由 表 , 一 般 的 操 作 系 统 都 只 有 一 个 路 由 表 , 但 L i n u x 系 统 却 可 多 达 2 5 6 个 , 且 每 个 路 由 表 都 各 自 独 立 , 互 不 相 关 。 那 么 , L i n u x 系 统 在 传 输 数 据 包 时 , 会 根 据 哪 个 路 由 表 来 传 输 呢 ? 这 个 答 案 就 是 “ 路 由 策 略 数 据 库 ” ( R o u t i n g P o l i c y D a t a b a s e , R P D B ) , 我 们 可 以 在 R P D B 内 填 写 一 些 路 由 规 则 来 确 定 “ 哪 类 数 据 包 ” 应 该 “ 根 据 哪 个 路 由 表 ” 来 传 输 , 如 此 , 系 统 管 理 人 员就会有更大的自主性来决定数据包的传输路径。 图10-4  Linux路由表 路由策略数据库与路由表 如 图 1 0 - 5 所 示 , 可 以 使 用 i p r u l e s h o w 命 令 将 R P D B 的 内 容 显 示 出 来 , 可 将 这 些 信 息 大 概 分 为 三 个 字 段 , 其 中 字 段  为 P r i o r i t y , 简 单 来 说 , 就 是 R u l e 被 匹 配 的 优 先 顺 序 , 数 字 越 小 , 代 表 优 先 级 别 越 高 , 也 就 是 越 早 被 匹 配 ; 字 段  是 R u l e 的 规 则 , 也 就 是 匹 配 数 据 包 的 依 据 , 在 此 可 以 是 S o u r c e I P 、 D e s t i n a t i o n I P 、 T y p e o f S e r v i c e 、 f w m a r k 及 d e v 等 ; 字 段  则 是符合条件的数据包要通过哪个路由表送出。 在 L i n u x 系 统 中 , 路 由 表 是 根 据 I D 来 区 分 的 , 而 I D 的 范 围 是 0 ~ 2 5 5 。 由 于 I D 对 于 管 理 员 而 言 实 在 是 不 好 记 忆 , 因 此 基 于 策 略 路 由 的 管 理 工 具 —— i p r o u t e 提 供 了 一 个 I D 与 名 称 的 对 应 表 : / e t c / i p r o u t e 2 / r t _ t a b l e s , 方 便 我 们 使 用 名 称 来 记 忆 特 定 的 路 由 表 。 下 面 使 用 图 1 0 - 6 及 图 图10-5  规则表 第 章   基于策略的路由及多路带宽合并 10 09 10 11 12 13 14 15 16 297 10-7来说明rt_table对应表的用法,如图10-6,先使用ip命令加入一条规则,这条规则的意 思是说,如果来源端IP位于192.168.2.0/24网段,那么就使用ID编号为10的路由表加以处理, 接着使用ip rule show命令将RPDB的内容显示出来,我们可以从的位置看到多了一条规 则,且这条规则使用ID来代表路由表。 图10-6  路由表的命名(一) 接着以图10-7为例,在rt_table文件中加入一行如所示,保存文件后,再使用ip rule show命令来查看RPDB,这时就可以发现原来使用ID来代表路由表的地方,已经改为我们在 rt_table之中所设置的名称了。 图10-7  路由表的命名(二) Linux 网络安全技术与实现(第 版) 2 09 10 11 12 13 14 15 16 298 10.3  路由策略数据库与路由表的管理 早 期 在 管 理 L i n u x 系 统 的 网 络 时 , 常 使 用 i f c o n f i g 及 r o u t e 之 类 的 命 令 , 不 过 如 果 你 准 备 开 始 使 用 L i n u x 强 大 的 基 于 策 略 的 路 由 机 制 , 那 么 , 就 请 不 要 使 用 这 类 工 具 了 , 因 为 这 类 工 具 根 本 无 法 用 于 功 能 强 大 的 基 于 策 略 的 路 由 机 制 , 取 而 代 之 的 工 具 是 i p r o u t e 。 i p r o u t e 这 个 软 件 在 R e d H a t 系 列 的 L i n u x 系 统 中 是 默 认 安 装 的 , 因 此 , 你 通 常 可 以 找 到 这 个 工 具 。 如 果 真 因 为 某 些 原 因 找 不 到 这 个 软 件 , 只 要 在 使 用 F e d o r a 或 C e n t O S L i n u x 时 , 在 联 网 的 情 况 下 , 用 y u m i n s t a l l i p r o u t e 命 令 即 可 顺 利 安 装 ; 或 者 也 可 以 使 用 i p - V 命 令 来 检 查 i p r o u t e 软 件 是 否 已 经 安 装 , 再 次 请 注 意 , - V 参 数 为 大 写 的 英 语 字 母 : [ r o o t @ l o c a l h o s t / ] # i p - V i p u t i l i t y , i p r o u t e 2 - s s 0 9 1 2 2 6 1 0 . 3 . 1   管 理 策 略 数 据 库 ❙ 在 L i n u x 下 , 基 于 策 略 路 由 的 策 略 数 据 库 是 由 i p 命 令 来 管 理 的 , 下 面 讨 论 “ 管 理 ” 的 几 个 方面: 1. 查看策略数据库 要 查 看 策 略 数 据 库 的 内 容 , 可 以 使 用 i p r u l e s h o w 命 令 , 或 者 可 以 使 用 i p r u l e l s 。 如 下 是 命 令 执 行 后 所 得 到 的 输 出 结 果 , 在 这 些 数 据 中 , 可 以 看 到 系 统 的 三 条 默 认 规 则 , 而 这 三 条 规 则默认分别对应于local、mail及default三个路由表。 [ r o o t @ l o c a l h o s t / ] # i p r u l e s h o w 0 : f r o m a l l l o o k u p l o c a l 3 2 7 6 6 : f r o m a l l l o o k u p m a i n 3 2 7 6 7 : f r o m a l l l o o k u p d e f a u l t 2. 添加规则 在 添 加 规 则 时 , 必 须 先 确 定 好 “ 条 件 ” 、 “ 优 先 级 别 ” 及 “ 路 由 表 I D ” , 此 后 才 可 以 执 行添加规则的操作。关于这三个参数的含义,我们根据图10-5再说明一次: 条件 条 件 是 用 来 决 定 哪 类 数 据 包 可 以 符 合 这 项 规 则 , 而 可 用 来 匹 配 的 字 段 为 S o u r c e I P 、 Destination IP、T ype of Service、fwmark及dev等,这些字段的使用方式如下: 第 章   基于策略的路由及多路带宽合并 10 09 10 11 12 13 14 15 16 299 Source IP: ● 根据来源端IP来决定数据包参考哪个路由表发送出去。以下两个示例分别指出,如果数 据包的来源端IP是192.168.1.10,就参考路由表10;如果来源端IP为192.168.2.0/24网段的IP, 就参考路由表20。 ip rule add from 192.168.1.10 table 10 ip rule add from 192.168.2.0/24 table 20 Destination IP: ● 根据目的端IP来决定数据包参考哪个路由表发送出去。以下两个示例分别指出,如果数 据包的目的端IP是168.95.1.1,就参考路由表10;如果目的端IP是168.95.0.0/24网段的IP,就 参考路由表20。 ip rule add to 168.95.1.1 table 10 ip rule add to 168.96.0.0/24 table 20 fwmark: ● fwmark指第3章所提到过的nfmark,如果你 已忘了nfmark的含义,不妨参考第2.2.6节。将 fwmark作为匹配条件时,必须搭配Netfilter一起 使用,这看起来很麻烦,却是最灵活的匹配条 件。如图10-8所示,某公司对外有三条ADSL, 我 们 希 望 所 有 H T T P 协 议 经 由 第 一 条 A D S L , SMTP及POP3经由第二条ADSL,其余流量则经 由第三条ADSL。可以使用如下的命令组合来达 到这样的目的: iptables -t mangle -A FORWARD -i eth3 -p tcp --dport 80 -j MARK --set-mark 1 iptables -t mangle -A FORWARD -i eth3 -p tcp --dport 25 -j MARK --set-mark 2 iptables -t mangle -A FORWARD -i eth3 -p tcp --dport 110 -j MARK --set-mark 2 iptables -t mangle -A FORWARD -i eth3 -j MARK --set-mark 3 ip rule add fwmark 1 table 1 ip rule add fwmark 2 table 2 ip rule add fwmark 3 table 3 首先使用Netfilter的managle机制针对特定的数据包设置MARK值,在此将HTTP数据包 的MARK值设置为1,SMTP及POP3数据包的MARK值设置为2,其余数据包则设置MARK值 ISP eth0 eth2eth1 eth3 ADSL 1 ADSL 2 ADSL 3 图10-8  fwmark示例 Linux 网络安全技术与实现(第 版) 2 09 10 11 12 13 14 15 16 300 为 3 。 接 着 , 再 根 据 f w m a r k 条 件 来 判 断 数 据 包 的 M A R K 值 , 如 果 M A R K 值 为 1 , 则 参 考 路 由 表 1 将 数 据 包 送 出 ; M A K R 值 为 2 时 , 则 参 考 路 由 表 2 将 数 据 包 送 出 ; 最 后 , M A R K 值 为 3 的 数 据 包则参考路由表3送出。 以 上 示 例 只 是 一 个 概 念 而 已 , 如 果 真 要 完 整 体 现 出 这 个 示 例 的 所 有 功 能 , 还 需 要 注 意 许 多 细 节 , 稍 后 将 使 用 详 细 的 示 例 讲 解 这 部 分 内 容 , 在 此 只 要 首 先 了 解 f w m a r k 与 N e t f i l t e r 结 合 使用的概念即可。 dev: ● 最 后 , 还 可 以 使 用 数 据 包 输 入 的 接 口 来 作 为 判 断 依 据 , 如 图 1 0 - 9 所 示 , 我 们 希 望 凡 是 由 e t h 2 接 口 送 入 的 数 据 包 都 由 e t h 0 接 口 转 发 出 去 , 由 e t h 3 接 口 送 入 的 数 据 包 都 由 e t h 1 接 口 转 发 出 去 。 以 下 命 令 组 合将能满足我们的要求: i p r u l e a d d d e v e t h 2 t a b l e 1 i p r u l e a d d d e v e t h 3 t a b l e 3 3. 优先级别 前 面 介 绍 了 规 则 中 “ 条 件 ” 的 使 用 方 式 , 接 下 来 要 讨 论 的 是 优 先 级 别 。 优 先 级 别 用 数 字 来 表 示 , 其 范 围 可 由 0 ~ 4 亿 多 , 堪 称 天 文 数 字 , 我 们 实 际 上 不 可 能 在 一 台 P C 上 设 置 如 此 庞 大 的路由机制。 [ r o o t @ l o c a l h o s t ~ ] # i p r u l e s h o w 0 : f r o m a l l l o o k u p l o c a l 3 2 7 6 6 : f r o m a l l l o o k u p m a i n 3 2 7 6 7 : f r o m a l l l o o k u p d e f a u l t [ r o o t @ l o c a l h o s t ~ ] # [ r o o t @ l o c a l h o s t ~ ] # i p r u l e a d d f r o m 1 9 2 . 1 6 8 . 1 . 0 / 2 4 t a b l e 1 [ r o o t @ l o c a l h o s t ~ ] # i p r u l e a d d f r o m 1 9 2 . 1 6 8 . 2 . 0 / 2 4 t a b l e 2 [ r o o t @ l o c a l h o s t ~ ] # [ r o o t @ l o c a l h o s t ~ ] # i p r u l e s h o w 0 : f r o m a l l l o o k u p l o c a l 3 2 7 6 4 : f r o m 1 9 2 . 1 6 8 . 2 . 0 / 2 4 l o o k u p 2 3 2 7 6 5 : f r o m 1 9 2 . 1 6 8 . 1 . 0 / 2 4 l o o k u p 1 3 2 7 6 6 : f r o m a l l l o o k u p m a i n 3 2 7 6 7 : f r o m a l l l o o k u p d e f a u l t 如 以 上 示 例 , 我 们 执 行 i p r u l e s h o w 命 令 所 显 示 内 容 的 第 一 个 字 段 就 是 优 先 级 别 , 数 字 越 小 , 代 表 优 先 级 别 越 高 , 也 代 表 这 条 规 则 可 以 排 得 越 靠 前 , 如 此 数 据 包 在 进 行 条 件 匹 配 时 , 就 会 越 早 匹 配 到 这 条 规 则 , 从 输 出 的 数 据 中 , 默 认 优 先 级 别 0 、 3 2 7 6 6 及 3 2 7 6 7 已 被 占 用 , 因 et h0 et h3 et h2 et h1 图10-9  接口示例 第 章   基于策略的路由及多路带宽合并 10 09 10 11 12 13 14 15 16 301 此,在添加规则时,如果没有特别设置优先级别,那么,优先级别默认会从32766开始递 减,如32765、32764……,如果我们需要特别设置优先级别,可以在ip rule add命令的最后加 上prio XXX参数。如下例所示: [root@localhost ~]# ip rule show 0: from all lookup local 32766: from all lookup main 32767: from all lookup default [root@localhost ~]# [root@localhost ~]# ip rule add from 192.168.1.0/24 table 1 prio 10 [root@localhost ~]# ip rule add from 192.168.2.0/24 table 2 prio 20 [root@localhost ~]# [root@localhost ~]# ip rule show 0: from all lookup local 10: from 192.168.1.0/24 lookup 1 20: from 192.168.2.0/24 lookup 2 32766: from all lookup main 32767: from all lookup default 路由表ID 在Linux的基于策略的路由中,路由表用ID来表示,但如有必要,还可以用ID与名称对 照表将ID转换成名称,关于这部分请参考第10.2.1节。 4. 删除规则 ip命令提供的删除规则的方式十分灵活,例如,要删除下列第2条规则,可以分别使 用“优先级别”、“条件”及“路由表”当中任何一个唯一的值来设置所需删除的规则, 如下: ip rule del prio 10 ● ip rule del from 192.168.1.0/24 ● ip rule del table 1 ● ip rule del from 192.168.1.0/24 table 1 prio 10 ● [root@localhost ~]# ip rule show 0: from all lookup local 10: from 192.168.1.0/24 lookup 1 20: from 192.168.2.0/24 lookup 2 32766: from all lookup main 32767: from all lookup default [root@localhost ~]# Linux 网络安全技术与实现(第 版) 2 09 10 11 12 13 14 15 16 302 1 0 . 3 . 2   管 理 路 由 表 ❙ 在 讨 论 “ 管 理 路 由 表 ” 之 前 , 有 必 要 先 对 路 由 表 有 所 了 解 。 以 图 1 0 - 1 0 为 例 , 先 使 用 传 统 的 r o u t e - n 命 令 来 查 看 系 统 上 的 路 由 表 , 我 们 可 以 得 到 如 图 1 0 - 1 1 的 信 息 , 从 图 中 可 以 看 到 两 条 1 6 9 . 2 5 4 . 0 . 0 / 1 6 的 路 由 信 息 , 但 问 题 在 于 主 机 上 并 未 设 置 与 该 网 段 有 关 的 I P , 为 什 么 会 多 出 这 两 条 路 由 信 息 呢 ? 其 实 这 与 A P I P A 协 议 有 关 , 简 单 来 说 , 在 局 域 网 内 , 当 D H C P 服 务 器 无 法 正 常 工 作 时 , A P I P A 协 议 可 以 使 得 局 域 网 内 的 主 机 依 然 能 正 常 工 作 , 如 果 不 需 要 这 个 机 制 , 只 需 在 / e t c / s y s c o n f i g / n e t w o r k 文 件 中 加 入 “ N O Z E R O C O N F = n o ” 这 一 行 , 然 后 重 新 启 动 网 络 即 可关闭APIP A的机制,此时,系统的路由表如图10-12所示。 图10-11  传统路由表(一) 图10-12  传统路由表(二) 由 于 r o u t e - n 命 令 已 经 完 全 不 适 合 在 基 于 策 略 的 路 由 使 用 , 因 此 , r o u t e 命 令 仅 能 操 作 一 个 特 定 的 路 由 表 , 但 在 基 于 策 略 的 路 由 中 , 会 同 时 存 在 多 个 路 由 表 , 请 放 弃 这 个 路 由 管 理 工 具 , 取 而 代 之 的 依 然 是 i p 命 令 。 接 下 来 将 讨 论 如 何 使 用 i p 命 令 来 管 理 路 由 表 。 1. 查看路由表内容 在 查 看 路 由 表 之 前 , 首 先 使 用 i p r u l e s h o w 命 令 来 查 看 目 前 使 用 了 哪 些 路 由 表 , 接 着 , 再使用ip route show [table id | name]命令来查看路由表的内容。例如,可以使用ip route show t a b l e m a i n 来 查 看 路 由 表 m a i n 的 内 容 , 如 果 省 略 路 由 表 名 称 ( 如 i p r o u t e s h o w ) , 会 默 认 地 查 看 路由表main的内容。 [ r o o t @ l o c a l h o s t / ] # i p r u l e s h o w 0 : f r o m a l l l o o k u p l o c a l 3 2 7 6 6 : f r o m a l l l o o k u p m a i n et h0 et h1 ip 10.10.15.46/25 gw:10.10.15.1 ip 192.168.1.10/24 图10-10  Linux路由示例 第 章   基于策略的路由及多路带宽合并 10 09 10 11 12 13 14 15 16 303 32767: from all lookup default [root@localhost /]# [root@localhost /]# ip route show table main 10.10.15.0/25 dev eth0 proto kernel scope link src 10.10.15.46 192.168.1.0/24 dev eth1 proto kernel scope link src 192.168.1.10 default via 10.10.15.1 dev eth0 [root@localhost /]# 在默认情况下,系统有三个路由表,这三个路由表的功能如下: local:路由表local包含本机路由及广播信息。例如,在本机上执行ssh 127.0.0.1时, ● 就会参考这份路由表的内容,在正常情况下,只要配置好网卡的网络设置,就会自动 生成local路由表的内容,我们应该也不必修改其内容。 main:使用传统命令route -n所看到的路由表就是main的内容。Linux系统在默认情况 ● 下使用这份路由表的内容来传输数据包,因此,其内容极为重要,在正常情况下,只 要配置好网卡的网络设置,就会自动生成main路由表的内容。 default:最后是default路由表,这个路由表在默认情况下内容为空;除非有特别的要 ● 求,否则保持其内容为空即可。 在此使用路由表main的内容进行解释,以下是图10-10路由表main的内容,因为在主机上有 eth0及eth1两块网卡,且为其设置的IP分别是10.10.15.46/25及192.168.1.10/24,因此,路由表内的 第行即是告诉系统,如果有数据包要送到10.10.15.0/25这个网段,就直接将数据包由eth0接口送 出即可,而本机临近这个网段的IP是10.10.15.46,第行则是设置到192.168.1.0/24的路由,其含 义与第行完全相同;以上这两行是只要将计算机网卡上的IP设置好,并在网络服务重启之后, 默认就会生成的路由,无需特别的设置。最后一行则指:如果数据包不是送往10.10.15.0/25及 192.168.1.0/24网段,那么数据包将统一转发给10.10.15.1主机去处理,而10.10.15.1就是我们在网络 配置中所设置的“默认网关”。 [root@localhost /]# ip route show table main 10.10.15.0/25 dev eth0 proto kernel scope link src 10.10.15.46  192.168.1.0/24 dev eth1 proto kernel scope link src 192.168.1.10  default via 10.10.15.1 dev eth0  [root@localhost /]# 2. 添加路由 添加路由在此还是一样采用ip命令而不是route命令,下例首先使用ip route show命令显 示路由表main的内容,接着再使用ip route add命令将所需的路由添加到路由表main中,最 后再次使用ip route show命令将路由表main的内容打印出来,此时就可以在路由表main之中 看到刚才添加的路由了。 Linux 网络安全技术与实现(第 版) 2 09 10 11 12 13 14 15 16 304 [ r o o t @ l o c a l h o s t / ] # i p r o u t e s h o w t a b l e m a i n  1 0 . 1 0 . 1 5 . 0 / 2 5 d e v e t h 0 p r o t o k e r n e l s c o p e l i n k s r c 1 0 . 1 0 . 1 5 . 4 6 1 9 2 . 1 6 8 . 1 . 0 / 2 4 d e v e t h 1 p r o t o k e r n e l s c o p e l i n k s r c 1 9 2 . 1 6 8 . 1 . 1 0 d e f a u l t v i a 1 0 . 1 0 . 1 5 . 1 d e v e t h 0 [ r o o t @ l o c a l h o s t / ] # [ r o o t @ l o c a l h o s t / ] # i p r o u t e a d d 1 9 2 . 1 6 8 . 2 . 0 / 2 4 v i a 1 0 . 1 0 . 1 5 . 5 0 t a b l e m a i n  [ r o o t @ l o c a l h o s t / ] # [ r o o t @ l o c a l h o s t / ] # i p r o u t e s h o w t a b l e m a i n  1 0 . 1 0 . 1 5 . 0 / 2 5 d e v e t h 0 p r o t o k e r n e l s c o p e l i n k s r c 1 0 . 1 0 . 1 5 . 4 6 1 9 2 . 1 6 8 . 2 . 0 / 2 4 v i a 1 0 . 1 0 . 1 5 . 5 0 d e v e t h 0 1 9 2 . 1 6 8 . 1 . 0 / 2 4 d e v e t h 1 p r o t o k e r n e l s c o p e l i n k s r c 1 9 2 . 1 6 8 . 1 . 1 0 d e f a u l t v i a 1 0 . 1 0 . 1 5 . 1 d e v e t h 0 [ r o o t @ l o c a l h o s t / ] # 如 果 要 添 加 的 路 由 并 未 出 现 在 现 有 的 路 由 表 中 , 又 该 如 何 处 理 呢 ? 在 此 请 先 有 一 个 概 念 , 单 纯 添 加 路 由 表 并 无 意 义 , 因 为 新 增 出 来 的 路 由 表 , 系 统 默 认 是 不 会 去 使 用 的 , 如 果 要 将路由添加到main以外的路由表,只有先添加“规则”才能确定新的路由表名称(T able ID), 有了新的路由表之后,才会把路由添加到新的路由表中。 我 们 使 用 下 列 示 例 来 说 明 这 个 过 程 。 首 先 使 用 i p r u l e s h o w  来 查 询 R P D B 的 当 前 状 态 , 可 以 看 到 目 前 只 有 三 条 默 认 规 则 , 接 着 , 再 使 用 i p r u l e a d d 命 令 来 添 加 一 条 规 则  , 此 时 系 统 内 就 多 了 一 个 有 用 的 路 由 表 , 其 路 由 表 I D 为 1 0 , 我 们 可 以 立 即 使 用 i p r o u t e s h o w 命 令 来 查 看 这 个 新 的 路 由 表  , 其 内 容 默 认 为 空 , 接 着 可 以 在 这 个 新 路 由 表 中 添 加 路 由 , 在 此 使 用 i p r o u t e a d d 命 令 来 添 加 路 由 , 我 们 决 定 凡 是 来 自 于 1 9 2 . 1 6 8 . 2 . 0 / 2 4 网 段 的 数 据 包 , 都 从 e t h 1 接 口 将 数 据 包 送 离 本 机 , 因 此 , 必 须 完 整 编 写 e t h 1 接 口 的 路 由 。 首 先 将 临 近 e t h 1 接 口 的 路 由 填 入  , 告 诉 系 统 本 机 与 1 9 2 . 1 6 8 . 1 . 0 / 2 4 网 段 的 通 信 都 通 过 e t h 1 接 口 来 处 理 , 接 着 填 入 这 个 路 由 表 的默认路由  ,最后使用ip route show命令显示路由表10的内容。 [ r o o t @ l o c a l h o s t ~ ] # i p r u l e s h o w  0 : f r o m a l l l o o k u p l o c a l 3 2 7 6 6 : f r o m a l l l o o k u p m a i n 3 2 7 6 7 : f r o m a l l l o o k u p d e f a u l t [ r o o t @ l o c a l h o s t ~ ] # [ r o o t @ l o c a l h o s t ~ ] # i p r u l e a d d f r o m 1 9 2 . 1 6 8 . 2 . 0 / 2 4 t a b l e 1 0  [ r o o t @ l o c a l h o s t ~ ] # [ r o o t @ l o c a l h o s t ~ ] # i p r o u t e s h o w t a b l e 1 0  [ r o o t @ l o c a l h o s t ~ ] # [ r o o t @ l o c a l h o s t ~ ] # i p r o u t e a d d 1 9 2 . 1 6 8 . 1 . 0 / 2 4 d e v e t h 1 t a b l e 1 0  [ r o o t @ l o c a l h o s t ~ ] # i p r o u t e a d d d e f a u l t v i a 1 9 2 . 1 6 8 . 1 . 2 5 4 t a b l e 1 0  [ r o o t @ l o c a l h o s t ~ ] # [ r o o t @ l o c a l h o s t ~ ] # i p r o u t e s h o w t a b l e 1 0  1 9 2 . 1 6 8 . 1 . 0 / 2 4 d e v e t h 1 s c o p e l i n k d e f a u l t v i a 1 9 2 . 1 6 8 . 1 . 2 5 4 d e v e t h 1 [ r o o t @ l o c a l h o s t ~ ] # 第 章   基于策略的路由及多路带宽合并 10 09 10 11 12 13 14 15 16 305 3. 删除路由 可以使用ip命令来方便地删除路由,我们使用以下示例来说明如何删除路由。首先将路 由表10的内容显示出来,可以看到路由表10中当前有两条路由,接着使用ip route del命令 删除默认路由,在此别忘了指定我们所要删除的是路由表10,否则默认会删除路由表main 的默认路由,接着再使用ip route show 命令查看路由表10,此时路由表10的默认路由已经 不存在了,再次使用ip route del命令删除192.168.122.0/24的路由,最后可以看到路由表10 中已经没有任何路由了。 [root@localhost ~]# ip route show table 10  192.168.1.0/24 dev virbr0 scope link default via 192.168.1.254 dev eth1 [root@localhost ~]# [root@localhost ~]# ip route del default table 10  [root@localhost ~]# [root@localhost ~]# ip route show table 10  192.168.1.0/24 dev virbr0 scope link [root@localhost ~]# [root@localhost ~]# ip route del 192.168.1.0/24 table 10  [root@localhost ~]# [root@localhost ~]# ip route show table 10  [root@localhost ~]# 10.4 带宽合并 带宽合并这个主题似乎从有因特网开始就一直存在着,最初的名称是Multi-Link PPP, Multi-Link PPP是什么呢?记得当时我的计算机上网使用的是28800 bps的调制解调器,速度 特别慢,因此,当时就有人提出Multi-Link PPP这种技术,也就是把多条通过调制解调器所 建立起来的PPP连接叠加起来,组成一个带宽较大的逻辑连接。只是当年我还是个穷书生, 玩不起如此高档的网络架构,事隔15年的今日,虽然上网的带宽已经很大了,但是带宽合并 这个话题依然是所有网络工程师最喜欢讨论的话题之一。在可预见的未来不管上网的带宽变 得多大,这个话题也会无止境地讨论下去,因为“上网的带宽有限,人的欲望无穷”! 要如何合并多条ADSL或光纤的带宽呢?很多人干脆买一台所谓的“负载均衡器”来 执行带宽合并的操作,只是你可能不知道,其实这些负载均衡器里面所安装的就是Linux系 统。此外,如果钱花得不够多,这个负载均衡器可能三天两头就会宕机一次,那时可就要劳 驾你重启了。因此,如果你想购买负载均衡器的话,最好先掂量一下自己的口袋! Linux 网络安全技术与实现(第 版) 2 09 10 11 12 13 14 15 16 306 1 0 . 4 . 1   何 谓 带 宽 合 并 ❙ 所 谓 带 宽 合 并 是 指 把 多 条 等 速 或 不 等 速 的 外 网 带 宽 , 合 并 成 一 个 逻 辑 上 更 大 的 带 宽 来 使 用 , 如 图 1 0 - 1 3 将 三 条 1 2 M / 1 M 的 A D S L 合 并 起 来 , 如 此 内 部 的 使 用 者 就 可 以 得 到 3 6 M / 3 M 的 外 网 带 宽 , 这 就 是 所 谓 的 带 宽 合 并 。 而 用 来 执 行 这 个 任 务 的 设 备 , 厂 商 称 之 为 负 载 均 衡 器 , 不 过 , 这 其 中 可 是 有 不 可 告 人 的 秘 密 , 因 为 这 些 设 备 所 宣 称 的 “ 疗 效 ” 大 部 分 都 是 有 争 议 的 , 我 个 人 认 为 那 根 本 是 骗 人 的 , 此 话 怎 讲 ? 除 非 我 们 通 过 I S P 来 执 行 带 宽 合 并 任 务 , 否 则 这 些 负载均衡器所称的“疗效”在实际中根本体现不出来。 如 图 1 0 - 1 4 所 示 , 如 果 通 过 I S P 来 执 行 这 项 任 务 , I S P 通 常 使 用 支 持 带 宽 合 并 功 能 的 路 由 器 来 执 行 这 项 任 务 , 这 与 负 载 均 衡 器 的 做 法 有 何 不 同 呢 ? 关 键 之 处 在 于 流 量 分 配 上 的 不 同 , 如 图 1 0 - 1 4 的 做 法 通 常 是 把 一 条 连 接 上 的 数 据 包 均 分 到 多 条 不 同 的 实 体 连 接 上 , 如 此 每 条 实 体 链 路 所 用 的 带 宽 趋 于 平 均 。 但 负 载 均 衡 器 因 为 没 有 得 到 I S P 的 支 持 , 因 此 , 他 们 的 做 法 会 是 根 据 会 话 ( S e s s i o n ) 来 处 理 , 例 如 , 企 业 内 部 对 因 特 网 所 产 生 的 第 一 条 连 接 , 负 载 均 衡 器 会 将 之 导 入 到 第 一 条 实 体 线 路 , 第 二 条 连 接 会 导 入 到 第 二 条 实 体 线 路 , 第 三 条 连 接 则 会 导 入 到 第 三 条 实 体 线 路 , 那 第 四 条 连 接 呢 ? 当 然 就 是 导 入 到 第 一 条 实 体 线 路 了 , 因 此 , 你 所 得 到 的 单 一 连 接 带 宽 上 限 永 远 不 可 能 达 到 3 6 M / 3 M 的 带 宽 , 但 I S P 的 做 法 是 可 行 的 。    图10-13  带宽合并 图10-14  传统的带宽合并 那 么 , 负 载 均 衡 器 还 有 什 么 用 处 吗 ? 当 然 是 有 的 , I S P 做 法 的 限 制 是 所 有 连 接 必 须 都 归 同 一 家 I S P 所 有 , 如 果 I S P 出 了 问 题 , 你 们 家 就 不 能 上 网 了 ; 而 且 I S P 的 做 法 比 较 “ 昂 贵 ” , 如 果 换 成 负 载 均 衡 器 则 可 以 同 时 使 用 多 家 不 同 I S P 的 线 路 , 有 些 比 较 好 的 负 载 均 衡 器 在 发 现 某 条 实 体 线 路 断 线 时 , 还 会 自 动 排 除 使 用 这 条 实 体 线 路 。 另 外 , 负 载 均 衡 器 比 较 “ 便 宜 ” , 因 此 , 负 载 均 衡 器 一 样 有 其 存 在 的 价 值 。 而 本 章 要 介 绍 “ 一 台 比 商 场 买 得 到 的 负 载 均 衡 器 更 聪明的负载均衡器”。 第 章   基于策略的路由及多路带宽合并 10 09 10 11 12 13 14 15 16 307 10.4.2 企业内的带宽合并 ❙ 在真正着手合并带宽之前,我们先来回顾一下一 对多NAT的概念。如图10-15所示,当192.168.0.0/24网 段的主机要连上因特网时,NAT的POSTROUTING机 制会将数据包内来源端IP换成10.10.15.46,然后再交给 路由表判断数据包该送往何处。在此请注意,这个数 据包最后的来源端IP是10.10.15.46。 接下来以图10-16为例来示范如何进行带宽合并。 首先看到10.10.15.46及192.168.1.10都是可以正常连上 因特网的IP,这两个IP分别设置在实验主机的eth0及 eth1两张网卡上,其网关是10.10.15.1及192.168.1.254, 而内部网络则连接到eth2接口(IP是192.168.122.1),由 于192.168.122.0/24是私有IP网段,因此内部网络主机如 果要连上因特网,就必须在负载均衡器上完成“一对 多NAT”任务。我们使用如下命令完成合并操作。 [root@localhost ~]# ip rule show  0: from all lookup local 32766: from all lookup main 32767: from all lookup default [root@localhost ~]# [root@localhost ~]# ip rule add from 10.10.15.46 table 10  [root@localhost ~]# ip rule add from 192.168.1.10 table 20  [root@localhost ~]# [root@localhost ~]# ip route add 10.10.15.0/25 dev eth0 table 10  [root@localhost ~]# ip route add default via 10.10.15.1 table 10  [root@localhost ~]# [root@localhost ~]# ip route add 192.168.1.0/24 dev eth1 table 20  [root@localhost ~]# ip route add default via 192.168.1.254 table 20  [root@localhost ~]# [root@localhost ~]# ip route replace default \ nexthop via 10.10.15.1 dev eth0 weight 1 \ nexthop via 192.168.1.254 dev eth1 weight 1  [root@localhost ~]# [root@localhost ~]#iptables -t nat -A POSTROUTING \ -s 192.168.122.0/24 -j MASQUERADE  [root@localhost ~]# 首先使用第行的命令来执行“一对多NAT”任务,但问题来了,在此之前,我们 在执行一对多NAT时都只有一个对外的网关,因此,经过NAT转换后的IP一定就是临近网 NAT eth0 eth1 192.168.0.0/2410.10.15.46 图10-15  NAT概念 ISP 1 ISP 2 eth0eth1 eth2 19192.168.122.0/242 10.10.15.46/25192.168.1.10/24 图10-16  带宽合并示例 Linux 网络安全技术与实现(第 版) 2 09 10 11 12 13 14 15 16 308 关 的 I P , 但 现 在 主 机 对 外 有 两 个 网 关 , 那 么 , 通 过 N A T 转 换 后 的 I P 会 是 1 9 2 . 1 6 8 . 1 . 1 0 还 是 1 0 . 1 0 . 1 5 . 4 6 呢 ? 关 键 就 在 于 主 机 所 设 置 的 网 关 在 哪 里 。 例 如 , 把 网 关 设 置 为 1 9 2 . 1 6 8 . 1 . 2 5 4 时 , 通 过 N A T 转 换 后 的 I P 就 是 1 9 2 . 1 6 8 . 1 . 1 0 ; 如 果 网 关 设 置 为 1 0 . 1 0 . 1 5 . 1 时 , 通 过 N A T 转 换 后 的 I P 就 是 1 0 . 1 0 . 1 5 . 4 6 。 但 问 题 来 了 , 如 果 主 机 的 网 关 是 固 定 的 , 那 就 只 能 使 用 单 一 一 条 对 外 的实体线路,当然也就不可能使用带宽合并的功能。 为 此 , 我 们 只 有 让 主 机 的 网 关 不 断 地 改 变 , 才 能 使 得 对 外 的 连 接 平 均 分 摊 在 两 条 示 例 线 路 上 , 关 于 这 个 目 标 , 我 们 可 以 使 用 第  行 来 完 成 , 其 中 r e p l a c e d e f a u l t 参 数 是 指 添 加 或 取 代 目 前 的 网 关 地 址 , 此 外 , 还 可 以 使 用 n e x t h o p v i a 1 0 . 1 0 . 1 5 . 1 d e v e t h 0 w e i g h t 1 来 添 加 一 个 网 关 地 址 , 如 果 同 时 有 多 个 网 关 ( 有 多 条 对 外 的 实 体 线 路 ) , 则 可 以 同 时 使 用 多 组 这 样 的 参 数 来 添 加 网 关 , 因 为 这 个 示 例 中 有 两 条 实 体 线 路 , 因 此 , 我 们 添 加 了 两 个 网 关 地 址 ( 分 别 是 1 0 . 1 0 . 1 5 . 1 及 1 9 2 . 1 6 8 . 1 . 2 5 4 ) , 最 后 w e i g h t 1 是 该 网 关 地 址 的 使 用 率 , 在 这 个 示 例 中 , 两 条 实 体 线路带宽相同,因此将使用率设置为1:1。 有 了 以 上 的 设 置 之 后 , 我 们 已 经 可 以 让 由 内 对 外 的 连 接 经 过 N A T , 平 均 地 转 换 到 两 条 不 同 实 体 线 路 的 I P 上 。 例 如 , 第 一 条 连 接 会 转 换 到 第 一 条 实 体 线 路 的 I P , 第 二 条 连 接 会 转 换 到 第二条实体线路的IP,第三条连接会重新转换到第一条实体线路的IP,如此不断地循环。 接 下 来 让 属 于 A 实 体 线 路 的 I P 经 由 A 线 路 出 去 , 属 于 B 实 体 线 路 的 I P 经 由 B 线 路 出 去 , 关 于 这 个 问 题 , 可 以 使 用 以 前 介 绍 过 的 “ 基 于 策 略 的 路 由 ” 机 制 来 轻 松 解 决 。 我 们 使 用 第  行 命 令 来 指 定 , 数 据 包 的 来 源 端 I P 若 为 1 0 . 1 0 . 1 5 . 4 6 , 则 使 用 路 由 表 1 0 来 决 定 数 据 包 该 如 何 传 输 ; 用 第  行 命 令 来 设 置 数 据 包 的 来 源 端 I P 若 是 1 9 2 . 1 6 8 . 1 . 1 0 , 则 使 用 路 由 表 2 0 来 决 定 数 据 包 该 如 何 传 输 。 那 么 , 为 什 么 是 1 0 . 1 0 . 1 5 . 4 6 及 1 9 2 . 1 6 8 . 1 . 1 0 这 两 个 I P 呢 ? 这 是 因 为 N A T 所 转 换 的 IP就是这两个IP。 有 了 路 由 规 则 后 , 当 然 就 必 须 完 整 定 义 路 由 表 , 我 们 使 用 第  行 命 令 来 设 置 本 路 由 表 的 默 认 网 关 地 址 是 1 0 . 1 0 . 1 5 . 1 ; 使 用 第  行 命 令 来 告 诉 系 统 , 如 果 数 据 包 是 要 送 往 1 0 . 1 0 . 1 5 . 0 / 2 5 网 段 的 数 据 包 , 则 直 接 有 e t h 0 接 口 送 出 即 可 ; 再 使 用 第  及 第  行 命 令 来 设 置 e t h 1 接 口 的 路 由 。 通 过 以 上 的 命 令 设 置 之 后 , 本 机 及 内 部 网 络 1 9 2 . 1 6 8 . 1 2 2 . 0 / 2 4 对 因 特 网 的 访 问 连 接 , 就 可 以 平 均 分 摊 在 这 两 条 实 体 线 路 上 。 以 下 是 分 别 在 本 机 及 内 部 网 络 主 机 上 的 路 由 测 试 结 果 , 而 路 由 的 目 标 分 别 为 2 2 0 . 1 2 8 . 3 . 1 0 6 及 6 0 . 1 1 9 . 1 7 . 2 2 1 两 个 I P 。 首 先 , 图 1 0 - 1 7 及 图 1 0 - 1 8 是 在 本 机 上 测 试 的 结 果 , 从 图 1 0 - 1 6 中 可 以 清 楚 地 看 到 测 试 的 连 接 是 从 1 9 2 . 1 6 8 . 1 . 2 5 4 连 接 到 因 特 网 , 而 图 1 0 - 1 8 则 是 从 1 0 . 1 0 . 1 5 . 1 连 接 因 特 网 。 另 外 , 图 1 0 - 1 8 中 的 X X . X X . X X . X X 及 Y Y . Y Y . Y Y . Y Y 是 一 家真实公司连接因特网的IP地址,基于隐私考虑,对其用马赛克进行处理。 第 章   基于策略的路由及多路带宽合并 10 09 10 11 12 13 14 15 16 309 [root@localhost ~]# traceroute -n 60.199.17.221 traceroute to 60.199.17.221 (60.199.17.221), 30 hops max, 60 byte packets 1 192.168.1.254 0.633 ms 0.713 ms 0.962 ms 2 10.8.53.222 3709.033 ms 3728.141 ms 3728.123 ms 3 10.24.253.54 3728.962 ms 3748.956 ms 3758.055 ms 4 111.71.246.254 3768.039 ms 3768.890 ms 3788.009 ms 5 203.75.135.82 3787.986 ms 3797.824 ms 3807.932 ms 6 220.128.8.198 3808.017 ms 220.128.9.234 3837.421 ms 220.128.9.198 3827.379 ms 7 220.128.2.58 139.110 ms 121.872 ms 8 220.128.4.177 119.840 ms 138.928 ms 220.128.3.245 128.898 ms 9 210.242.214.153 129.792 ms 119.877 ms 148.922 ms 10 60.199.17.173 119.753 ms 60.199.17.165 140.710 ms 60.199.17.169 129.918 ms 11 60.199.17.221 120.893 ms 139.681 ms 129.797 ms [root@localhost ~]# 图10-17  本机路由测试(一) [root@localhost ~]# traceroute -n 220.128.3.106 traceroute to 220.128.3.106 (220.128.3.106), 30 hops max, 60 byte packets 1 10.10.15.1 0.383 ms 0.405 ms 0.465 ms 2 10.10.12.27 0.662 ms 0.715 ms 0.769 ms 3 XX.XX.XX.XX 30.924 ms 31.549 ms 32.022 ms 4 YY.YY.YY.YY 32.269 ms 33.207 ms 34.164 ms 5 220.128.1.158 36.397 ms 220.128.1.234 37.361 ms * [root@localhost ~]# [root@localhost ~]# 图10-18  本机路由测试(二) 图10-19及图10-20是在内部网络主机上执行的路由测试,我们可以从两个图中看到内 部网络主机的网关都是192.168.122.1,不过,接下来的第二条路由则分别是10.10.15.1及 192.168.1.254,如此即可证明内部网络上的主机在连接因特网时,其会话可以平均分摊在两 条实体线路上。 [root@localhost ~]# traceroute -n 60.199.17.221 traceroute to 60.199.17.221 (60.199.17.221), 30 hops max, 40 byte packets 1 192.168.122.1 0.855 ms 0.739 ms 0.715 ms 2 10.10.15.1 0.812 ms 0.884 ms 0.871 ms 3 10.10.12.27 1.191 ms 1.182 ms 1.238 ms 4 XX.XX.XX.XX 120.968 ms 122.018 ms 123.276 ms 5 YY.YY.YY.YY 122.895 ms 124.191 ms 125.874 ms 6 220.128.3.142 127.110 ms 220.128.2.230 128.027 ms 220.128.3.142 128.964 ms 7 220.128.3.245 130.699 ms 131.399 ms 132.471 ms 8 210.242.214.153 134.069 ms 135.018 ms 136.014 ms 9 60.199.17.181 137.287 ms 60.199.17.185 98.832 ms 60.199.17.181 99.437 ms 10 60.199.17.221 156.924 ms 157.935 ms 157.354 ms [root@localhost ~]# 图10-19  内部网络路由测试(一) Linux 网络安全技术与实现(第 版) 2 09 10 11 12 13 14 15 16 310 [ r o o t @ l o c a l h o s t ~ ] # t r a c e r o u t e - n 2 2 0 . 1 2 8 . 3 . 1 0 6 t r a c e r o u t e t o 2 2 0 . 1 2 8 . 3 . 1 0 6 ( 2 2 0 . 1 2 8 . 3 . 1 0 6 ) , 3 0 h o p s m a x , 4 0 b y t e p a c k e t s 1 1 9 2 . 1 6 8 . 1 2 2 . 1 0 . 8 2 2 m s 0 . 7 4 5 m s 0 . 7 2 8 m s 2 1 9 2 . 1 6 8 . 1 . 2 5 4 1 . 2 4 5 m s 1 . 4 5 5 m s 1 . 4 5 0 m s 3 1 0 . 8 . 5 3 . 2 2 2 1 1 2 . 6 7 0 m s 1 5 2 . 5 7 8 m s 1 9 2 . 6 0 0 m s 4 1 0 . 2 4 . 2 5 3 . 5 4 2 3 2 . 5 4 1 m s 3 1 2 . 4 9 4 m s 3 9 2 . 4 4 6 m s 5 1 1 1 . 7 1 . 2 4 6 . 2 5 4 4 3 1 . 9 4 6 m s 4 7 1 . 4 2 4 m s 5 1 0 . 9 9 4 m s 6 2 0 3 . 7 5 . 1 3 5 . 8 2 6 3 0 . 6 9 2 m s 6 3 0 . 6 4 5 m s 6 7 0 . 4 8 6 m s 7 2 2 0 . 1 2 8 . 3 . 1 0 6 6 0 9 . 5 6 5 m s * * [ r o o t @ l o c a l h o s t ~ ] # 图10-20  内部网络路由测试(二) 1. 如何使用拨号式实体线路来合并带宽 如 果 只 是 要 让 企 业 内 的 客 户 端 连 上 因 特 网 , 那 么 , 使 用 拨 号 式 的 宽 带 会 是 比 较 经 济 的 方 案 , 图 1 0 - 2 1 是 作 者 使 用 3 . 7 5 G U S B 无 线 网 卡 拨 号 之 后 所 产 生 的 环 境 , 在 拨 号 完 成 后 会 得 到 一 个 P P P 0 的 虚 拟 接 口 , 这 时 如 果 使 用 i f c o n f i g 命 令 来 查 看 系 统 , 会 看 到 如 图 1 0 - 2 2 的 情 况 , 其 中 需 要 注 意 的 是 P P P 0 接 口 的 参 数 , 如 i n e t a d d r : 1 1 1 . 8 2 . 1 4 9 . 5 8 P - t - P : 1 0 . 6 4 . 6 4 . 6 4 M a s k : 2 5 5 . 2 5 5 . 2 5 5 . 2 5 5 。 其 中 1 1 1 . 8 2 . 1 4 9 . 5 8 就 是 这 次 拨 号 所 得 到 的 I P , P - t - P 所 指 的 I P 1 0 . 6 4 . 6 4 . 6 4 则 是 P P P 0 的 另 一 个 端 点 , 最 后 比 较 奇 怪 的 部 分 是 M a s k , 毫 无 疑 问 , P P P 类 型 的 子 网 掩 码 都 是 255.255.255.255。 I SP 1 IS P 2 et h0 PPP 0 et h1 192.168.122.0/24 10.10.15.46/25 111.82.149.58/32 图10-21  拨号与固接混合带宽合并示例 [ r o o t @ l o c a l h o s t ~ ] # i f c o n f i g e t h 0 L i n k e n c a p : E t h e r n e t H W a d d r E 0 : C B : 4 E : E B : 2 3 : F 3 i n e t a d d r : 1 0 . 1 0 . 1 5 . 3 5 B c a s t : 1 0 . 1 0 . 1 5 . 1 2 7 M a s k : 2 5 5 . 2 5 5 . 2 5 5 . 1 2 8 i n e t 6 a d d r : f e 8 0 : : e 2 c b : 4 e f f : f e e b : 2 3 f 3 / 6 4 S c o p e : L i n k U P B R O A D C A S T R U N N I N G P R O M I S C M U L T I C A S T M T U : 1 5 0 0 M e t r i c : 1 R X p a c k e t s : 2 8 0 5 3 3 e r r o r s : 0 d r o p p e d : 0 o v e r r u n s : 0 f r a m e : 0 T X p a c k e t s : 2 2 4 2 9 3 e r r o r s : 0 d r o p p e d : 0 o v e r r u n s : 0 c a r r i e r : 0 c o l l i s i o n s : 0 t x q u e u e l e n : 1 0 0 0 第 章   基于策略的路由及多路带宽合并 10 09 10 11 12 13 14 15 16 311 RX bytes:41294929 (39.3 MiB) TX bytes:267726211 (255.3 MiB) Interrupt:50 Base address:0x6000 lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 inet6 addr: ::1/128 Scope:Host UP LOOPBACK RUNNING MTU:16436 Metric:1 RX packets:135 errors:0 dropped:0 overruns:0 frame:0 TX packets:135 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:12816 (12.5 KiB) TX bytes:12816 (12.5 KiB) ppp0 Link encap:Point-to-Point Protocol inet addr: 111.82.149.58 P-t-P:10.64.64.64 Mask:255.255.255.255 UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1500 Metric:1 RX packets:6 errors:0 dropped:0 overruns:0 frame:0 TX packets:7 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:3 RX bytes:102 (102.0 b) TX bytes:138 (138.0 b) [root@localhost ~]# 图10-22  拨号与固接混合带宽合并示例 为了便于解释,在此先说明PPP网络的特性。所谓PPP(Point-to-Point Protocol)是指用来 连接计算机的这一条实体线路上只会有两台计算机,一台连接于线路的这一段,另一台连接 到线路的另一端,当传输数据时并不需要专门设置数据是要送给谁,因为这条线路上只有两 台计算机,这一方送出去的数据一定是给另一方,而另一方送出来的数据也一定是给这一 方,有了这个概念之后,就可以合并带宽了。 在拨号完毕之后,可以使用下面的脚本将“固接”与“拨号”的带宽合并起来,这个脚 本与前面合并两路固接式带宽的方法很类似,最主要的差异大概是第点,由于PPP0是属于 PPP类型的网络连接,所以在写路由表时,不需要像步骤一样考虑相同网段上数据包传输 的路由问题,我们只需要设置路由表20的默认网关是PPP0接口的IP即可。如果你不熟悉PPP 网络,可能很奇怪,回顾刚刚讨论过的内容,在PPP网络上这一方送出去的数据就一定是给 另一方的,因此,如果要将数据通过PPP网络送出去,只要把数据从PPP链路的这一端发送 出去即可。 #!/bin/bash ip rule add from 10.10.15.35 table 10 ip rule add from 111.82.149.58 table 20 ip route add 10.10.15.0/25 dev eth0 table 10  Linux 网络安全技术与实现(第 版) 2 09 10 11 12 13 14 15 16 312 i p r o u t e a d d d e f a u l t v i a 1 0 . 1 0 . 1 5 . 1 d e v e t h 0 t a b l e 1 0 i p r o u t e a d d d e f a u l t v i a 1 1 1 . 8 2 . 1 4 9 . 5 8 d e v p p p 0 t a b l e 2 0  i p r o u t e r e p l a c e d e f a u l t \ n e x t h o p v i a 1 0 . 1 0 . 1 5 . 1 d e v e t h 0 w e i g h t 1 \ n e x t h o p v i a 1 1 1 . 8 2 . 1 4 9 . 5 8 d e v p p p 0 w e i g h t 1 i p t a b l e s - t n a t - A P O S T R O U T I N G - o e t h 0 - s 1 9 2 . 1 6 8 . 1 2 2 . 0 / 2 4 \ - j S N A T - - t o 1 0 . 1 0 . 1 5 . 3 5 i p t a b l e s - t n a t - A P O S T R O U T I N G - o p p p 0 - s 1 9 2 . 1 6 8 . 1 2 2 . 0 / 2 4 \ - j S N A T - - t o 1 1 1 . 8 2 . 1 4 9 . 5 8 不 过 , 由 于 P P P 的 拨 号 连 接 ( P P P O E , 3 G ) 很 容 易 断 线 , 如 果 要 使 用 拨 号 的 对 外 带 宽 , 可 能 需 要 自 己 编 写 一 些 S h e l l 脚 本 来 判 断 线 路 是 否 已 经 中 断 。 如 果 中 断 了 , 就 得 自 动 重 新 拨 号 , 并且获取新的IP,然后自动更新路由规则及路由表的内容,实际工作中确实会比较麻烦。 2. 带宽合并后的问题及解决办法 至 此 , 我 们 已 经 把 带 宽 合 并 起 来 了 , 使 用 上 大 概 没 有 什 么 太 大 的 问 题 , 可 能 会 有 读 者 提 出 这 样 的 质 疑 : “ 在 负 载 均 衡 器 后 面 的 客 户 端 , 如 果 以 F T P 协 议 的 被 动 模 式 , 将 文 件 上 传 到 因 特 网 上 的 F T P 服 务 器 , 有 没 有 可 能 造 成 命 令 通 道 经 由 实 体 线 路 A , 而 D A T A 通 道 经 由 实 体 线 路 B 的 情 况 呢 ? ” 如 果 你 怀 有 相 同 的 疑 问 , 那 就 表 示 你 对 T C P / I P 及 F T P 协 议 有 足 够 的 认 识 , 不过,这个问题倒不必担心。 L i n u x 将 数 据 包 发 送 出 去 之 前 , 都 会 为 每 一 个 数 据 包 选 择 发 送 路 径 , 而 这 个 操 作 将 造 成 数 据 包 传 输 上 的 延 迟 , 当 然 , 数 据 包 的 传 输 效 率 也 就 大 打 折 扣 , 为 此 , L i n u x 系 统 中 保 存 了 一 份 路 由 缓 存 ( R o u t i n g C a c h e ) , 只 要 本 机 曾 将 数 据 包 传 输 到 远 程 的 某 一 个 I P , 系 统 就 会 将 前 往 这 个 I P 的 路 由 记 录 保 存 到 路 由 缓 存 之 中 , 以 后 如 果 本 机 要 再 次 将 数 据 包 传 输 到 这 个 I P , 系 统 就 会 根 据 路 由 缓 存 中 的 信 息 将 数 据 包 发 送 出 去 , 以 节 省 系 统 判 断 路 由 路 径 的 时 间 , 进 而 达 到 加 快 发 送 数 据 包 的 目 的 。 我 们 可 以 使 用 ip r o u te s h o w c ac h e 命 令 来 查 看 路 由 缓 存 内 的 信 息 , 以下示例就是本机前往168.95.1.1时所经由的网关,地址是10.10.15.1。 [ r o o t @ l o c a l h o s t ~ ] # i p r o u t e s h o w c a c h e l o c a l 1 0 . 1 0 . 1 5 . 3 5 f r o m 1 0 . 1 0 . 1 5 . 2 6 d e v l o s r c 1 0 . 1 0 . 1 5 . 3 5 c a c h e < l o c a l , s r c - d i r e c t > i i f e t h 0 1 6 8 . 9 5 . 1 9 2 . 1 v i a 1 0 . 1 0 . 1 5 . 1 d e v e t h 0 s r c 1 0 . 1 0 . 1 5 . 3 5 c a c h e m t u 1 5 0 0 a d v m s s 1 4 6 0 h o p l i m i t 6 4 1 6 8 . 9 5 . 1 . 1 d e v p p p 0 s r c 1 1 1 . 7 0 . 2 1 9 . 1 9 4 c a c h e m t u 1 5 0 0 a d v m s s 1 4 6 0 h o p l i m i t 6 4 l o c a l 1 0 . 1 0 . 1 5 . 3 5 f r o m 1 6 8 . 9 5 . 1 9 2 . 1 d e v l o s r c 1 0 . 1 0 . 1 5 . 3 5 第 章   基于策略的路由及多路带宽合并 10 09 10 11 12 13 14 15 16 313 cache iif eth0 168.95.192.1 from 10.10.15.35 via 10.10.15.1 dev eth0 cache mtu 1500 advmss 1460 hoplimit 64 10.10.15.26 from 10.10.15.35 tos lowdelay dev eth0 cache mtu 1500 advmss 1460 hoplimit 64 因为存在路由缓存机制,因此,FTP在被动模式下传输文件到因特网时,绝对不会有命 令通道经由实体线路A,而DATA通道经由实体线路B的现象发生。 虽然以上问题不会存在,但仍要告诉你一个小秘密,上面这些操作在Kernel 2.4的系统 上可以正常执行,但如果你所使用的系统是Kernel 2.6,那就没有那么幸运了!我曾遇到一 个非常奇怪的现象,在Kernel 2.6系统上进行带宽合并时,所有客户端主机都可以正常连 上因特网;但在客户端主机上使用SSH协议连接到因特网时,却发生了SSH协议无法正 常工作的问题。很久才找到了原因,不知道为什么,SSH协议的数据包不只经由一条实 体线路,例如,有一条SSH协议的连接经由实体线路A,但奇怪的是,在传输了几个数据 包之后,突然就将数据包往实体线路B上发送,因而导致SSH协议连接失败。 关于上述问题,下面再说明一下。以图10-23为例,假设负载均衡器上连接两条独立的 ADSL,分别称为实体线路和实体线路,在正常情况下,当客户端主机通过负载均衡器连 上因特网时,负载均衡器会帮其选择或的路径,如果负载均衡器选择路径,那么送往因 特网的数据包内的来源端IP一定就是实体线路的IP,而这条访问因特网服务的会话(Session) 上的所有数据包都会经由实体线路来传输,如果是这样,客户端就可以正常访问因特网。 图10-23  SSH连接失败的原因 但我所遇到的奇怪现象是,如果客户端以Linux系统上SSH 客户端来连接因特网,一 开始数据包通过实体线路来传输,但在某些特定情况下,原来应该经由实现线路的数 据包,却反常地往实体线路上发送,而这些往实体线路发送的数据包其内的IP仍然是 实体线路的IP,但这些数据包会因为ISP的封锁而无法正常传输到SSH 服务器,最后导致 连接失败。 再强调一点,如果ISP没有进行这样的限制,其实客户端是可以正常连接SSH 服务器 的,那么,ISP到底限制了什么?又为什么要这么做呢?我猜测,ISP的限制是这样的,如果 ISP租给我们的ADSL所分配的IP是w.x.y.z,ISP就会限制“凡是从这条ADSL送入ISP机房的数 Linux 网络安全技术与实现(第 版) 2 09 10 11 12 13 14 15 16 314 据 包 , 其 内 容 来 源 端 的 I P 必 须 是 w . x . y . z ; 如 果 不 是 , 就 将 数 据 包 丢 弃 ” , 至 于 I S P 这 样 的 限 制 是 否 合 理 , 是 见 仁 见 智 的 。 如 果 从 正 面 的 角 度 来 看 这 件 事 , 我 认 为 I S P 的 目 的 是 防 止 其 客 户 对 因 特 网 实 施 D D O S 攻 击 ( 攻 击 是 会 不 断 更 改 数 据 包 内 的 来 源 端 I P ) , 如 果 从 负 面 角 度 来 看 , I S P 可 能 是 在 限 制 客 户 只 能 使 用 同 一 家 I S P 的 产 品 , 此 话 怎 讲 呢 ? 如 果 图 1 0 - 2 3 是 被 I S P 所 接 受 的 , 那 么 , 请 你 将 客 户 端 主 机 换 成 一 台 W e b 服 务 器 试 试 , 是 否 就 可 将 W e b 服 务 器 对 外 的 流 量 非 常 平 均 地 分 摊 在 两 条 A D S L 上 呢 ? 如 此 一 来 , 就 可 以 把 低 价 的 带 宽 合 并 成 一 条 高 速 线 路 了,那ISP的高级产品又要卖给谁呢? 在 此 要 披 露 一 个 小 秘 密 , L i n u x 中 有 一 个 名 为 E q u a l i z e 的 内 核 补 丁 , 可 以 帮 助 我 们 把 对 外 的 流 量 平 均 分 摊 到 每 条 实 体 线 路 上 , 如 果 你 的 I S P 没 有 施 加 相 应 限 制 , 这 个 方 法 就 是 可 行 的 。 至 于 问 题 的 原 因 , 我 怀 疑 是 内 核 的 B u g , 为 什 么 会 这 么 说 呢 ? 因 为 已 经 在 I P 路 由 规 则 中 作 了 规 定 , 如 下 以 下 脚 本 的  与  , 但 内 核 似 乎 没 有 把 特 定 的 数 据 包 转 发 给 特 定 的 路 由 表 处 理 , 不 过 也 怪 , 为 什 么 只 有 S S H 协 议 会 这 样 ? 还 是 我 的 测 试 不 够 周 密 呢 ? 没 关 系 , 山 不 转 , 路转,路不转,人转,总会有解决办法的。 # ! / b i n / b a s h i p r u l e a d d f r o m 1 0 . 1 0 . 1 5 . 3 5 t a b l e 1 0  i p r u l e a d d f r o m 1 1 1 . 8 2 . 1 4 9 . 5 8 t a b l e 2 0  i p r o u t e a d d 1 0 . 1 0 . 1 5 . 0 / 2 5 d e v e t h 0 t a b l e 1 0 i p r o u t e a d d d e f a u l t v i a 1 0 . 1 0 . 1 5 . 1 d e v e t h 0 t a b l e 1 0 i p r o u t e a d d d e f a u l t v i a 1 1 1 . 8 2 . 1 4 9 . 5 8 d e v p p p 0 t a b l e 2 0 i p r o u t e r e p l a c e d e f a u l t \ n e x t h o p v i a 1 0 . 1 0 . 1 5 . 1 d e v e t h 0 w e i g h t 1 \ n e x t h o p v i a 1 1 1 . 8 2 . 1 4 9 . 5 8 d e v p p p 0 w e i g h t 1 i p t a b l e s - t n a t - A P O S T R O U T I N G - o e t h 0 - s 1 9 2 . 1 6 8 . 1 2 2 . 0 / 2 4 \ - j S N A T - - t o 1 0 . 1 0 . 1 5 . 3 5 i p t a b l e s - t n a t - A P O S T R O U T I N G - o p p p 0 - s 1 9 2 . 1 6 8 . 1 2 2 . 0 / 2 4 \ - j S N A T - - t o 1 1 1 . 8 2 . 1 4 9 . 5 8 以 下 就 是 将 图 1 0 - 2 0 的 示 例 修 改 后 的 内 容 , 其 中 最 主 要 的 差 异 在 于 将 路 由 规 则 改 成 依 据 f w m a r k 来 判 断 , 即  和  的 命 令 列 , 此 外 ,  行 命 令 则 是 用 于 标 记 数 据 包 的 f w m a r k 值,此处将从eth0送出的数据包标记为fwmark 1,从ppp0送出的数据包标记为fwmark 2。 # ! / b i n / b a s h i p r u l e a d d f w m a r k 1 t a b l e 1 0  i p r u l e a d d f w m a r k 2 t a b l e 2 0  第 章   基于策略的路由及多路带宽合并 10 09 10 11 12 13 14 15 16 315 提示 ip route add 10.10.15.0/25 dev eth0 table 10 ip route add default via 10.10.15.1 dev eth0 table 10 ip route add default via 111.82.149.58 dev ppp0 table 20 ip route replace default \ nexthop via 10.10.15.1 dev eth0 weight 1 \ nexthop via 111.82.149.58 dev ppp0 weight 1 iptables -t nat -A POSTROUTING -o eth0 -s 192.168.122.0/24 \ -j SNAT --to 10.10.15.35 iptables -t nat -A POSTROUTING -o ppp0 -s 192.168.122.0/24 \ -j SNAT --to 111.82.149.58 iptables -t mangle -A POSTROUTING -o eth0 -m state --state NEW \ -j CONNMARK --set-mark 1  iptables -t mangle -A POSTROUTING -o ppp0 -m state --state NEW \ -j CONNMARK --set-mark 2  iptables -t mangle -A PREROUTING -i eth1 -m connmark --mark 1 \ -j MARK --set-mark 1 iptables -t mangle -A PREROUTING -i eth1 -m connmark --mark 2 \ -j MARK --set-mark 2 如果要回顾CONNMARK、MARK的处理方法及connmark的匹配方式,请返回阅读第3章的内容。 3. 更加智能化的负载均衡器 虽然负载均衡器已经可以正常工作了,但还不够完美,因为负载均衡器还是以循环(Run Robin)方式来决定哪个会话(Session)该经由哪条实体线路,因此在这种模式中,依然很容易 造成拥塞的假象。我们以图10-23为例进行说明,请假设两种情况: 不同来源端的拥塞 假设内部主机要针对因特网建立三条连接,而这三条连接的用途分别是:使用FTP下 载4GB的文件,使用ping命令来测试网络的连接,使用http协议下载3GB的文件。当第 条连接产生时,会被安排到ISP 1的线路上;当第条连接产生时,则被安排到ISP 2的线路 上;当第条连接产生时,则被安排到ISP2的线路上。 从以上流程可以看到循环(Run Robin)模式的问题,因为第及第条连接都会被安排到 同一条线路上,而使用ISP 1的实体线路拥塞,但ISP 2的线路却没什么流量。这个结果就是 循环模式的致命伤,无法改变。 Linux 网络安全技术与实现(第 版) 2 09 10 11 12 13 14 15 16 316 4. 相同来源端的拥塞 例 如 , 内 部 有 两 台 主 机 要 从 因 特 网 下 载 同 一 个 文 件 , 我 们 假 设 第 一 条 连 接 是 经 由 I S P 1 的 线 路 , 请 问 第 二 条 连 接 会 经 由 哪 条 线 路 呢 ? 答 案 不 用 怀 疑 一 定 是 I S P 1 , 为 什 么 会 是 I S P 1 呢?难道不会被安排在ISP 2吗?别忘了,稍早之前曾介绍过系统内有一个路由缓存机制,因 为 目 的 端 都 是 同 一 个 , 因 此 , 这 两 条 连 接 都 会 经 由 I S P 1 的 线 路 , 如 此 I S P 1 的 线 路 就 会 形 成 拥塞,但ISP 2却没什么流量。 有 办 法 解 决 这 个 问 题 吗 ? 答 案 是 有 , 但 不 完 美 ! 我 们 可 以 使 用 i p r o u t e f l u s h c a c h e 命 令 来 清 除 路 由 缓 存 内 的 数 据 , 但 又 不 能 无 时 无 刻 地 清 除 缓 存 。 而 且 缓 存 一 旦 被 清 除 掉 , 系 统 又 需 要为新的连接来定义路由,反而会降低系统性能。 以 上 两 个 问 题 都 是 大 多 数 负 载 均 衡 器 的 弊 病 , 不 过 , 其 实 有 更 聪 明 的 解 决 办 法 , 我 们 可 以 根 据 线 路 的 负 载 情 况 来 决 定 要 使 用 哪 条 实 体 线 路 来 传 输 数 据 , 而 这 个 强 大 功 能 是 通 过 N e t f i l t e r 的 模 块 来 达 到 的 , 这 幕 后 功 臣 分 别 是 R A T E E S T 的 处 理 方 式 , 以 及 rateest的匹配方法。 此 处 以 图 1 0 - 2 4 为 例 来 说 明 如 何 配 置 这 个 “ 更 加 智 能 化 的 负 载 均 衡 器 ” , 我 们 在 设 置 L i n u x 基 于 策 略 的 路 由 时 , 最 好 把 一 个 名 为 逆 向 路 径 过 滤 ( R e v e r s e P a t h F i l t e r i n g ) 的 机 制 关 闭 , 以 免 干 扰 L i n u x 基 于 策 略 的 路 由 的功能。可使用以下脚本将其关闭。 f o r i i n / p r o c / s y s / n e t / i p v 4 / c o n f / * / r p _ f i l t e r d o e c h o 1 > $ i d o n e 我 们 要 根 据 网 络 带 宽 的 使 用 量 来 决 定 新 连 接 要 用 哪 条 实 体 链 路 来 传 输 数 据 , 因 此 , 需 要 一 个 能 用 来 统 计 流 量 的 机 制 , 这 个 机 制 就 是 使 用 N e t f i l t e r 的 R A T E E S T 模 块 , 使 用 如 下 脚 本 , 我们可在mangle T able中的PREROUTING进行流量统计。分别针对从eth0及eth1进入的流量, 可 以 使 用 - - r a t e e s t - e w m a 1 s ( 单 位 为 秒 ) 参 数 来 设 置 “ 统 计 值 的 时 间 范 围 ” 。 例 如 , 每 秒 钟 统 计 一次,另外,--rateest-interval 500ms(时间单位是s、ms及us)参数则设置在这1秒钟内的采样次 数 。 当 然 , 采 样 次 数 越 多 , 最 后 得 到 的 值 就 越 精 确 。 最 后 得 到 前 一 秒 钟 的 带 宽 使 用 率 , 就 使 用--rateest-name RA TE_ETH0参数来保存到RA TE_ETH0数据库中。 i p t a b l e s - t m a n g l e - A P R E R O U T I N G - i e t h 0 - j R A T E E S T \ - - r a t e e s t - n a m e R A T E _ E T H 0 \ - - r a t e e s t - i n t e r v a l 5 0 0 m s \ I SP 1 IS P 2 et h0 et h1 et h2 192.168.122.0/24 10.10.15.46/25 192.168.1.10/24 图10-24  负载均衡器连接分配的问题 第 章   基于策略的路由及多路带宽合并 10 09 10 11 12 13 14 15 16 317 --rateest-ewma 1s iptables -t mangle -A PREROUTING -i eth1 -j RATEEST \ --rateest-name RATE_ETH1 \ --rateest-interval 500ms \ --rateest-ewma 1s 有了带宽使用统计值后,就可以有比较的依据来决定新的连接该经由哪条线路,而比较 操作就交给rateest模块来完成。接着看下面的脚本,如前所述:“经过ISP实体线路送到ISP 的数据包,如果数据包内的来源端不属于这条实体线路的IP,那么这个数据包将被丢弃”, 因此,我们在决定一条新的连接要经过哪条实体线路时,必须从一条连接的第一个数据包开 始处理,否则可能造成连接中断问题。因此,这里使用-i eth2 -m state --state NEW来指定数 据包是由内部网路送往因特网,而且是连接的第一个数据包才要进行处理。 接着使用-m rateest -rateest-delta指定由rateest模块来执行流量匹配的操作。要匹配什么 呢?--rateest1 RATE_ETH0及--rateest2 RATE_ETH1是指定要被拿来匹配用的数据来自数据库 RATE_ETH0及RATE_ETH1,但单纯匹配流量的大小是没有任何意义的。例如,有A、B两 条实体线路,A的带宽是10M Bps,但B的带宽是2M Bps,此时若A的使用率是40%,但B的 使用率只有10%,请问,新的连接产生时,要安排走实体线路A还是B呢?另外,由于这个参 数的后面还要指定这条实体线路的带宽是多少(如有两条4M/1M的ADSL),因此需要用参数-- rateest-bps1 4mbit及--rateest-bps2 4mbit来设置两条实体线路的带宽都是4M Bps。 另外,--rateest-gt是大于的意思,由于在本例将RATE_ETH0放在RATE_ETH1之前,因 此,这个语法是指当RATE_ETH0大于RATE_ETH1时,就把连接第一个数据包mark值设置为 1;而第二条规则指出,如果RATE_ETH1大于RATE_ETH0,就把连接第一个数据包的mark 值设置为2。 iptables -t mangle -A PREROUTING -i eth2 -m state --state NEW \ -m rateest --rateest-delta \ --rateest1 RATE_ETH0 --rateest-bps1 4mbit \ --rateest-gt \ --rateest2 RATE_ETH1 --rateest-bps2 4mbit \ -j MARK --set-mark 1 iptables -t mangle -A PREROUTING -i eth2 -m state --state NEW \ -m rateest --rateest-delta \ --rateest1 RATE_ETH1 --rateest-bps1 4mbit \ --rateest-gt \ --rateest2 RATE_ETH0 --rateest-bps2 4mbit \ -j MARK --set-mark 2 Linux 网络安全技术与实现(第 版) 2 09 10 11 12 13 14 15 16 318 至 此 , 每 一 条 要 连 到 因 特 网 的 连 接 的 第 一 个 数 据 包 , 都 已 经 被 标 记 上 了 n f m a r k , 第 3 . 1 . 2 一 节 的 第 2 0 部 分 曾 提 过 : “ n f m a r k 的 有 效 范 围 仅 限 于 单 一 数 据 包 ” , 因 此 , 当 第 一 个 数 据 包 被 标 记 m a r k 值 之 后 , 再 使 用 以 下 命 令 将 m a r k 值 复 制 下 来 , 而 一 条 连 接 在 第 一 个 数 据 包 之 后 的 所 有 数 据 包 , 都 按 照 C O N N M A R K 处 理 方 式 将 之 前 复 制 的 m a r k 值 , 逐 一 粘 贴 到 该 连 接 的 每 个 数据包中。 i p t a b l e s - t m a n g l e - A P R E R O U T I N G - i e t h 2 - m s t a t e - - s t a t e N E W \ - j C O N N M A R K - - s a v e - m a r k i p t a b l e s - t m a n g l e - A P R E R O U T I N G - i e t h 2 - j C O N N M A R K - - r e s t o r e - m a r k 最 后 还 需 要 建 立 两 条 路 由 规 则 。 如 下 , 我 们 使 用 f w m a r k ( n f m a r k ) 作 为 判 断 条 件 , 把 标 记 有 m a r k 值 为 1 的 数 据 包 导 入 到 t a b l e 1 的 路 由 表 , 而 m a r k 值 为 2 的 数 据 包 则 导 入 到 t a b l e 2 的 路 由 表,但也别忘了将路由表1和路由表2的内容设置好。 i p r u l e a d d f w m a r k 1 t a b l e 1 i p r u l e a d d f w m a r k 2 t a b l e 2 i p r o u t e a d d d e f a u l t v i a 1 0 . 1 0 . 1 5 . 1 d e v e t h 0 t a b l e 1 i p r o u t e a d d d e f a u l t v i a 1 9 2 . 1 6 8 . 1 . 2 5 4 d e v e t h 1 t a b l e 2 另 外 , 在 设 置 一 对 多 N A T 时 , 请 运 行 S N A T 把 从 e t h 0 接 口 送 出 去 的 数 据 包 的 来 源 端 I P 改 成 1 0 . 1 0 . 1 5 . 4 6 , 再 把 e t h 1 接 口 送 出 去 的 数 据 包 的 来 源 端 I P 改 为 1 9 2 . 1 6 8 . 1 . 1 0 。 至 此 止 , “ 更 加 智 能化的负载均衡器”就完成设置了。 i p t a b l e s - t n a t - A P O S T R O U T I N G - o e t h 0 - s 1 9 2 . 1 6 8 . 1 2 2 . 0 / 2 4 \ - j S N A T - - t o 1 0 . 1 0 . 1 5 . 4 6 i p t a b l e s - t n a t - A P O S T R O U T I N G - o e t h 1 - s 1 9 2 . 1 6 8 . 1 2 2 . 0 / 2 4 \ - j S N A T - - t o 1 9 2 . 1 6 8 . 1 . 1 0 最后,将以上零散的脚本整理成下面完整的内容: # ! / b i n / b a s h f o r i i n / p r o c / s y s / n e t / i p v 4 / c o n f / * / r p _ f i l t e r d o e c h o 1 > $ i d o n e i p t a b l e s - t n a t - F i p t a b l e s - t m a n g l e - F i p t a b l e s - t m a n g l e - A P R E R O U T I N G - i e t h 0 - j R A T E E S T - - r a t e e s t - n a m e R A T E _ E T H 0 \ - - r a t e e s t - i n t e r v a l 5 0 0 m s - - r a t e e s t - e w m a 1 s 第 章   基于策略的路由及多路带宽合并 10 09 10 11 12 13 14 15 16 319 iptables -t mangle -A PREROUTING -i eth1 -j RATEEST --rateest-name RATE_ETH1 \ --rateest-interval 500ms --rateest-ewma 1s iptables -t mangle -A PREROUTING -i eth2 -m state --state NEW \ -m rateest --rateest-delta \ --rateest1 RATE_ETH0 --rateest-bps1 1mbit \ --rateest-gt \ --rateest2 RATE_ETH1 --rateest-bps2 1mbit \ -j MARK --set-mark 1 iptables -t mangle -A PREROUTING -i eth2 -m state --state NEW \ -m rateest --rateest-delta \ --rateest1 RATE_ETH1 --rateest-bps1 4mbit \ --rateest-gt \ --rateest2 RATE_ETH0 --rateest-bps2 4mbit \ -j MARK --set-mark 2 iptables -t mangle -A PREROUTING -i eth2 -m state --state NEW \ -j CONNMARK --save-mark iptables -t mangle -A PREROUTING -i eth2 -j CONNMARK --restore-mark ip rule add fwmark 1 table 1 ip rule add fwmark 2 table 2 ip route add default via 10.10.15.1 dev eth0 table 1 ip route add default via 192.168.1.254 dev eth1 table 2 iptables -t nat -A POSTROUTING -o eth0 -s 192.168.122.0/24 \ -j SNAT --to 10.10.15.46 iptables -t nat -A POSTROUTING -o eth1 -s 192.168.122.0/24 \ -j SNAT --to 192.168.10 10.5 小结 本章介绍了Linux系统的基于策略的路由机制,相信这个强大机制一定给你留下极为深 刻的印象!其实市场上所谓的负载均衡设备都以Linux的基于策略的路由机制为核心,然后 设计出一个美观的网页管理程序让我们来操作而已,如果你了解了本章的内容,相信你一定 可以自己实现所需的功能,另外需要指出,Linux基于策略的路由机制在有些功能上可是很 多商用路由器都所望尘莫及的! 第 章 VPN L2TP Over IPSec 16 09 10 11 12 13 14 15 16 461 :Linux 16 VPN:L2TP Over IPSec第16章 Linux 网络安全技术与实现 (第 版) 2 09 10 11 12 13 14 15 16 462 前 面 的 章 节 讲 述 了 如 何 使 用 I P S e c 来 构 建 V P N , 但 构 建 V P N 除 了 使 用 I P S e c 之 外 , 在 业 界 L 2 T P ( L a y e r 2 T u n n e l i n g P r o t o c o l , L 2 T P ) 也 是 一 种 常 用 来 构 建 V P N 的 通 信 协 议 。 根 据 目 前 操 作 系 统 发 展 的 情 况 来 看 , L 2 T P 最 大 的 优 势 就 在 于 其 简 便 性 , 例 如 当 你 带 着 笔 记 本 电 脑 外 出 时 , 该 如 何 通 过 I P S e c 来 建 立 V P N 连 接 , 来 访 问 公 司 内 部 的 数 据 呢 ? 答 案 是 M M C ( M i c r o s o f t M a n a g e m e n t C o n s o l e , M M C ) , 但 M M C 并 非 所 有 人 都 会 使 用 , 并 且 笔 记 本 电 脑 的 网 络 配 置 会 因 为 环 境 而 异 。 因 此 我 们 只 有 不 断 通 过 M M C 来 修 改 I P S e c 的 参 数 , 才 能 在 不 同 环 境 中 使 用 VPN来连接企业网络。 相 对 于 I P S e c 在 使 用 上 的 不 便 , L 2 T P 就 好 用 多 了 。 在 目 前 各 大 操 作 系 统 中 , 如 M i c r o s o f t W i n d o w s 、 W i n C E 、 M a c O S 及 L i n u x 等 系 统 , 都 已 经 内 置 了 L 2 T P 的 连 接 功 能 。 我 们 只 需 将 拨 号 网 络 设 置 好 , 并 在 你 需 要 访 问 企 业 内 部 数 据 时 启 用 L 2 T P 的 拨 号 功 能 , 就 可 以 轻 松 通 过 L 2 T P 对 企 业 建 立 V P N 连 接 ; 更 令 人 欣 慰 的 是 , 不 管 你 所 处 的 网 络 环 境 如 何 , 都 不 会 影 响 使 用者的操作行为,因此L2TP大多应用在Client to Site的VPN结构中。 16.1 何谓PPP 早 期 计 算 机 与 计 算 机 之 间 的 连 接 是 通 过 调 制 解 调 器 来 连 接 , 图 1 6 - 1 是 一 个 很 典 型 的 P P P (P oint-to-P oint P rotocol)连接。而P P P 协议的工作原理相当简单,在图16-1中,两台计算机 是 使 用 调 制 解 调 器 通 过 电 话 网 络 来 连 接 , 在 这 个 结 构 中 , 主 机 A 发 送 的 数 据 就 一 定 是 给 主 机 B 的 , 而 主 机 B 所 发 送 的 数 据 也 一 定 是 给 主 机 A 的 , 绝 对 不 会 发 生 其 他 情 况 。 简 单 来 说 , P P P 在TCP 四层结构中是属于链路层的范畴。 图16-1  PPP通信协议 16.2 何谓L2TP协议 在 V P N 隧 道 技 术 中 , 除 了 I P S e c 所 提 供 的 I P i n I P T u n n e l 之 外 , 我 们 还 可 以 通 过 L 2 T P 协 议 来 建 立 隧 道 , 而 L 2 T P 是 属 于 T C P / I P 网 络 结 构 中 链 路 层 , 属 于 O S I 七 层 结 构 中 的 第 二 层 , 其 目 第 章   VPN L2TP Over IPSec 16 09 10 11 12 13 14 15 16 463 : 的是用来作为建立隧道用的协议,因此称之为Layer 2 Tunnel Protocol。 16.2.1 L2TP协议的原理 ❙ 以图16-2为例,在L2TP服务器上有一组公网IP,在这个示例中,笔者假设其为 10.0.1.210,我们假设客户端主机的IP是DHCP服务器所分配的,当L2TP连接建立之后, 在L2TP服务器及客户端主机上会分别多出一个虚拟接口,这个虚拟接口的名称通常是 PPP0,而且这两个PPP接口上的IP都属于同一个网段,因此这个结构看起来有点像把整个 因特网当成一条虚拟连接来建立PPP连接,所以从192.168.0.1发送出去的数据就一定是给 192.168.0.10,而从192.168.0.10发送出去的数据也一定是给192.168.0.1。 图16-2  L2TP示例图 在了解PPP及L2TP的工作模式之后,接下来以图16-2及图16-3为例来说明L2TP协议的 工作原理。首先我们假设客户端主机要通过L2TP来建立VPN连接,并使用TELNET协议来 连接192.168.0.20这台主机。一开始使用者在客户端主机上运行telnet 192.168.0.20命令,通 过TELNET协议来连接到192.168.0.20这台主机,然后这个数据包被送到传输层,并且在数 据包前面封装上TCP包头,接着数据包也被送入到网络层的位置,并且在数据包前面加 上一个IP包头。不过此时IP包头内的Source IP应该是192.168.0.10,而Destination IP应该是 192.168.0.20,但接下来数据包并不是直接送到以太网来处理,而是送到PPP机制来处理, 并且在数据包的前端加上PPP包头。按照一般的做法,接下来数据包应该直接从网络实体层 送离本机,但这里最特殊之处在于PPP会将数据包转发给L2TP机制,并且在数据包的前面 封装一个L2TP包头。 L2TP则又是一个更特殊的机制,L2TP会把整个数据包送回传输层,接着在整个数据 包的最前面再封装一个UDP包头,然后数据包会继续往下层发送到网络层,这时数据包的 最前端会再被封装一个IP包头,不过这个时候IP包头内的Source IP是客户端主机网络接口上 Linux 网络安全技术与实现 (第 版) 2 09 10 11 12 13 14 15 16 464 的IP 。在这个示 例中是1 0.0. 1.20 0,而D es tination IP 将会是1 0.0. 1.21 0,如 此这个数据 包将可以 通 过 这 两 个 公 网 I P , 将 数 据 包 跨 过 因 特 网 送 到 L 2 T P 服 务 器 上 。 但 在 数 据 包 送 达 L 2 T P 服 务 器 之后,数据包又是如何送到192.168.0.20呢?当然这又是另一种技术,不过这里暂不讨论,稍 后将会进行完整描述。 TCP/IP 模型 Application TELNET TCP/UDP Network Link Layer � � � � � � � UDPL 2T P PPP IP TC PD AT A L2 TP PPP IP TC PD AT A L2 TP PPP IP TC PD AT A TC PD AT A PPP IP TC PD AT A UDPL 2T P PPP IP IP TC PD AT A UDP Ether L2 TP PPP IP IP TC PD AT A 图16-3  L2TP的工作原理 在 了 解 了 整 个 L 2 T P 协 议 的 工 作 原 理 之 后 , 再 来 看 实 际 截 取 的 L 2 T P 协 议 下 的 数 据 包 。 从 图 1 6 - 4 中 的 数 据 包 结 构 可 以 看 到 , 其 最 下 方 的 位 置 应 该 就 是 应 用 层 协 议 的 部 分 , 接 下 来 被 封 装 上 一 个 T C P 包 头 , 再 封 装 一 个 I P 包 头 , 从 这 里 我 们 可 以 清 楚 地 看 到 I P 包 头 内 的 I P 是 一 组 私 有 I P , 接 着 则 是 被 封 装 上 一 个 P P P 包 头 , 再 被 加 上 L 2 T P 包 头 ; 然 后 我 们 可 以 看 到 数 据 包 被 送 回 传 输 层 , 并 且 封 装 上 U D P 包 头 , 接 着 再 封 装 上 I P 包 头 , 这 个 I P 包 头 内 的 I P 也 是 一 组 公 网 IP,最后数据包被送到以太网来处理,最后送离本机。 图16-4  L2TP协议的数据包结构 第 章   VPN L2TP Over IPSec 16 09 10 11 12 13 14 15 16 465 : 16.2.2 L2TP协议的安全问题 ❙ 从图16-4可以清楚看到L2TP数据包内所承载的数据内容,另外我们还要了解,在L2TP 拨号过程中,需要进行帐户及密码的验证操作,不过这个帐户密码的验证操作是由PPP协议 来完成的,图16-5就是PPP协议在 进行验证操作时获取的数据包, 从数据包可以清楚看到传输中的 帐户是jacky_chen,或许你会觉得 很奇怪,如果真是这样,那L2TP 协议所建立的VPN也未免太不安 全了吧!不过,L2TP协议的确就 是如此。 16.2.3 L2TP协议安全问题的解决方案 ❙ 因为L2TP协议本身并没有考虑安全的问题,如果仅仅用L2TP来建立企业的VPN,那么 笔者只能说“你真是勇气可嘉!”。在一般使用L2TP协议时,绝对不会单独只使用L2TP协 议,通常都会在客户端主机与L2TP服务器之间建立传输模式的IPSec,这样就可以在网络上 安全地使用L2TP协议。 图16-6是L2TP协议与IPSec协议一起使用时的工作流程,其实这个流程与单独使用L2TP 协议的工作流程差不多,而其中的差异就在于第、步骤之间,在L2TP加上IPSec之后, 其数据包结构就如同图16-7所示。因为在第步之前的所有内容都被加密了,所以看起来与 一般的IPSec数据包没什么不同,这个方法我们称为L2TP Over IPSec。 TCP/IP 模型 Application TELNET TCP/UDP Network Link Layer � � � � � � � � L2TP PPP IP TCPDATA L2TP PPP IP TCPDATA TCPDATA PPP IP TCPDATAUDPEther L2TP PPPIPIP IPSec TCPDATA UDPL2TPPPP IPIP IPSec TCPDATA UDPL2TPPPP IPIPSec TCPDATA UDPL2TPPPP IP TCPDATA 图16-6  L2TP Over IPSec 图16-5  PPP协议的验证 Linux 网络安全技术与实现 (第 版) 2 09 10 11 12 13 14 15 16 466 图16-7  L2TP Over IPSec的数据包结构 1 6 . 2 . 4 C l i e n t t o S i t e 的 L 2 T P V P N 结 构 探 讨 ❙ 以 图 1 6 - 8 为 例 来 说 明 L 2 T P 的 完 整 架 构 及 工 作 流 程 。 首 先 , 因 为 L 2 T P 客 户 端 要 连 接 L 2 T P 服 务 器  , 会 触 发 I K E 机 制 来 进 行 S A 信 息 的 交 换  , 在 S A 信 息 交 换 完 之 后 , 传 输 模 式 的 I P S e c 也 就 建 立 完 成  。 接 着 L 2 T P 客 户 端 所 传 输 的 数 据 包 就 可 以 通 过 I P S e c 的 保 护 , 安 全 地 送 达 L 2 T P 服 务 器  。 而 L 2 T P 服 务 器 在 收 到 L 2 T P 客 户 端 的 请 求 之 后 , 随 即 启 动 P P P 服 务 器 并 生 成 一 个 P P P 的 接 口  , 而 P P P 接 口 上 的 I P 则 是 由 L 2 T P 服 务 器 所 分 配 的 , 接 着 L 2 T P 服 务 器 应 答 给 L 2 T P 客 户 端 , 而 这 个 数 据 包 也 是 通 过 I P S e c 所 加 密 保 护 的  。 在 L 2 T P 客 户 端 收 到 应 答 之 后 , L 2 T P 客 户 端 随 即 启 动 P P P 客 户 端 , 在 P P P 客 户 端 启 动 之 后 随 即 会 生 成 一 个 P P P 接 口  , 而 P P P 接 口 上 的 网 络 配 置 则 是 由 L 2 T P 服 务 器 所 分 配 的 。 在 完 成 以 上 流 程 之 后 , L 2 T P V P N 连 接 就 建 立 起 来 了 , 如 此 我 们 就 可 以 在 客 户 端 主 机 上 , 直 接 访 问 到 1 9 2 . 1 6 8 . 0 . 1 0 这 个 I P 以 及 整 个 企业网络了。 图16-8  Client to Site的L2TP结构 第 章   VPN L2TP Over IPSec 16 09 10 11 12 13 14 15 16 467 : 16.2.5 L2TP 客户端及服务器之间网段的选择 ❙ 建立了L2TP连接后,其网络的逻辑结构就如图16-9所示。也就是说,L2TP服务器从某个 角度来看,扮演了路由器的角色,但如果路由器左右两侧的网段相同,这个路由器就无法发挥 它的作用。简单来说,就是路由器左右两侧的主机是无法互通的。但如果是这样,为什么这里 会将L2TP客户端及L2TP服务器之间所使用的网段设置成与企业内部所使用的网段相同呢? 图16-9  L2TP连接的逻辑结构 关于以上这个问题,我们可能会有两种不同的考虑,如下说明: 将L2TP客户端与L2TP服务器之间设置成与企业内“不同”的网段: ● 这种情况下,我们不必担心路由器左右两侧网段相同的问题,但问题是在客户端主机拨号 网络中必须设置“使用远程网络的默认网关”选项,否则在L2TP连接建立完成后,客户端主机 无法与企业内部主机沟通,至于“使用远程网络的默认网关”是什么?稍后将进行详细说明。 将L2TP客户端与L2TP服务器之间设置成与企业内“相同”的网段: ● 某些情况下,我们可能不想启用“使用远程网络的默认网关”选项,但又想要正常访问 企业内主机,这时就可以将L2TP客户端与L2TP服务器之间的网段设置成与企业内部网络相 同的网段,但这样做会使得路由器左右两侧的网段是相同的。也就是说,建立了L2TP连接 后,客户端主机还是无法访问到企业内部的主机,不过,在此可以使用Proxy ARP的机制来 轻松解决这个问题。 16.2.6 Proxy ARP的工作原理 ❙ 在建立了L2TP客户端与L2TP服务器之间的连接之后,其网络的逻辑结构就如图16-9所 示。接下来分析一下,如果L2TP服务器左右两侧的网段相同,将会产生什么样的问题,以 及Proxy ARP机制如何解决这个问题。 产生问题的原因: ● 首先我们假设L2TP客户端对企业内的文件服务器进行数据访问时,这个服务器请求数 Linux 网络安全技术与实现 (第 版) 2 09 10 11 12 13 14 15 16 468 据包内的Source IP是192.168.0.1 1,而Destination IP则是192.168.0.60。因此,这个数据包将由 L 2 T P 客 户 端 的 P P P 0 接 口 送 出 , 因 为 这 是 P P P 连 接 , 所 以 由 L 2 T P 客 户 端 P P P 0 接 口 送 出 去 的 数 据 包 , 一 定 就 是 由 连 接 的 另 一 个 端 点 来 接 收 , 也 就 是 由 L 2 T P 服 务 器 的 P P P 0 接 口 接 收 , 接 着 L 2 T P 服 务 器 会 根 据 其 上 的 路 由 表 来 决 定 如 何 处 理 数 据 包 。 但 别 忘 了 , 这 个 数 据 包 的 S o u r c e _ I P 及 D e s t i n a t i o n I P 分 别 是 1 9 2 . 1 6 8 . 0 . 1 1 及 1 9 2 . 1 6 8 . 0 . 6 0 。 如 图 1 6 - 1 0 是 L 2 T P 服 务 器 上 的 路 由 表 , 根据路由表的判断,这个数据包将由eth1接口送出,并由192.168.0.60主机来接收,如此L2TP 客户端就可以正常地将数据包发送给企业内的文件服务器。 [ r o o t @ l o c a l h o s t ~ ] # r o u t e - n K e r n e l I P r o u t i n g t a b l e D e s t i n a t i o n G a t e w a y       G e n m a s k F l a g s M e t r i c R e f U s e I f a c e 1 9 2 . 1 6 8 . 0 . 1 1 0 . 0 . 0 . 0       2 5 5 . 2 5 5 . 2 5 5 . 2 5 5 U H 0 0 0 p p p 0 1 9 2 . 1 6 8 . 0 . 0 0 . 0 . 0 . 0       2 5 5 . 2 5 5 . 2 5 5 . 0 U 0 0 0 e t h 1 1 0 . 0 . 1 . 2 0 0 0 . 0 . 0 . 0       2 5 5 . 2 5 5 . 2 5 5 . 0 U 0 0 0 e t h 0 0 . 0 . 0 . 0 1 0 . 0 . 1 . 2 5 4     0 . 0 . 0 . 0 U G 0 0 0 e t h 0 [ r o o t @ l o c a l h o s t ~ ] # 图16-10  Proxy ARP的原理 不 过 , 当 文 件 服 务 器 收 到 这 个 数 据 包 之 后 , 随 即 会 对 数 据 包 内 所 记 录 的 S o u r c e I P 主 机 做 出 应 答 , 这 个 应 答 数 据 包 内 的 S o u r c e _ I P 及 D e s t i n a t i o n I P 将 会 是 1 9 2 . 1 6 8 . 0 . 6 0 以 及 1 9 2 . 1 6 8 . 0 . 1 1 。 但 此 时 问 题 产 生 了 , 当 文 件 服 务 器 要 将 数 据 包 发 送 出 去 之 前 会 发 现 , 目 的 端 主 机 与 本 机 在 同 一 个 网 段 中 , 因 此 文 件 服 务 器 会 直 接 在 网 络 上 发 出 A R P 的 广 播 数 据 包 , 试 图 查 找 到 1 9 2 . 1 6 8 . 0 . 1 1 主 机 网 卡 上 的 M A C 地 址 。 但 因 为 广 播 数 据 包 无 法 跨 越 路 由 器 , 况 且 A R P 的 工 作 范 围 仅 局 限 于 单 一 的 实 体 网 段 , 文 件 服 务 器 也 不 可 能 取 得 1 9 2 . 1 6 8 . 0 . 1 1 所 对 应 的 M A C 地 址 , 当 然 文 件 服 务 器 就 无 法 将 应 答 数 据 包 送 给 L 2 T P 客 户 端 , 所 以 L 2 T P 客 户 端 是 无 法 与 文 件 服 务 器 进 行 通 信 的 。 如 果 你 忘 了 A R P 协 议 的 原 理 , 那 么 请 回 顾 第 1 . 2 . 1 一 节 中 的 内 容 。 解决问题的办法: ● 想 要 解 决 以 上 的 问 题 , 其 实 一 点 也 不 难 。 如 图 1 6 - 1 1 所 示 , 我 们 只 需 在 L 2 T P 服 务 器 上 启 动 P r o x y A R P 机 制 , 就 可 以 轻 松 解 决 。 L 2 T P 客 户 端 与 文 件 服 务 器 无 法 通 信 的 原 因 在 于 , 文 件 服 务 器 无 法 把 应 答 数 据 包 正 确 地 回 送 给 发 送 端 , 导 致 网 络 无 法 通 信 。 不 过 当 P r o x y A R P 机 制 启 动 后 , 状 况 就 有 所 改 变 了 , P r o x y A R P 机 制 会 代 替 L 2 T P 客 户 端 将 数 据 包 收 下 , 并 将 数 据 包 交 给 L 2 T P 服 务 器 的 路 由 表 来 决 定 数 据 包 该 如 何 处 理 。 图 1 6 - 1 0 路 由 表 第 一 行 记 录 着 如 果 数 据 包 要 送 往 1 9 2 . 1 6 8 . 0 . 1 1 这 台 主 机 的 话 , 数 据 包 就 由 P P P 0 接 口 送 出 , 既 然 数 据 包 是 由 P P P 0 接 口 发 送 出 去 的 , 那 么 这 个 数 据 包 就 一 定 会 被 1 9 2 . 1 6 8 . 0 . 1 1 主 机 所 接 收 , 如 此 一 来 网 络 自 然 就 通 了 。 第 章   VPN L2TP Over IPSec 16 09 10 11 12 13 14 15 16 469 : 图16-11  Proxy ARP的原理 图16-12是使用WireShark软件在L2TP服务器的eth1接口上所截取下来的数据包,从这 个图可以证明Proxy ARP的存在。首先,当L2TP客户端发送第一个ICMP数据包给文件服务 器时,这个数据包会通过PPP连接将数据包先发送到L2TP服务器,接着,L2TP服务器将数 据包由eth1接口发送给文件服务器,此时L2TP服务器就会在eth1所临近的网段上发送ARP 的广播,以找到IP 192.168.0.60所对应的MAC地址。图中第一个数据包的info字段就证明了 这个过程,当然我们也可以从第一个数据包中得知L2TP服务器eth1接口上的MAC地址是 00:50:56:C0:00:01,接着192.168.0.60主机随即通过ARP协议来应答其所对应的MAC地址, 如图中的第二个数据包,在L2TP服务器知道192.168.0.60主机网卡的MAC地址之后,随即将 L2TP客户端所要传输的ICMP数据包发送给192.168.0.60这台主机。 图16-12  Proxy ARP的工作原理 在192.168.0.60主机收到这个数据包后,随即应答数据包给192.168.0.11,但因为 192.168.0.60主机发现目的端主机与自己在同一个网段,因此192.168.0.60主机随即在网络 上发送ARP的广播数据包,以查找192.168.0.11这个IP所对应的MAC地址,如图中第四个数 据包。但接下来神奇的事情发生了,192.168.0.11并不属于这个实体网段的IP。但这时确实 有主机来应答这个ARP广播,如图中的第五个数据包。不过请你仔细看一下,第五个数据 包的应答信息却是:“我是192.168.0.11,而且我的MAC地址是00:50:56:C0:00:01”,不过 00:50:56:C0:00:01不就是L2TP服务器eth1接口的MAC地址吗?接下来,因为192.168.0.60这台 主机确定192.168.0.11这个IP所对应的MAC地址是00:50:56:C0:00:01,因此192.168.0.60主机 随即将应答数据包送给L2TP服务器,接着L2TP服务器根据路由表将数据包转发给L2TP客户 端,如此通过Proxy ARP的帮助,L2TP客户端及L2TP服务器就可以正常通信了。 Linux 网络安全技术与实现 (第 版) 2 09 10 11 12 13 14 15 16 470 16.3 构建L2TP VPN 这 里 以 图 1 6 - 1 3 为 例 来 构 建 L 2 T P V P N 环 境 。 在 图 中 我 们 假 设 L 2 T P 服 务 器 e t h 0 接 口 上 的 I P 是 1 0 . 0 . 1 . 2 0 0 , e t h 1 接 口 上 的 I P 是 1 9 2 . 1 6 8 . 0 . 1 , 另 外 在 企 业 内 部 有 一 台 文 件 服 务 器 , 其 I P 是 1 9 2 . 1 6 8 . 0 . 2 0 , 至 于 客 户 端 的 部 分 , 则 以 目 前 市 场 占 有 率 最 高 的 W i n d o w s X P / W i n d o w s 7 为 例,客户端的网络配置不做限制,只要能与10.0.1.200正常通信即可。 图16-13  L2TP VPN部署实例 1 6 . 3 . 1 配 置 L 2 T P 服 务 器 ❙ 首 先 介 绍 L 2 T P 服 务 器 的 配 置 , L 2 T P 服 务 器 在 开 源 领 域 有 很 多 不 同 的 软 件 可 供 选 择 。 这 里 选 用 的 是 X L 2 T P D 这 个 软 件 , 你 可 以 从 X L 2 T P D 的 官 方 网 站 下 载 , 其 网 址 是 f t p : / / f t p . x e l e r a n c e . c o m / x l 2 t p d / b i n a r i e s / 。 请 选 择 较 新 的 版 本 , 下 载 之 后 , 直 接 使 用 r p m 命 令 安 装 即 可 , 安装方法如下。 [ r o o t @ l o c a l h o s t t m p ] # r p m - i v h x l 2 t p d - 1 . 1 . 0 9 - 1 . i 3 8 6 . r p m w a r n i n g : x l 2 t p d - 1 . 1 . 0 9 - 1 . i 3 8 6 . r p m : H e a d e r V 3 R S A / S H A 1 s i g n a t u r e : N O K E Y , k e y I D b 5 c c 2 7 e 1 P r e p a r i n g . . . # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # [ 1 0 0 % ] 1 : x l 2 t p d # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # [ 1 0 0 % ] [ r o o t @ l o c a l h o s t t m p ] # 安 装 完 毕 后 , 接 下 来 设 置 X L 2 T P D 服 务 器 的 配 置 文 件 。 X L 2 T P D 服 务 器 的 配 置 文 件 是 / e t c / xl2tpd/xl2tpd.conf,请将其内容调整如下。 [ g l o b a l ] l i s t e n - a d d r = 1 0 . 0 . 1 . 2 0 0 p o r t = 1 7 0 1 [ l n s d e f a u l t ] i p r a n g e = 1 9 2 . 1 6 8 . 0 . 2 4 1 - 1 9 2 . 1 6 8 . 0 . 2 5 4 第 章   VPN L2TP Over IPSec 16 09 10 11 12 13 14 15 16 471 : local ip = 192.168.0.240 name = xl2tp-server pppoptfile = /etc/ppp/options.xl2tpd 其中各个参数的含义如下。 listen-addr ● 指定XL2TPD启动后,要在哪个IP上进行工作。 port ● 指定XL2TPD启动后,要在哪个端口上进行工作;不过请注意,L2TP是属于UDP协议的 服务,而且L2TP服务器的标准端口是1701。 ip range ● 在L2TP VPN架构中,客户端的IP是由L2TP服务器分配的。本示例将VPN网段的IP设置 为与企业内部相同,且分配的IP范围是192.168.0.241到192.168.0.254之间,也就是说最多可 以有14个L2TP客户端同时上线,不过既然我们已经将这个网段的IP分配给VPN客户端来使 用,所以在企业内部就不能将这些IP分配给其他主机。 local ip ● ip range参数定义了VPN客户端的IP,也就是说目前只定义了PPP连接其中一个端点的 IP,至于另一个端点的IP就由local ip这个参数来定义。本示例假设为192.168.0.240,因此当 VPN客户端上线时,我们就可以在L2TP服务器上看到一个或多个的PPP接口,而且这些接口 的IP都会是192.168.0.240。 name ● name参数只是给这个服务设置一个名称,而这个名称会在帐户数据库中使用。稍后将完 整介绍这方面的内容。 pppoptfile ● 在L2TP架构中必须与PPP协议协同工作,而PPP是由XL2TPD来调用的,因此我们必须 告诉XL2TPD要用哪个PPP的配置文件来执行PPPD。本示例将PPPD的运行参数定义在/etc/ ppp/options.xl2tpd文件中。 在配置好所有这些参数后,我们就可以使用以下方法来启动或停止XL2TPD。 [root@localhost /]# service xl2tpd restart Stopping xl2tpd: [ 确定 ] Starting xl2tpd: [ 确定 ] [root@localhost /]# Linux 网络安全技术与实现 (第 版) 2 09 10 11 12 13 14 15 16 472 1 6 . 3 . 2 配 置 P P P 服 务 器 ❙ P P P 服 务 器 并 没 有 固 定 的 配 置 文 件 , 其 配 置 文 件 的 名 称 是 由 X L 2 T P D 来 设 置 的 。 本 示 例 将其设置为/etc/ppp/options.xl2tpd,请将这个文件的内容设置如下: a u t h p r o x y a r p m s - w i n s 1 9 2 . 1 6 8 . 0 . 4 m s - d n s 1 9 2 . 1 6 8 . 0 . 3 下面解释各个参数的含义。 auth ● 在传输数据时,先进行验证操作。 proxyarp ● 启用ProxyARP的机制。 ms-wins ● 将企业内部的W indowss服务器的IP配置到VPN客户端的网络参数中。 ms-dns ● 将企业内部的DNS服务器的IP配置到VPN客户端的网络参数中。 1 6 . 3 . 3 建 立 V P N 的 拨 号 帐 户 ❙ 在 L 2 T P V P N 的 架 构 中 , 使 用 者 的 身 份 验 证 由 P P P 协 议 来 完 成 。 P P P 协 议 的 验 证 方 法 有 很 多 种 , 例 如 : P A P 、 C H A P 、 M S C H A P 及 M S C H A P - V 2 。 在 这 几 种 验 证 方 法 中 , 我 们 大 概 可 以 将 其 分 为 两 类 , 其 一 是 以 明 文 方 式 来 进 行 验 证 , 例 如 P A P 就 是 属 于 这 一 类 ; 其 二 是 验 证 过 程 中 , 帐 户 及 密 码 是 受 到 保 护 的 , 例 如 : C H A P 、 M S C H A P 及 M S C H A P - V 2 。 另 外 由 于 系 统 帐 户 数 据 库 的 密 码 是 经 过 加 密 的 , 使 得 P P P 服 务 器 无 法 使 用 / e t c / p a s s w d 或 / e t c / s h a d o w 作 为 其 帐 户 数据库。 如 果 我 们 选 择 P A P 验 证 方 法 , 那 么 帐 户 数 据 库 将 是 / e t c / p p p / p a p - s e c r e t s , 不 过 目 前 大 概 没 有 人 会 选 择 P A P , 因 为 P A P 在 网 络 上 直 接 传 输 密 码 , 又 无 任 何 的 保 护 措 施 ; 那 如 果 我 们 选 择 P A P 以 外 的 验 证 方 法 , 帐 户 数 据 库 将 会 是 / e t c / p p p / c h a p - s e c r e t s 这 个 文 件 , 如 果 要 新 增 V P N 的 拨 号帐户,只要直接编辑这个文件就可以了,其格式如下。 # S e c r e t s f o r a u t h e n t i c a t i o n u s i n g C H A P # c l i e n t s e r v e r s e c r e t I P a d d r e s s e s j a c k y _ c h e n x l 2 t p - s e r v e r 1 2 3 4 5 1 9 2 . 1 6 8 . 0 . 0 / 2 4 d a v i d _ c h a n g x l 2 t p - s e r v e r 5 4 3 2 1 * 第 章   VPN L2TP Over IPSec 16 09 10 11 12 13 14 15 16 473 : 这个文件共有四个字段,其含义分别如下: 字段一: ● 指定使用者的帐户名称。 字段二: ● 指定这组帐户是要用在哪个服务中。例如,在L2TP服务器上同时提供了L2TP VPN及 调制解调器的拨号服务,就可以用这个字段来设置这组帐户是要给L2TP VPN还是调制解 调器拨号服务来使用。而这个“字符串”是由启动PPP服务器的应用程序来设置。例如在 L2TP VPN架构中,PPP服务器是由XL2TPD来启动,所以在XL2TPD的配置文件/etc/xl2tpd/ xl2tpd.conf中必须去设置这个“字符串”,在XL2TPD这个应用程序中则使用name这个参数 来设置。此外,我们还可以在这个字段上填写“*”,表示这个帐户可以用于本机上所有的 PPP服务。 字段三: ● 指定帐户对应的密码,密码是直接以明文形式来保存的。 字段四: ● 限制帐户可以从哪些IP地址连接上来,这里可以设置的格式有:10.0.1.50、10.0.1.0/24, 或者用*(表示任意一个IP)。 16.3.4 证书的生成及保存 ❙ 关于L2TP服务器上证书的生成及保存方法,与第15.5一节中介绍的完全相同,这里就不 再重复说明,但这里要先提醒你一件事,在Linux系统上是使用OpenSSL这个软件来进行CA 的工作。不过根据我实际测试的结果发现,如果是使用RedHat Enterprise Linux 5.X及CentOS 5.X光盘中自带的OpenSSL软件,那么OpenSSL所生成的证书在Linux平台上使用并不会有 问题,但如果是在Windows平台上使用就会有问题。因此建议你可以选择RedHat Enterprise Linux 4.X/6.X或CentOS 4.X/6.X系统来作为CA的操作系统,因为在这几个版本的系统上并不 会出现证书无法在Windows系统中使用的问题。 16.3.5 配置安全策略 ❙ 以下是L2TP服务器上安全策略的配置文件/etc/racoon/setkey.conf,这个配置文件的内容 比较特殊,一般在设置安全策略时,总是要考虑哪些“送入”及“送出”的数据需要使用 IPSec,因此安全策略通常会有两条,但在L2TP VPN的结构中,L2TP客户端的IP通常不会是固 定的,我们也无法预先设置双向安全策略,最多只能设置单向安全策略。 Linux 网络安全技术与实现 (第 版) 2 09 10 11 12 13 14 15 16 474 1 . f l u s h ; 2 . s p d f l u s h ; 3 . 4 . s p d a d d 1 0 . 0 . 1 . 2 0 0 [ 1 7 0 1 ] 0 . 0 . 0 . 0 / 0 [ 0 ] a n y - P o u t i p s e c 5 . e s p / t r a n s p o r t / / r e q u i r e ; 在 说 明 以 上 示 例 之 前 请 先 思 考 两 个 问 题 , 由 于 L 2 T P 协 议 使 用 U D P 端 口 1 7 0 1 , 因 此 对 于 L 2 T P 服 务 器 而 言 , 我 们 只 需 要 让 与 端 口 1 7 0 1 有 关 的 数 据 使 用 I P S e c 即 可 ; 另 外 因 为 L 2 T P 客 户 端 的 I P 不 是 固 定 的 , 因 此 无 法 预 先 设 置 好 L 2 T P 客 户 端 对 L 2 T P 服 务 器 这 个 方 向 的 安 全 策 略 , 不 过 可 以 肯 定 的 是 , 如 果 客 户 端 访 问 L 2 T P 服 务 器 的 U D P 端 口 1 7 0 1 , L 2 T P 服 务 器 一 定 是 使 用 U D P 端 口 1 7 0 1 来 应 答 , 所 以 我 们 可 以 定 义 凡 是 从 L 2 T P 服 务 器 的 端 口 1 7 0 1 发 送 出 去 的 数 据 包 , 不 管 对 象 是 谁 、 目 的 端 端 口 是 什 么 , 这 些 数 据 全 部 都 经 由 I P S e c , 因 此 我 们 定 义 了 第 4 行 的安全策略。 安全策略一定要定义双向的,才能让 L2TP Over IPSec正常工作,不过使用现有的信息, 我 们 只 能 建 立 单 向 安 全 策 略 , 那 另 一 个 方 向 的 安 全 策 略 呢 ? 其 实 这 个 问 题 很 容 易 解 决 , 因 为 I K E 配 置 文 件 中 提 供 了 一 个 名 为 g e n e r a t e _ p o l i c y 的 参 数 , 我 们 只 需 将 这 个 参 数 设 置 为 o n , I K E 就会自动生成另一个方向的安全策略。 1 6 . 3 . 6 I K E 配 置 文 件 ❙ 在 这 个 步 骤 中 , 我 们 将 设 置 I K E 的 配 置 文 件 / e t c / r a c o o n / r a c o o n . c o n f , 这 个 配 置 文 件 的 内 容 与 第 1 5 . 5 一 节 中 所 介 绍 的 内 容 几 乎 完 全 相 同 , 唯 一 的 差 别 是 第 6 行 的 “ g e n e r a t e _ p o l i c y ” 参 数,这个参数在上一节有特别的说明,这里就不再赘述。 1 . p a t h i n c l u d e " / e t c / r a c o o n " ; 2 . p a t h p r e _ s h a r e d _ k e y " / e t c / r a c o o n / p s k . t x t " ; 3 . p a t h c e r t i f i c a t e " / e t c / r a c o o n / c e r t s " ; 4 . r e m o t e a n o n y m o u s { 5 . e x c h a n g e _ m o d e m a i n ; 6 . g e n e r a t e _ p o l i c y o n ; 7 . c e r t i f i c a t e _ t y p e x 5 0 9 " s e r v e r . p e m " " s e r v e r . k e y " ; 8 . v e r i f y _ c e r t o n ; 9 . m y _ i d e n t i f i e r a s n 1 d n ; 1 0 . p e e r s _ i d e n t i f i e r a s n 1 d n ; 1 1 . p r o p o s a l { 1 2 . a u t h e n t i c a t i o n _ m e t h o d r s a s i g ; 1 3 . e n c r y p t i o n _ a l g o r i t h m 3 d e s ; 1 4 . h a s h _ a l g o r i t h m s h a 1 ; 第 章   VPN L2TP Over IPSec 16 09 10 11 12 13 14 15 16 475 : 15. dh_group modp1024; 16. } 17. } 18. sainfo anonymous { 19. lifetime time 1 hour; 20. encryption_algorithm 3des; 21. authentication_algorithm hmac_sha1; 22. compression_algorithm deflate; 23. } 16.3.7 启动L2TP服务器 ❙ L2TP服务器是由多个功能模块所组合而成,因此,我们必须将其逐次启动,启动过程 没有先后之分,分别如下。 启动XL2TP守护程序 ● [root@localhost /]#service xl2tpd [ start | stop | rstart ] 启动racoon守护程序 ● [root@localhost /]#service racoon [ start | stop | rstart ] 配置安全策略 ● [root@localhost /]#setkey -f /etc/racoon/setkey.conf 16.4 配置L2TP客户端 目前市场上的绝大多数操作系统几乎都能支持L2TP协议,如Windows 9x/NT/Win2K/ WinXP/Win2003/Win Vista/Win7、MAC、Windows CE、Linux等,在此仅以使用者较多的 Windows XP及Windows 7为例进行介绍,其余部分请你自己参考其他资料。 16.4.1 生成L2TP客户端证书 ❙ 由于我们使用较为安全的证书验证方式,因此必须在L2TP客户端主机上安装证书,首 先请在CA上为L2TP客户端生成证书,然后再将证书安装到L2TP客户端主机上,至于生成服 务器证书的过程,就不再重复说明了,你可以参阅第15.4.2一节的内容。另外证书生成过程 中所需填写的资料,只要你觉得没问题就可以了,因为这些资料与VPN能否成功建立无关, Linux 网络安全技术与实现 (第 版) 2 09 10 11 12 13 14 15 16 476 只要切记证书的有效时间及VPN主机的时间必须合理。 这 里 假 设 将 生 成 的 证 书 及 私 钥 分 别 保 存 为 c l i e n t . p e m 、 c l i e n t . k e y 两 个 文 件 , 不 过 W i n d o w s 系 统 并 不 支 持 这 种 文 件 格 式 , 因 此 我 们 必 须 先 将 证 书 及 私 钥 转 换 成 W i n d o w s 系 统 所 支 持 的 PKCS12的文件格式。这种文件中包含“证书”及“私钥”,其转换方法如下。 [ r o o t @ l o c a l h o s t m i s c ] # o p e n s s l p k c s 1 2 - e x p o r t - i n c l i e n t . p e m - o u t c l i e n n t . p 1 2 - i n k e y c l i e n t . k e y  E n t e r p a s s p h r a s e f o r p r i v a t e . k e y :  E n t e r E x p o r t P a s s w o r d :  V e r i f y i n g - E n t e r E x p o r t P a s s w o r d  其 中 标 记  的 - o u t c l i e n t . p 1 2 是 转 换 后 的 文 件 名 , 另 外 文 件 c l i e n t . p e m 是 私 钥 , 因 为 私 钥 默 认 情 况 下 设 置 密 码 保 护 , 如 果 我 们 没 有 把 私 钥 的 密 码 告 诉 o p e n s s l 工 具 , 那 么 o p e n s s l 将 无 法 读 取 我 们 的 私 钥 , 当 然 也 就 转 换 不 成 功 。 因 此 , 必 须 告 诉 o p e n s s l 私 钥 的 密 码  , 在 c l i e n t . p 1 2 文 件 生 成 之 后 , o p e n s s l 工 具 会 要 求 我 们 提 供 一 个 密 码 来 保 护 c l i e n t . p 1 2 的 文 件 内 容  , 等 我 们 将 c l i e n t . p 1 2 文 件 导 入 W i n d o w s 系 统 , W i n d o w s 系 统 就 会 要 求 提 供 这 个 密 码 , 否 则 导 入 操 作 将 无法完成。 1 6 . 4 . 2 将 证 书 导 入 W i n d o w s X P / 7 系 统 前 的 准 备 工 作 ❙ 在 将 证 书 导 入 W i n d o w s X P / 7 系 统 之 前 , 我 们 必 须 先 准 备 好 C A 的 证 书 及 L 2 T P 客 户 端 的 证 书 文 件 , 在 此 假 设 这 两 个 证 书 的 文 件 分 别 是 c a c e r t . p e m 及 c l i e n t . p 1 2 , 由 于 W i n d o w s 系 统 不 识 别 . p e m 文 件 , 因 此 将 c a c e r t . p e m 的 后 缀 改 为 . c r t , 即 c a c e r t . c r t , 这 样 W i n d o w s 系 统 才 能 识 别 这 个 文件。 1 6 . 4 . 3 设 置 W i n d o w s X P 系 统 上 的 L 2 T P 客 户 端 ❙ 下面将以W indows XP系统为例来说明L2TP客户端的设置方法。 1. 启动及配置MMC 在 W i n d o w s X P 上 必 须 借 助 于 M M C 工 具 导 入 证 书 , 而 M M C 是 一 个 多 功 能 工 具 。 在 使 用 M M C 之 前 , 必 须 先 配 置 好 M M C 工 具 , 配 置 方 法 如 下 : 步骤 01 : 选 择 “ 开 始 ” | “ 运 行 ” , 并 输 入 m m c 命 令 , 单 击“确定”,如图16-14所示。 步骤 02 :MMC管理工具的初始界面如图16-15所示。 步骤 03 : 配 置 M M C , 选 择 “ 文 件 ” | “ 添 加 / 删 除 管 理 单 元”,如图16-16所示。 图16-14  运行mmc命令 第 章   VPN L2TP Over IPSec 16 09 10 11 12 13 14 15 16 477 : 图16-15  MMC的初始界面 图16-16  配置MMC 步骤04:单击“添加”按钮,增加MMC的管理单元,如图16-17所示。 步骤05:请选择“证书”|“添加”,以增加证书管理单元,如图16-18所示。   图16-17  添加MMC管理单元 图16-18  添加证书管理单元 步骤06:选择“计算机帐户”的管理单元,选择“下一步”,如图16-19所示。 步骤07:请选择“本地计算机”的管理单元,单击“完成”按钮,如图16-20所示。 图16-19  选择“计算机帐户”的管理单元 图16-20  选择“本地计算机”的管理单元 Linux 网络安全技术与实现 (第 版) 2 09 10 11 12 13 14 15 16 478 步骤 08 :单击“关闭”,结束添加管理单元,如图16-21所示。 步骤 09 :单击“确定”按钮,结束MMC的配置,如图16-22所示。         图16-21  结束添加管理单元         图16-22  结束MMC的配置 2. 导入“计算机”及“CA”的证书 配 置 完 M M C 工 具 之 后 , 接 下 来 导 入 计 算 机 证 书 及 C A 的 证 书 , 步 骤 如 下 : 步骤 01 : 选择“证书(本地计算机)”|“个人”,右击选择“所有任务”|“导入”,如图 16-23所示。 步骤 02 :单击“下一步”按钮,开始导入计算机证书,如图16-24所示。       图16-23  进入“导入”界面        图16-24  进行计算机证书的导入操作 步骤 03 :单击“浏览”按钮,指定证书的路径和文件名,如图16-25所示。 步骤 04 :输入client.p12文件的密码,如图16-26所示。 第 章   VPN L2TP Over IPSec 16 09 10 11 12 13 14 15 16 479 : 图16-25  设置计算机证书的路径及文件名 图16-26  输入证书的保护密码 步骤05:设置证书所要导入的位置,这里请选择“个人”,如图16-27所示。 步骤06:请单击“完成”按钮,结束计算机证书的导入操作,如图16-28所示。       图16-27  设置证书的保存位置           图16-28  完成导入操作 步骤07:在计算机证书导入完毕之后,接下来就是导入CA的证书,请选择“证书(本 地计算机)”|“受信任的 根 证 书 颁 发 机 构 ” | “ 证 书 ” , 右 击 “ 证 书 ” , 选 择 “ 所 有 任 务 ” | “ 导 入”,如图16-29所示。 步骤08:单击“下一步”,进行CA 证 书 的 导 入 操 作 , 如 图 16-30所示。 步骤09:在“文件名”中输入CA证书的路径及文件名,单击“下一步”按钮,继续证 书的导入操作,如图16-31所示。 图16-29  导入CA证书 Linux 网络安全技术与实现 (第 版) 2 09 10 11 12 13 14 15 16 480 图16-30  进行CA证书的导入操作 图16-31  设置CA证书文件的路径及文件名 步骤 10 : 选 择 证 书 的 存 储 区 , 这 里 请 选 择 “ 受 信 任 的 根 证 书 颁 发 机 构 ” , 单 击 “ 下 一 步”,如图16-32所示。 步骤 11 :单击“完成”,结束证书的导入操作,如图16-33所示。 图16-32  选择证书的存储区 图16-33  结束证书的导入操作 3. 在Windows XP系统中配置拨号网络 步骤 01 : 选 择 “ 开 始 ” | “ 控 制 面 板 ” | “ 网 络 连 接 ” | “ 新 建 连 接向导”,如图16-34所示。 步骤 02 : 单 击 “ 下 一 步 ” , 进 行 拨 号 网 络的设置,如图16-35所示。 步骤 03 : 选 择 “ 连 接 到 我 的 工 作 场 所 的 网 络 ” , 单 击 “ 下 一 步 ” 按 钮,如图16-36所示。 图16-34  建立一个新的网络连接 第 章   VPN L2TP Over IPSec 16 09 10 11 12 13 14 15 16 481 : 图16-35  进行拨号网络的配置 图16-36  设置网络连接类型 步骤04:请选择“虚拟专用网络连接”,单击“下一步”,如图16-37所示。 步骤05:设置一个连接名称,以便以后使用,单击“下一步”,如图16-38所示。 图16-37  设置网络连接方式 图16-38  设置网络连接的名称 步骤06:设置L2TP服务器的IP或主机名称都可以,单击“下一步”,如图16-39所示。 步骤07:如果希望将拨号网络的图标显示在 桌面上,就请选中“在我的桌面上 添加一个到此连接的快捷方式”, 接着单击“完成”按钮,即可完成 拨号网络的设置,如图16-40所示。 步骤08:完成L2TP的拨号网络设置之后, 在“网络连接”面板里面可以看 到多了一个“虚拟专用网络”的 拨号选项,如图16-41所示。 图16-39  设置L2TP服务器的主机地址 Linux 网络安全技术与实现 (第 版) 2 09 10 11 12 13 14 15 16 482 图16-40  完成新建连接的操作 图16-41 “网络连接”面板中的内容 步骤 09 : 然 后 需 要 连 接 L 2 T P V P N 时 , 请 双 击 刚 生 成 的 网 络 连 接 图 标 , 在 出 现 的 界 面 上 输 入 拨 号 的 帐 户 及 密 码即可,如果希望保存密 码 , 请 选 中 “ 为 下 面 用 户 保 存 用 户 名 及 密 码 ” , 如 图 1 6 - 4 2 所 示 。 4. 拨号网络中默认网关的问题 如 图 1 6 - 4 3 所 示 , 在 拨 号 网 络 的 高 级 设 置 中 有 一 个 “ 在 远 程 网 络 上 使 用 默 认 网 关 ” 选 项 , 这 个 选 项 选 择 与 否的差异,如图16-44及图16-45所示。 图16-43  拨号网络的默认网关 图16-42  输入拨号者的帐户及密码 第 章   VPN L2TP Over IPSec 16 09 10 11 12 13 14 15 16 483 : 图16-44  没有选择“在远程网络上使用默认网关” 图16-45  选择了“在远程网络上使用默认网关” 首先来看不选择“在远程网络上使用默认网关”的情况,在这种情况下,我们必须在 L2TP服务器上,把客户端主机到L2TP服务器这个网段设置为与企业内部相同,再启动Proxy ARP来解决两个实体网段间的问题。从图16-44可以发现,如果数据包不是发送到PPP接口所 在的网段,那么所有数据包将全部往10.0.1.254这个网关发送,如果假设客户端主机到L2TP 服务器这一个网段的IP是192.168.2.0/24,那么客户端主机将不会知道192.168.0.0/24的网段在 L2TP服务器后面,而所有送到192.168.0.0/24网段的数据包也会全部从10.0.1.254这个网关发 送,因此虽然VPN拨通了,但客户端主机也一样无法与企业内部网段通信。 Linux 网络安全技术与实现 (第 版) 2 09 10 11 12 13 14 15 16 484 如 果 选 择 了 “ 在 远 程 网 络 上 使 用 默 认 网 关 ” , 那 么 客 户 端 主 机 到 L 2 T P 服 务 器 这 个 网 段 的 I P 就 不 需 要 与 企 业 内 部 相 同 , 从 图 1 6 - 4 5 可 以 发 现 , 在 P P P 接 口 上 的 网 络 配 置 中 多 了 一 个 D e f a u l t G a t e w a y 值 , 而 这 个 值 将 会 暂 时 取 代 网 卡 上 所 记 录 的 D e f a u l t G a t e w a y 。 这 样 不 管 客 户 端 主 机 要 发 送 数 据 包 到 哪 里 , 所 有 数 据 包 都 会 通 过 P P P 连 接 , 送 到 1 9 2 . 1 6 8 . 0 . 2 4 0 这 个 网 关 , 而 这 个 网 关 就 是 L 2 T P 服 务 器 P P P 接 口 的 I P 。 因 此 如 果 是 送 往 企 业 内 部 网 络 的 数 据 包 。 都 会 通 过 L 2 T P 服 务 器 上 的 路 由 表 转 发 到 企 业 内 部 ; 如 果 不 是 送 往 企 业 内 部 的 数 据 包 , 就 会 通 过 L2TP服务器上的路由表,将数据包转发到因特网。 综 合 以 上 两 种 情 况 我 们 不 难 发 现 , 选 择 或 者 不 选 择 “ 在 远 程 网 络 上 使 用 默 认 网 关 ” 都 有 一些优点,如下说明。 在远程网络上不使用默认网关: ● 这 种 设 置 的 优 点 是 , 如 果 数 据 包 不 是 送 往 企 业 内 部 网 络 的 , 那 么 数 据 包 就 直 接 往 因 特 网 发 送 , 而 不 需 要 先 通 过 L 2 T P T u n n e l 送 到 L 2 T P 服 务 器 , 然 后 再 转 发 到 因 特 网 , 因 此 效 率 较 高 。 但 如 果 这 个 客 户 端 主 机 位 于 一 个 开 放 的 网 络 环 境 中 , 那 么 客 户 端 主 机 往 企 业 内 部 以 外 的 地方传输数据,便无法用IPSec的加密保护,它所传输的数据内容就可能被他人窃取。 在远程网络上使用默认网关: ● 在这种情况下,无论数据包是要送往哪里,都必须先经过L2TP Over IPSec T unnel的通道 绕 回 企 业 , 因 此 网 络 传 输 性 能 比 较 差 , 但 如 果 客 户 端 主 机 是 位 于 一 个 开 放 的 网 络 环 境 中 , 也 不 用 担 心 其 所 传 输 的 数 据 会 被 他 人 所 窃 取 。 因 此 在 这 种 情 况 下 , 客 户 端 主 机 传 输 的 任 何 数 据 都能受到L2TP Over IPSec T unnel的保护。 1 6 . 4 . 4 设 置 W i n d o w s 7 系 统 中 的 L 2 T P 客 户 端 ❙ 下面将以W indows 7系统为例来说明L2TP 客户端的设置方法。 1. 启动及配置MMC 如 同 W i n d o w s X P 中 使 用 M M C 一 样 , 在 W i n d o w s 7 中 导 入 证 书 也 通 过 M M C 工 具 来 完 成 。 我 们 必 须 先 配 置 好MMC工具,配置方法如下: 步骤 01 : 请 单 击 W i n d o w s 7 界 面 左 下 角 的 W i n d o w s 图 标 , 在 “ 搜 索 程 序 和 文 件 ” 中 输 入 “ m m c ” , 回 车 执 行 m m c 命 令 , 如 图 16-46所示。 步骤 02 :MMC管理工具的初始界面,如图16-47所示。 图16-46  启动MMC工具 第 章   VPN L2TP Over IPSec 16 09 10 11 12 13 14 15 16 485 : 图16-47  MMC的初始界面 步骤03:配置MMC,选择“文件”|“添加/删除管理单元”,如图16-48所示。 图16-48  配置MMC 步骤04:在“可用的管理单元”中选择“证书”,单击“添加”,单击“确定”,如图 16-49所示。 图16-49  添加MMC的管理单元 Linux 网络安全技术与实现 (第 版) 2 09 10 11 12 13 14 15 16 486 步骤 05 :选择“计算机帐户”,单击“下一步”,如图16-50所示。 图16-50  设置“计算机帐户”的管理单元 步骤 06 :选择“本地计算机”,单击“完成”,如图16-51所示。 图16-51  设置“本地计算机”的管理单元 步骤 07 :完成MMC工具的证书管理配置,单击“确定”,如图16-52所示。 图16-52  完成MMC工具的证书管理配置 第 章   VPN L2TP Over IPSec 16 09 10 11 12 13 14 15 16 487 : 步骤08:配置完成后的MMC管理界面,如图16-53所示。 图16-53  配置完毕后的MMC管理界面 2. 导入“计算机”及“CA”的证书 在配置完MMC工具后,接下来导入计算机证书及CA证书,步骤如下。 步骤01:选择“控制台根节点”|“证书”|“个人”,右击“个人”|“所有任 务”|“导入”,如图16-54所示。 图16-54  导入计算机证书界面 步骤02:单击“下一步”导入计算机证书,如图16-55所示。 步骤03:单击“浏览”按钮,指定证书的路径和文件名,如图16-56所示。 Linux 网络安全技术与实现 (第 版) 2 09 10 11 12 13 14 15 16 488 图16-55  进行计算机证书的导入操作 图16-56  设置证书所在的路径及文件名 步骤 04 :输入保护client.p12文件的密码,单击“下一步”,如图16-57所示。 步骤 05 :选 择 证 书 的 存 储 位 置 , 这 里 请 选 择 “ 个 人 ” , 单 击 “ 下 一 步 ” , 如 图 1 6 - 5 8 所 示 。 图16-57  输入证书的导入密码 图16-58  设置证书所要导入的位置 步骤 06 : 单 击 “ 完 成 ” , 完 成 证 书 的 导 入 , 如图16-59所示。 步骤 07 : 计 算 机 的 证 书 导 入 完 成 之 后 , 接 下 来 就 是 导 入 C A 的 证 书 , 请 选 择 “ 控 制 台 根 节 点 ” | “ 证 书 ( 本 地 计 算 机 ) ” | “ 受 信 任 的 根 证 书 颁 发 机 构 ” | “ 证 书 ” , 右 击 选 择 “ 证 书 ” | “ 所 有 任 务 ” | “ 导 入 ” , 如 图16-60所示。 图16-59  完成“导入”操作 第 章   VPN L2TP Over IPSec 16 09 10 11 12 13 14 15 16 489 : 图16-60  导入CA证书 步骤08:单击“下一步”,进行CA证书的导入操作,如图16-61所示。 步骤09:单击“浏览”按钮,指定CA证书的路径及文件名,单击“下一步”,如图16-62所示。 图16-61  进行CA证书的导入操作 图16-62  设置CA证书的路径及文件名 步骤10:选择证书的存储位置,请选择“受信任的根证书颁发机构”,接着单击“下一 步”,如图16-63所示。 步骤11:单击“完成”,完成证书的导入操作,如图16-64所示。 图16-63  配置CA证书的导入位置 图16-64  完成证书的导入操作 Linux 网络安全技术与实现 (第 版) 2 09 10 11 12 13 14 15 16 490 3. 在Windows 7系统中配置拨号网络 步骤 01 : 选 择 “ 开 始 ” | “ 控 制 面 板 ” | “ 网 络 与 共 享 中 心 ” | “ 设 置 新 的 连 接 或 网 络 ” , 如图16-65所示。 步骤 02 :选择“连接到工作区”,单击“下一步”,如图16-66所示。 图16-65  建立一个新的L2TP连接 图16-66  选择连接选项 步骤 03 : 选 择 新 建 的 L 2 T P 连 接 是 否 要 建 立 在 其 他 的 连 接 上 , 例 如 在 拨 号 L 2 T P 连 接 之 前 可 能 需 要 先 进 行 P P P O E 的 网 络 连 接 , 这 里 要 根 据 你 的 实 际 情 况 来 决 定 , 如 图 16-67所示。 步骤 04 : 在 这 个 示 例 中 , 我 们 选 择 使 用 已 有 的 因 特 网 连 接 来 进 行 L 2 T P 连 接 拨 号 , 如 图 16-68所示。 图16-67  设置网络连接类型 图16-68  设置网络连接方式 步骤 05 : 设 置 L 2 T P 服 务 器 的 网 络 地 址 及 新 建 立 的 L 2 T P 连 接 名 称 , 单 击 “ 下 一 步 ” , 如 图 16-69所示。 步骤 06 :设置L2TP拨号的帐户及密码,单击“连接”,如图16-70所示。 第 章   VPN L2TP Over IPSec 16 09 10 11 12 13 14 15 16 491 : 图16-69  设置L2TP服务器的IP及连接名称 图16-70  设置L2TP拨号的帐户及密码 步骤07:完成L2TP拨号网络的设置之后,我们就可以在网络连接功能表中看到新建立 的VPN连接,如图16-71所示。 步骤08:双击“VPN连接”图标,可以看到L2TP拨号界面,如图16-72所示。       图16-71  完成新建连接的操作            图16-72  L2TP的拨号界面 4. Windows 7拨号网络中的网关设置 如同在Windows XP一样,Windows 7拨号网络中同样存 在默认网关选项,如图16-73所示,在拨号网络的高级设置 中有一个“在远程网络上使用默认网关”的选项,这个选 项选择与否的差别,如图16-74及图16-75所示。 图16-73  拨号网络的默认网关 Linux 网络安全技术与实现 (第 版) 2 09 10 11 12 13 14 15 16 492 图16-74  没有选中“在远程网络上使用默认网关”选项 图16-75  选中“在远程网络上使用默认网关”选项 16.5 IPSec连接穿透NA T的问题 I P S e c 数 据 包 在 穿 越 N A T 时 会 遇 到 一 个 很 严 重 的 问 题 , 因 为 N A T 机 制 会 修 改 数 据 包 的 I P 及 T C P 或 U D P 包 头 内 容 , 而 I P S e c 为 了 确 保 数 据 包 的 安 全 性 , 也 会 逐 一 检 查 每 个 I P S e c 的 数 据 包 , 一 旦 数 据 包 内 容 ( 包 含 包 头 ) 有 任 何 变 动 , 这 些 数 据 包 就 会 被 I P S e c 机 制 丢 弃 , 所 以 I P S e c 数 据 包 是 无 法 穿 越 N A T 的 。 但 如 果 真 是 这 样 , 那 I P S e c 在 使 用 上 将 受 到 严 重 限 制 , 幸 运 的 是 在 大 家 的 努 力 下 , I P S e c 协 议 终 于 可 以 穿 越 N A T 了 , 这 项 技 术 规 范 是 在 r f c 3 9 4 7 中 定 义 的 , 称 为 “ N A T - T r a v e r s a l ” , 简 称 为 N A T - T 。 那 N A T - T 到 底 是 如 何 让 I P S e c 数 据 包 可 以 穿 越 N A T 的 呢?这里以图16-76及图16-77为例来说明。 第 章   VPN L2TP Over IPSec 16 09 10 11 12 13 14 15 16 493 : 图16-76  非NAT-T的IPSec数据包结构 图16-77  NAT-T的IPSec数据包结构 从以上两个IPSec数据包的结构图,我们可以很清楚看到图16-77中在ESP及IP包头之间 多了一个UDP包头,这是IPSec数据包可以穿越NAT的关键之处。当IPSec数据包有了这个 UDP包头之后,IPSec数据包再穿越NAT主机时,NAT主机便可以修改IP包头及UDP包头的内 容,但IPSec数据包的接收端并不会检查IP包头及UDP包头的内容,因而使得IPSec数据包可 以正常穿越NAT主机。 那我们要如何在racoon下启用NAT-T的功能呢?以图16-78及配置文件为例,可以看到racoon 的配置文件与以前的内容并无太大差异。主要差别在第5行到第16行及第20行,其中第9行及第10 行的IP是L2TP服务器在因特网的公网IP,除此之外,其他设置步骤与之前的示例完全相同。 图16-78  NAT-T示例 1 path include "/etc/racoon"; 2 path pre_shared_key "/etc/racoon/psk.txt"; 3 path certificate "/etc/racoon/certs"; Linux 网络安全技术与实现 (第 版) 2 09 10 11 12 13 14 15 16 494 4 l o g d e b u g ; 5 t i m e r { 6 n a t t _ k e e p a l i v e 1 0 s e c ; 7 } 8 l i s t e n { 9 i s a k m p 1 0 . 1 0 . 1 5 . 4 0 [ 5 0 0 ] ; 1 0 i s a k m p _ n a t t 1 0 . 1 0 . 1 5 . 4 0 [ 4 5 0 0 ] ; 1 1 } 1 2 p a d d i n g { 1 3 m a x i m u m _ l e n g t h 2 0 ; 1 4 r a n d o m i z e o f f ; 1 5 s t r i c t _ c h e c k o f f ; 1 6 e x c l u s i v e _ t a i l o f f ; 1 7 } 1 8 r e m o t e a n o n y m o u s { 1 9 e x c h a n g e _ m o d e m a i n , a g g r e s s i v e ; 2 0 n a t _ t r a v e r s a l o n ; 2 1 g e n e r a t e _ p o l i c y o n ; 2 2 c e r t i f i c a t e _ t y p e x 5 0 9 " c e r t . p e m " " k e y . p e m " ; 2 3 v e r i f y _ c e r t o n ; 2 4 v e r i f y _ i d e n t i f i e r o n ; 2 5 m y _ i d e n t i f i e r a s n 1 d n ; 2 6 p e e r s _ i d e n t i f i e r a s n 1 d n ; 2 7 p r o p o s a l { 2 8 e n c r y p t i o n _ a l g o r i t h m 3 d e s ; 2 9 h a s h _ a l g o r i t h m s h a 1 ; 3 0 a u t h e n t i c a t i o n _ m e t h o d r s a s i g ; 3 1 d h _ g r o u p m o d p 1 0 2 4 ; 3 2 } 3 3 } 3 4 s a i n f o a n o n y m o u s { 3 5 l i f e t i m e t i m e 1 h o u r ; 3 6 e n c r y p t i o n _ a l g o r i t h m 3 d e s ; 3 7 a u t h e n t i c a t i o n _ a l g o r i t h m h m a c _ s h a 1 ; 3 8 c o m p r e s s i o n _ a l g o r i t h m d e f l a t e ; 3 9 } 16.6 小结 除 了 以 I P S e c 为 基 础 的 V P N 技 术 之 外 , L 2 T P 也 是 业 界 常 用 来 构 建 V P N 的 技 术 。 本 章 完 整 介 绍 了 L 2 T P 技 术 , 同 时 也 说 明 了 该 如 何 通 过 I P S e c 来 保 护 不 安 全 的 L 2 T P 协 议 。 本 章 旨 在 帮 助 你 了 解 如 何 让 W i n d o w s 系 统 与 L i n u x 的 V P N 服 务 器 建 立 起 安 全 的 通 信 环 境 , 以 防 止 非 法 的 网 络 监听行为,保障企业的通信安全。

下载文档,方便阅读与编辑

文档的实际排版效果,会与网站的显示效果略有不同!!

需要 10 金币 [ 分享文档获得金币 ] 0 人已下载

下载文档

相关文档