Category Archives: 走向CCIE之路-Security

10年CCIE纪念,反思及展望

CCIE 10 years
CCIE #17564 Kang Liu

前几天考完了CCIE的笔试做重认证,今天登陆CCIE portal看到可以使用这个可以给“老人”用的新的logo了。是啊,已经10年了……

又读了一遍10多年前写的那一系列文章:

从2005年开始定了目标,2006-2007年一共考了2个笔试,4次lab,最终拿到了2个CCIE认证。那时候除了每天的日常工作和网络改造项目可以作为实践准备之外,又花了上千小时的时间去学习和做实验。

看着那些文章,回忆起来10年前的那一段学习和考试的经历就好像一段梦一样,那时候可以很专注的学习、练习,即使中途遇到了失败和挫折也能很快爬起来继续努力。

拿到CCIE认证只是努力之后结果,10年之后再回忆起来,我真的很享受那个学习和准备的过程,有谁不愿意能专注的去完成好一件自己喜欢去做的而且自己又觉得有意思的事情呢?

10年之后的我,工作和10年前几乎完全不同了。现在的工作是产品经理,产品经理更多的要解决的是人的问题。相对于人的问题,技术问题通常更容易解决吧!不过不可否认,技术背景对我现在的工作还是非常有帮助的——能理解客户和研发讲的那些技术术语,能更清楚的了解并沟通客户的需求(只要时间足够并且目标已经达到了,想谈产品就谈产品,想谈技术就谈技术,我才不绕圈呢),甚至偶尔还可以给研发讲讲某个技术到底是怎么回事(其实除了“老技术”之外,很多新技术我也是被问到了才现学的,但是有了之前的知识储备,我理解的就能比你快,而且也有信心给你讲明白,嘿嘿)。

嘚瑟和纪念的话就写这么多,再写下一些反思和展望。

以前在准备CCIE的时候,曾经在NetPro论坛上看到过这样的一段话,也写下了 Be a real CCIE这个帖子

In most situations, when someone obtain a CCIE, it tells me that person is willing to go through the pain and sacrifice to obtain this achievement and therefore, deserve a lot of my respect

10年前的我,也许没有完全理解这段话,或多或少的只关注到了那些技术和所谓pain and sacrifice。

现在再反思一下10年前的那段经历,除去学习知识之外,更多的是自己主动的走出了所谓的”舒适区/comfort zone”,去挑战自我并创造了更多更大的机会。

10年之前的我想不到10年之后现在自己做的这份工作。再过10年的我呢? CCIE 10年只是个开始,写篇文章小小的记录和庆祝一下,再出发吧!

解决了一个困扰已久的CBAC的问题

虽然以前在生产网上就用过CBAC,但是对于inspect http和inspect ftp某些具体的行为还是有些不清楚,夜里下定决心一定要做实验弄明白。
实验前提:inspect http或者inspect ftp如果用在边界路由器连接ISP的接口出向,并且同时有访问控制列表用在该接口的入向,并且该acl不包含明确允许返回流量的条目(如:permit tcp any any或者permit ip any any)
在netlab上实验的结果得到下面2个结论:
1. inspect http和inspect ftp等使用时不需要与inspect tcp同时使用:既一旦使用了inspect http或者inspect ftp,那么对应的协议的返回流量会自动被允许。当然,需要是标准的服务端口,如果不是的话,需要手动设置PAM映射。
2. inspect http后面的java-list如果不使用的话,则所有内部访问外部的流量中的java applet都会被过滤,但是同一个页面中的其他内容(文字、图片等)不会受到影响。
之前看到很多文档都没有明确说明这点,有些文档甚至说不写java-list就不会过滤java applet。我做实验的结论是如果只写ip inspect name 并且应用到接口的话,所有的java applet都会被过滤!
*使用debug ip inspect http和debug ip inspect ftp可以看到等详细的连接检查过程。
据说CBAC这种IOS防火墙的功能是靠纯软件完成的,开启了之后会影响设备的性能。我曾经在某个Cisco高端设备上尝试CBAC功能,流量在几百兆的时候CPU基本上被占满了,设备几乎不响应。因此上述实验不推荐在任何生产设备上做!

Still on the way

penguin-writing.jpg9-11那天去考了安全的lab,感觉题目内容有些地方比较变态,但是整体看来还算是合理。

晚上得到的结果是76分,没能通过,虽然只需要再对一个题目就能pass。不过有些部分的得分低于我的预期了。也许确实是有些知识上的缺陷,也许我做的答案和所谓的标准答案有区别。深夜的时候提交了reread,我觉得自己对题目的理解和作答都是合理的,至于考官会怎么理解我的答案那就不知道了……据说整个reread过程需要3周,等3周之后再看了。

不论怎样对技术的学习和追求将一直继续下去。

Cisco IP Phone voice vlan与port-security的问题

由于订购的IP Phone迟迟没有到货,没法自己做实验检验在配置voice vlan的接口上如何同时配置port security。网上有些文档说需要将连接Cisco IP Phone的交换机接口最大mac数目设置成至少3个,有的说设置成至少2个,但是都没有给出明确的原因,让人不知道该怎么办。
晚上在Cisco的网站上逛,看到了一篇文档Cisco Unified Communications SRND Based on Cisco Unified CallManager 5.x (需要CCO)
Voice Security章节里面有下面一段话:
Either port security or dynamic port security can be used to inhibit a MAC flooding attack. A customer with no requirement to use port security as an authorization mechanism would want to use dynamic port security with the number of MAC addresses appropriate to the function attached to a particular port. For example, a port with only a workstation attached to it would want to limit the number of learned MAC addresses to one. A port with a Cisco Unified IP Phone and a workstation behind it would want to set the number of learned MAC addresses to two (one for the IP phone itself and one for the workstation behind the phone) if a workstation is going to plug into the PC port on the phone. This setting in the past has been three MAC addresses, used with the older way of configuring the port in trunk mode. If you use the multi-VLAN access mode of configuration for the phone port, this setting will be two MAC addresses, one for the phone and one for the PC plugged into the phone. If there will be no workstation on the PC port, then the number of MAC addresses on that port should be set to one. These configurations are for a multi-VLAN access port on a switch. The configuration could be different if the port is set to trunk mode (not the recommended deployment of an access port with a phone and PC).
看过之后明白了——通常在交换机上端口上设置voice vlan有两种办法:
(1) Switch(config-if)#switchport trunk encapsulation dot1q
Switch(config-if)#switchport trunk native vlan id !— This is the VLAN with untagged frames used by the PC.
Switch(config-if)#switchport mode trunk !— This enables trunking on the port for two VLANs, data and voice.
Switch(config-if)#switchport voice vlan id
Switch(config-if)#spanning-tree portfast trunk
(2)
interface Fa0/1
 switchport access vlan data vlan id
 switchport mode access
 switchport voice vlan voice vlan id
 spanning-tree portfast
第一种配置方法是比较老式的,并且按照文档上说,不推荐在PC和phone同时使用的时候用这样的配置模式。在使用第一种配置方式的时候,电话的MAC会出现在voice vlan和native vlan中,因此算上PC需要占用至少3个MAC;

第二种配置方法被称为“multi-VLAN access port”模式。在这样的情况下电话的MAC只会出现在voice vlan中,因此只需要2个MAC。

其实在Cisco的交换机中内置了一些已经写好的非常好用的macro,可以很方便我们直接配置特定类型的端口。比如cisco-phone这个宏:
C3750#show parser macro name cisco-phone
Macro name : cisco-phone
Macro type : default interface
# Cisco IP phone + desktop template

# macro keywords $access_vlan $voice_vlan

# VoIP enabled interface – Enable data VLAN
# and voice VLAN
# Recommended value for access vlan should not be 1
switchport access vlan $access_vlan
switchport mode access

# Update the Voice VLAN value which should be
# different from data VLAN
# Recommended value for voice vlan should not be 1
switchport voice vlan $voice_vlan

# Enable port security limiting port to a 2 MAC
# addressess — One for desktop on data vlan and
# one for phone on voice vlan
switchport port-security
switchport port-security maximum 2

# Ensure port-security age is greater than one minute
# and use inactivity timer
switchport port-security violation restrict
switchport port-security aging time 2
switchport port-security aging type inactivity

# Enable auto-qos to extend trust to attached Cisco phone
auto qos voip cisco-phone

# Configure port as an edge network port
spanning-tree portfast
spanning-tree bpduguard enable

需要使用的时候接口模式调用即可:
C3750(config-if)#macro apply cisco-phone $access_vlan 20 $voice_vlan 80
C3750(config-if)#do sh run int g1/0/1
Building configuration…

Current configuration : 573 bytes
!
interface GigabitEthernet1/0/28
 switchport access vlan 20
 switchport mode access
 switchport voice vlan 80
 switchport port-security maximum 2
 switchport port-security
 switchport port-security aging time 2
 switchport port-security violation restrict
 switchport port-security aging type inactivity
 srr-queue bandwidth share 10 10 60 20
 srr-queue bandwidth shape  10  0  0  0
 queue-set 2
 mls qos trust device cisco-phone
 mls qos trust cos
 macro description cisco-phone
 auto qos voip cisco-phone
 spanning-tree portfast
 spanning-tree bpduguard enable
end

Cisco Tacacs+ Shell Command Authorization

具体怎么做shell command authorization不写了,遍地都是文档,记录一个经常被忽略的问题。

其实在cisco关于ACS的文档上写的很清楚,我们输入到设备上的命令并不一定是按照原样吐给ACS服务器去进行命令授权验证的。

Cisco文档中的例子,用户输入“interface FASTETHERNET 0/1”,吐给ACS服务器的命令和参数实际上是“interface FastEthernet 0 1”。实际上并不只是大小写变化和去掉"/"这么简单,如果打开"debug aaa authorization",我们可以看到设备吐出的实际命令。

几个有意思的实验:

1.执行copy startup flash:
输出入下:
时间: AAA: parse name=tty66 idb type=-1 tty=-1
时间: AAA: name=tty66 flags=0x11 type=5 shelf=0 slot=0 adapter=0 port=66 channel=0
时间: AAA/MEMORY: create_user (0x83CE97C0) user=’sec’ ruser=’Router’ ds0=0 port=’tty66′ rem_addr=’10.0.1.2′ authen_type=ASCII service=NONE priv=15 initial_task_id=’0′, vrf= (id=0)
时间: tty66 AAA/AUTHOR/CMD(712228085): Port=’tty66′ list=’acs’ service=CMD
时间: AAA/AUTHOR/CMD: tty66(712228085) user=’sec’
时间: tty66 AAA/AUTHOR/CMD(712228085): send AV service=shell
时间: tty66 AAA/AUTHOR/CMD(712228085): send AV cmd=copy
时间: tty66 AAA/AUTHOR/CMD(712228085): send AV cmd-arg=startup-config
时间: tty66 AAA/AUTHOR/CMD(712228085): send AV cmd-arg=flash:c2600-jk9o3s-mz.123-22.bin
时间: tty66 AAA/AUTHOR/CMD(712228085): send AV cmd-arg=flash:123
时间: tty66 AAA/AUTHOR/CMD(712228085): send AV cmd-arg=<cr>
时间: tty66 AAA/AUTHOR/CMD(712228085): found list "acs"
时间: tty66 AAA/AUTHOR/CMD(712228085): Method=tacacs+ (tacacs+)
时间: AAA/AUTHOR/TAC+: (712228085): user=sec
时间: AAA/AUTHOR/TAC+: (712228085): send AV service=shell
时间: AAA/AUTHOR/TAC+: (712228085): send AV cmd=copy
时间: AAA/AUTHOR/TAC+: (712228085): send AV cmd-arg=startup-config
时间: AAA/AUTHOR/TAC+: (712228085): send AV cmd-arg=flash:c2600-jk9o3s-mz.123-22.bin
时间: AAA/AUTHOR/TAC+: (712228085): send AV cmd-arg=flash:123
时间: AAA/AUTHOR/TAC+: (712228085): send AV cmd-arg=<cr>
可以注意要送到ACS上进行授权的命令是copy,命令参数有3个,分别是startup-config(自动补齐)、flash:(2个flash中已经有的文件自动列出都作为参数送出)、<cr>(换行)
如果用ACS授权允许,则可以将命令参数写为"permit ^startup-config flash:"

2.执行copy start tftp:
过程如下:
Router#copy startup-config tftp://1.1.1.1
时间: AAA: parse name=tty66 idb type=-1 tty=-1
时间: AAA: name=tty66 flags=0x11 type=5 shelf=0 slot=0 adapter=0 port=66 channel=0
时间: AAA/MEMORY: create_user (0x8392F428) user=’sec’ ruser=’Router’ ds0=0 port=’tty66′ rem_addr=’10.0.1.2′ authen_type=ASCII service=NONE priv=15 initial_task_id=’0′, vrf= (id=0)
时间: tty66 AAA/AUTHOR/CMD(3197202628): Port=’tty66′ list=’acs’ service=CMD
时间: AAA/AUTHOR/CMD: tty66(3197202628) user=’sec’
时间: tty66 AAA/AUTHOR/CMD(3197202628): send AV service=shell
时间: tty66 AAA/AUTHOR/CMD(3197202628): send AV cmd=copy
时间: tty66 AAA/AUTHOR/CMD(3197202628): send AV cmd-arg=startup-config
时间: tty66 AAA/AUTHOR/CMD(3197202628): send AV cmd-arg=<cr>
时间: tty66 AAA/AUTHOR/CMD(3197202628): found list "acs"
时间: tty66 AAA/AUTHOR/CMD(3197202628): Method=tacacs+ (tacacs+)
时间: AAA/AUTHOR/TAC+: (3197202628): user=sec
时间: AAA/AUTHOR/TAC+: (3197202628): send AV service=shell
时间: AAA/AUTHOR/TAC+: (3197202628): send AV cmd=copy
时间: AAA/AUTHOR/TAC+: (3197202628): send AV cmd-arg=startup-config
时间: AAA/AUTHOR/TAC+: (3197202628): send AV cmd-arg=<cr>
比较有意思的是tftp及后面url中所带的内容都没有被送到ACS上,而仅仅送了一个<cr>过去。我对此的理解是路由器无法事先登录到远端的服务器(tftp)上来列出更多的参数,因此直接送出<cr>替代。

3.执行copy tftp: null:
命令的含义是从tftp服务器上复制一个文件直接送到null文件系统(实际上是直接丢弃),可以用来测试tftp服务器是否能连接上。
过程如下:
Router#copy tftp: null:
时间: AAA: parse name=tty66 idb type=-1 tty=-1
时间: AAA: name=tty66 flags=0x11 type=5 shelf=0 slot=0 adapter=0 port=66 channel=0
时间: AAA/MEMORY: create_user (0x83973290) user=’sec’ ruser=’Router’ ds0=0 port=’tty66′ rem_addr=’10.0.1.2′ authen_type=ASCII service=NONE priv=15 initial_task_id=’0′, vrf= (id=0)
时间: tty66 AAA/AUTHOR/CMD(674610135): Port=’tty66′ list=’acs’ service=CMD
时间: AAA/AUTHOR/CMD: tty66(674610135) user=’sec’
时间: tty66 AAA/AUTHOR/CMD(674610135): send AV service=shell
时间: tty66 AAA/AUTHOR/CMD(674610135): send AV cmd=copy
时间: tty66 AAA/AUTHOR/CMD(674610135): send AV cmd-arg=<cr>
时间: tty66 AAA/AUTHOR/CMD(674610135): found list "acs"
时间: tty66 AAA/AUTHOR/CMD(674610135): Method=tacacs+ (tacacs+)
时间: AAA/AUTHOR/TAC+: (674610135): user=sec
时间: AAA/AUTHOR/TAC+: (674610135): send AV service=shell
时间: AAA/AUTHOR/TAC+: (674610135): send AV cmd=copy
时间: AAA/AUTHOR/TAC+: (674610135): send AV cmd-arg=<cr>
可以看到由于tftp和null都没有办法直接通过设备访问到,没法列出更具体的参数,即无法补齐,因此送到ACS的命令仅仅是命令copy和参数<cr>。

4.是否所有的带有":"的都会被当作<cr>直接送给ACS呢?在2600系列路由器上测试之后的结论是nvram: system: flash: 会将所有的文件作为参数的一部分自动补齐送给ACS作授权。我推测在其他的设备上类似的disk0: disk1:之类实际上可以被直接访问到的存储设备也都会将设备内的文件作为参数补齐自动送到ACS上参数授权过程。

Typing while imaging~

连续几天都在做各种FW和VPN的实验。有了之前的路由和交换的知识作为基础,外加对ACL的理解,一段时间以来做实验都还算顺利。

发现做安全方面的实验和做路由方面的实验感觉不太一样——做安全实验的时在作配置的同时脑中似乎浮现出了一幅三维的网络拓扑图,不同的流量穿越不同的设备,走各种各样的路径;有些流量经过VPN的时候被转换成了ESP,穿过防火墙的时候acl似乎就是留给特定“形状”流量的一个一个小洞;不同的流量和不同的设备的颜色似乎也是不一样的。

不知道为什么会有这样的感觉,之前做路由和交换实验的时候,脑子里面确实也有图像,但是那只是网络的拓扑,在做安全实验的时候拓扑变成立体的了!

Penguin Run!