做网络这行的肯定绕不开Cisco ASA防火墙9.5(2)这个版本。它不像新平台那么抢眼但在中低端安全接入场景里稳定性和资料完整度绝对算得上老牌选手。很多兄弟接手一台设备翻来覆去就那几条命令可一旦要动NAT、ACL、双出口切换就容易乱。这篇我把自己在ASA 9.5(2)上做综合配置的完整套路整理出来从初始化到排错一次讲清适合刚接触ASA、以及想系统理一遍配置逻辑的兄弟参考。1. 综合配置前必须想清楚的设备定位与版本特性1.1 配置顺序为什么这么排接手任何一台ASA我从不急着敲命令先把配置顺序定下来。我的习惯一直是初始化、接口、路由、NAT、ACL、高可用、运维。这个顺序背后是有逻辑的不是随便排。接口是设备连通的基础没接口就没路由路由决定流量从哪个口进、哪个口出NAT负责地址转换转换完了ACL才能判断放不放行。如果反过来先写一堆ACL接口还没配好根本没法验证效果。更重要的是ASA的排错是分层的链路层通了、路由表正确了、xlate表出现了最后才轮得到ACL拦截。这个顺序能让你出问题时少走一半弯路每层单独验证很容易定位到底死在哪一步。1.2 ASA 9.5(2)的版本特性与常见坑9.5(2)这个版本在ASA整个产品线里属于承上启下的角色。它已经全面采用8.3之后的NAT新语法也就是object NAT加twice NAT这套模型同时保留了对老硬件平台的支持。相比更老的8.2版本NAT和ACL的行为差异很大如果你以前只玩过老版本接手9.5(2)一定要把脑子里那套旧命令清掉。这个版本有个很典型的坑ASDM管理界面的兼容性。9.5(2)对应的ASDM版本如果和浏览器JAVA版本不匹配经常会打开后白屏或者无法加载。我遇到好几次最后都是改用CLI操作。另外9.5(2)的许可证激活和后续版本不太一样新买的设备或者二手设备先看show version确认激活状态别等到业务配置完了才发现功能受限制。1.3 新手最容易犯的配置认知错误很多人第一次配ASA容易把它当成路由器来配。最典型的例子是在接口下直接挂ACL这在IOS路由器上可行但在ASA上行不通。ASA的ACL是全局定义的通过access-group绑定到具体接口和方向这个思路要转变过来。还有一个误区是NAT和ACL的关系。ASA的入站流量NAT转换和ACL检查是有先后顺序的ACL实际匹配的是NAT转换之后的地址也就是外部看到的地址。很多新手把ACL写在内部真实地址上结果外网怎么都访问不进来其实就是这一步没搞明白。这个细节后面实操部分我会再展开。2. 初始化准备与接口安全级别配置细节2.1 从零初始化控制台、管理通道与许可证激活新设备开箱第一件事通过console线连接波特率96008-N-1这个没什么可说的。进去之后先配置主机名、enable密码、管理接口地址。我习惯把管理地址放在独立接口如果条件不允许放在inside接口记得注意管理访问的ACL控制。管理通道优先开SSH顺带把ASDM的HTTPS也开好hostname ASA-GW enable password 你的enable密码 interface GigabitEthernet0/0 nameif inside security-level 100 ip address 192.0.2.1 255.255.255.0 no shutdown ! username admin password 你的账号密码 privilege 15 ssh 192.0.2.0 255.255.255.0 inside ssh version 2 http server enable http 192.0.2.0 255.255.255.0 inside许可证激活也是初始化阶段就要确认的。通过show version查看当前激活的license功能不足就要用activation-key命令补。ASA 9.5(2)的License分好几类常见的有新平台的功能授权和旧的型号级授权不同型号激活码不能混用买二手设备的时候这个坑尤其要小心。我经手的一台设备原本以为License齐全后来加做HA的时候才发现相应功能没开只能联系厂商重新申请一来一回耽误不少时间。2.2 接口命名与安全级别怎么定ASA和路由器最大区别之一就是接口要起功能性名字叫nameif。名字不只是好看它直接决定了安全级别和默认策略模型。我通常这么分配接口角色nameif安全级别用途外网口outside0接运营商或上联内网口inside100信任区办公网隔离区dmz50对外服务器安全级别的含义一定要吃透从高安全级别接口到低安全级别接口的流量默认放行反过来从低到高默认拒绝必须写ACL才能通。这就是ASA接口策略模型的核心。所以inside访问outside默认就能通不需要额外ACL而outside访问dmz或inside必须ACL放行。DMZ访问inside呢50到100属于从低到高默认也是拒绝的这就防止了服务器被攻破后横向入侵内部网络很合理。安全级别也可以自己定义但配色要克制别把边界搞没了。2.3 对象组与ACL的正确打开方式ACL本身不难难在维护。几十条甚至上百条ACL堆在一起时间一长谁都不知道哪条有用哪条多余。我在生产设备上从来不裸写ACL一律用对象组封装。object-group network INSIDE-LAN network-object 192.0.2.0 255.255.255.0 network-object 192.0.2.128 255.255.255.128 object-group network DMZ-SERVER network-object host 198.51.100.10 network-object host 198.51.100.11 access-list outside-in extended permit tcp object-group DMZ-SERVER any eq https access-list outside-in extended permit icmp any object-group DMZ-SERVER access-group outside-in in interface outside对象组的好处是后期加IP只需要改对象组一处ACL自动生效。生产环境变更少一次误操作风险就降一分。另外ACL是顺序匹配的我一般在前面放具体的permit语句后面放一个deny ip any any收尾逻辑清楚。注意9.5(2)里ACL默认自带隐式deny但那只是兜底我仍然建议显式写出来方便日志统计。3. 路由与双出口切换的配置实战3.1 双出口场景下的路由规划综合配置里最常见的就是双出口。一条运营商专线做主用一条做备份这种场景下路由规划的核心不是写路由而是让路由能根据链路质量自动切换。很多人图省事写两条默认路由了事ip route 0.0.0.0 0.0.0.0 203.0.113.1 ip route 0.0.0.0 0.0.0.0 203.0.113.129 10这条配置的坑在哪如果主用链路物理接口还是up的但运营商侧故障了比如对端光模块收光异常、上层路由问题ASA是感知不到的。两条默认路由都在路由表里流量可能走到备份链路也可能黑洞。这是教科书不会告诉你的残酷现实。3.2 静态路由与SLA联动实现主备切换9.5(2)提供的标准做法是SLA监控加track路由。SLA就是定时发探测报文探测不通就把主路由从路由表摘掉自动切到备份。sla monitor 1 type echo protocol ipIcmpEcho 203.0.113.1 interface outside frequency 5 sla monitor schedule 1 life forever start-time now track 1 rtr 1 reachability ip route 0.0.0.0 0.0.0.0 203.0.113.1 track 1 ip route 0.0.0.0 0.0.0.0 203.0.113.129 10这里有个参数选择问题。探测目标地址选什么优先选运营商给的下一跳地址因为那是最直接的链路存活验证。如果下一跳 ping 不通基本可以断定链路完蛋。频率我习惯设5秒太快会误判抖动太慢切换不灵敏5秒是个平衡点。SLA的timeout一般默认就行但上下两个参数要根据实际链路状况微调别拿默认值糊弄。切换验证也很重要。sh track能看到track状态变化路由表里主路由有没有掉。有一次我配置完了忘了写sla monitor schedule结果track一直unknown主路由永远不在表里整个业务全部走备份。这个命令太容易被漏掉了。3.3 路由协议与静态路由如何取舍有些场景需要跑OSPF比如ASA后面还挂着三层设备或者要跟核心交换机做路由互通。9.5(2)对OSPF的支持还算成熟基本配置如下router ospf 1 network 192.0.2.0 255.255.255.0 area 0 network 198.51.100.0 255.255.255.0 area 0 default-information originatedefault-information originate意思是把默认路由重分布进OSPF适用于ASA做出口设备让下游知道走ASA能出去。但我不建议在中小场景里为了炫技而上动态路由静态路由简单可靠排错也容易。动态路由引入了路由协议本身的问题比如区域划分、DR/BDR选举、度量值不一致这些对防火墙价值不大防火墙的核心是安全检查不是路由转发。4. NAT转换与策略放行的完整实操4.1 场景拓扑与配置目标说明我拿一个典型的项目场景来说明结构不复杂但覆盖了综合配置的大部分环节ASA有三个接口inside接办公网dmz接web服务器outside接两条运营商链路。目标有三个内网能上网、外网能通过公网地址访问DMZ里的web服务、DMZ服务器本身不能主动发起到内部的连接。这个场景下NAT使用两种方式内网访问外网用动态PAT外网访问DMZ服务器用静态映射。两条NAT规则各有各的注意点下面拆开讲。4.2 自动NAT实现内网上网内网PC上网是最基础的NAT需求。9.5(2)的object NAT写法很干净object network INSIDE-LAN subnet 192.0.2.0 255.255.255.0 nat (inside,outside) dynamic interfacedynamic interface表示动态转换到outside接口地址。为什么不写全局地址池因为出口地址经常会变尤其是拨号或DHCP获取的地址你写死一个池地址运营商重新分配一次就废了。绑定接口则可以一直跟随出口IP变化最省心。这里要强调一下版本差异。8.3之前的老命令是nat (inside) 1 192.0.2.0 255.255.255.0 加global池这套模型在9.5(2)里已经废除了。你如果在9.5(2)上拿老语法去查你会发现命令不存在这是很多从老版本转过来的兄弟最不习惯的地方。4.3 手动NAT实现服务器映射与特殊穿越外网要访问DMZ里的web服务器需要把内部地址映射成一个公网地址。这里分两种情况。第一种单独给服务器分配一个公网IP把内部地址静态一对一object network DMZ-WEB host 198.51.100.10 nat (dmz,outside) static 203.0.113.10这种写法适合有富余公网IP的场景服务器所有端口都暴露配置省事但安全上等于把整台机器裸奔在外面业务只需要80和443端口的话我不推荐。第二种更推荐只发布特定端口object network DMZ-WEB host 198.51.100.10 nat (dmz,outside) static interface service tcp www wwwstatic interface service tcp www www的含义是把内部主机的80端口静态映射到outside接口IP的80端口。如果你还有多个服务器都要发布可以用不同端口错开比如外网8080对应内部另一台主机的80端口object network DMZ-WEB2 host 198.51.100.11 nat (dmz,outside) static interface service tcp www 8080这条命令要单独解释一下它比普通static多了一层端口改写做端口复用的时候特别好用。对外只开必要端口主机其他服务不暴露这是安全的基本素养。4.4 ACL放行与NAT的配合关系NAT配完了不等于外网能访问。前面说过从低安全级别到高安全级别的流量默认拒绝所以outside访问DMZ必须写ACL而且要写在转换后的地址上。object network DMZ-PUB host 203.0.113.10 access-list outside-in extended permit tcp any object-group DMZ-SERVER eq www access-list outside-in extended permit tcp any object-group DMZ-SERVER eq https access-group outside-in in interface outside注意到没有ACL里的object-group DMZ-SERVER指向的是转换后的公网地址203.0.113.10不是内部地址198.51.100.10。因为ASA处理入站流量的时候会先根据NAT规则做转换再拿ACL去匹配转换后的结果。这点很多新手栽过跟头包括我当年也是排查到怀疑人生才发现ACL方向写反了。如果你用了static interface service这种端口映射那ACL里端口也要对应上。比如outside接口的8080映射到内部80ACL要permit tcp any host outside接口IP eq 8080。千万别写成eq www不然数据包会被ACL直接干掉。4.5 用packet-tracer验证整条链路配置完了不要急着说搞定先拿packet-tracer过一遍流量这是ASA排错的神器比翻日志强一百倍。packet-tracer input outside tcp 203.0.113.50 12345 203.0.113.10 80这条命令模拟一个公网地址访问映射后的web服务器。输出结果会展示每个阶段路由查找、NAT转换、ACL检查、xlate建立。哪一步drop就停在哪一步原因写得明明白白。我每次配完ACL和NAT无论多自信都会跑一遍packet-tracer这一步能挡掉90%的返工。还有一个细节packet-tracer模拟的流量不会真正发送出去只是查一遍数据面的逻辑。用它来验证ACL、NAT顺序、路由完全没有副作用这也是我推荐的原因。5. 日常运维与高可用配置要点5.1 高可用Failover双机配置综合配置如果不包含高可用只能算完成一半。ASA的Failover是一主一备用一条直连的心跳线同步配置和状态故障时自动切换。9.5(2)的配置不算复杂failover failover lan unit primary failover lan interface folink GigabitEthernet0/3 failover interface ip folink 192.168.100.1 255.255.255.0 standby 192.168.100.2备机也需要先配置基础信息然后通过failover接口把配置同步过去。这里有几个我踩过的坑心跳线一定要两台设备直连中间不要插交换机。插了交换机一旦交换机故障两台设备同时以为对方死了双双进入active状态那就是广播风暴加路由混乱场面非常难看。备机的接口命名必须跟主机一致比如主机叫outside备机对应接口也得叫outside否则配置同步不过来。我第一次配的时候备机少配了一个接口同步到一半报错只能从头再来。配置完用show failover确认状态正常会显示Primary/Secondaryactive/standby。如果显示active/active马上检查心跳线和配置。另外Failover同步的是运行配置你改完配置写入了吗不写memory重启后主备配置不一致这是低级错误但确实会发生。5.2 配置备份与版本升级注意事项备份配置这件事说起来简单但真到设备挂掉那天才知道有没有用。我至少每周做一次配置备份变更前也备份变更后必须再备份一版copy running-config tftp://你的TFTP服务器地址/ASA-GW-时间戳.cfg版本升级我在9.5(2)上也做过不少核心就一句话别跳版本。ASA升级讲究路径从很老的版本直接跳到9.5(2)可能会因为ASDM、bootloader、文件系统格式不匹配而失败。升级前先去官方路径页面确认你的机型支持哪些中间版本然后把镜像传到flash里设置boot system再把ASDM镜像也一并更新最后reload。全程建议通过console操作避免SSH中断导致设备变砖。升级前一定要保存当前配置升级过程中就算系统崩溃也能兜底。还有9.5(2)升级完记得检查show version和show asdm确认两个版本配套不然ASDM登录页会提示版本不匹配。5.3 常见故障排查速查表我把这几年经手ASA遇到的问题整理成一个速查表干活的时候直接对照现象排查路径处理手法内网无法上网1. 查路由表 2. 查xlate 3. 查NAT配置show ip route、show xlate、show run nat外网访问不了DMZ服务器1. 查NAT static 2. 查outside方向ACL 3. 用packet-tracer定位重点看ACL匹配转换后的公网地址主备切换后业务仍不通检查failover状态和心跳线show failover确认standby设备配置一致ASDM登录白屏检查ASDM版本和JAVA版本是否匹配更新ASDM或改用CLI操作配置保存后重启丢失确认是否执行write memory变更后必执行copy run start还有一个非常实用的排查技巧show conn在跑业务的时候看一眼能看到当前会话状态和转换关系。结合show xlate一起看基本能判断流量有没有做完NAT这一步。比什么都强。写在最后的个人体会Cisco ASA防火墙9.5(2)的配置说难也难说简单也简单。难在它有一套自己的逻辑NAT、ACL、接口安全级别这些概念跟路由器完全不是一个思路简单在只要你把顺序理顺、把原理吃透它其实相当稳定配置好了能默默跑好几年不用动。我个人的经验是每次配置前先花五分钟想清楚流量路径从源到目的会经过哪几个检查点再动手写命令这样出来的配置又稳又容易排错。千万别上来就复制粘贴网上的命令你不知道别人那条命令踩过什么坑。遇到问题先相信packet-tracer和show命令它们才是真正帮你定位的帮手。希望这篇能帮你把ASA 9.5(2)这块硬骨头啃下来。