这时,R1也无法telnet R3 这可不是我们所希望的结果。那为什么会产生这种结果呢?这是因为R1向R3发起telnet请求时,是R1的一个随机端口与R3的23号端口通信。R3收到这个请求后,再用自己的23号端口向R1的随即端口回应。在这个例子中,R1向R3的请求,R3可以收到。但当R3向R1回应时,却被R2上的ACL阻止了。因为R2的ACL的作用是阻止R3向R1的所有TCP连接。这个TCP回应也就被阻止掉了,所以就间接的造成了R1无法telnet到R3.
: Q& ~# S. o3 r$ b# z! f! G% q x综上所述,在R2上用扩展访问列表可以阻止R3主动向R1发起的TCP连接。但也阻止了R3被动向R1发的TCP回应。这是不合题意的。因此就目前而言,扩展访问列表无法满足这个需求。于是就引出了一个新型的访问列表―――自反访问控制列表。
: l! y8 P+ `7 y) m% w4 C* B3 用自反访问列表解决此问题, F' R" L4 E% i0 T, o4 }
注意:因为自反列表只能建立在命名访问控制列表中,所以这里只能用命名控制列表; g6 X5 N& r2 J( v8 Z
r2#sh ip access-lists' f, x, T: h0 M7 A
Reflexive IP access list REF$ }6 n1 [& }& N
触发的自反列表项,匹配自反列表后自动产生
5 o+ a, p6 d; b- c) e k, ?Extended IP access list REFIN
+ v# i1 O9 A) ~, r$ v9 @8 qdeny tcp host 23.0.0.3 host 12.0.0.1+ w. o; g! `1 i- i( q7 Z
permit ip any any
8 V" g* R1 c& O# r7 U& @evaluate REF/ v# c5 E! E, h8 E* D9 |7 T& i
根据上面的自反列表项执行/ m2 Q5 B7 e4 Z" n
Extended IP access list REFOUT
+ B5 D' R" @$ q0 s( w' m0 tpermit ip any any reflect REF
7 p: \" @+ V ~# W7 t建立自反列表- a, [2 ]/ o+ Y+ y; k
r2(config)#int s2/2
$ G5 M: k7 C/ S0 z+ X' o7 Pr2(config-if)#ip access-group REFIN in
/ \& f1 g! R6 C3 ~在进方向调用列表REFIN
; l5 M& e* S1 ?r2(config-if)#ip access-group REFOUT out$ c8 g# [: _$ c
/在出方向调用列表REFOUT8 p- }7 b; ~! ?; v
下面进行检验7 v0 M# z& i1 |& Z- M+ w
r3#telnet 12.0.0.1
. E( s U% L/ R5 w# i- _% a U0 `Trying 12.0.0.1 ...
6 Q7 T: C4 I' O9 Q2 HDestination unreachable; gateway or host down
- N" z4 B7 G% a0 d# J; UR3无法登陆R1,这一步成功。再到R1上验证
8 [7 L8 l/ `; o' j2 G& x5 xr1#telnet 23.0.0.3
* m4 F* {# K+ i8 eTrying 23.0.0.3 ...' [5 g _$ x' P, K. L- h8 s, L
Connection timed out; remote host not responding
: B0 w" s9 L4 P% `! j5 oR1也无法登陆R3,这个需求失败了,我们到R2上查看一下ACL
. Y2 c1 E( g5 e- D6 k" Dr2#sh ip access-lists$ R# \1 l5 E% B7 r2 q! K
Reflexive IP access list REF( K; G& P& n5 \: {% o6 J% ^
permit tcp host 23.0.0.3 eq telnet host 12.0.0.1 eq 11013 (5 matches) (time left 285)# C% g0 Y. d$ R* R) F6 r; k3 H) K
Extended IP access list REFIN- O# p3 ~! @4 A! u3 d
deny tcp host 23.0.0.3 host 12.0.0.1 (18 matches)
! l) E, C- b, }/ R; k; P) Ypermit ip any any (150 matches): X0 O; V0 E) W% J! J$ P
evaluate REF
6 ^: R* }* b1 e; A+ eExtended IP access list REFOUT1 V O( { @/ d e! w( h$ ]8 @, M
permit ip any any reflect REF (5 matches)9 Y; r0 H- q0 s& p
( I! ^6 Z0 G* o( a
; j2 M; J5 O1 r8 H. N! }
让我们仔细的分析一下这个过程,当R3登陆R1时,R2 in 方向的REFIN 列表的第一条语句 deny tcp host 23.0.0.3 host 12.0.0.1 起了作用,因此登陆失败。
' i) T- ?, Q" w- o" Q当R1登陆R3时,R1先向R3发起TCP请求,当这个请求数据包从R2的S2/2接口出来时匹配了REFOUT 列表的permit ip any any reflect REF 的这条语句。并触发了一条自反项。
" x! t5 a4 I- ~2 I我们可以看到permit tcp host 23.0.0.3 eq telnet host 12.0.0.1 eq 11013 (5 matches) (time left 285) 这个自反项是由于触发自动产生的。它的意思是允许R3用自己的23端口对R1向自己发出的telnet请求作出回应,这个回应向R1的随机端口11013发出。我开始看到产生了这个自反项,就觉得R1应该能成功登陆R3.但事实并不是如此。这是因为虽然产生了这条自反项,但要使数据包按照这个自反项来走,还需要匹配 evaluate REF 这条语句。而这条语句是建立在列表REFIN 中。当R3向R1的回应数据包到达R2时先要匹配列表REFIN .这时我们可以看到这个数据包直接匹配上了deny tcp host 23.0.0.3 host 12.0.0.1 这条语句,而不再匹配下面的语句了。所以它就被直接拒绝了。evaluate REF 这条语句在这里实际上被架空了因此 控制列表语句的顺序是至关重要的。 |