这时,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.
) r0 [1 n4 e* O) }4 N9 X# ~综上所述,在R2上用扩展访问列表可以阻止R3主动向R1发起的TCP连接。但也阻止了R3被动向R1发的TCP回应。这是不合题意的。因此就目前而言,扩展访问列表无法满足这个需求。于是就引出了一个新型的访问列表―――自反访问控制列表。
( M3 D+ |7 I L& t7 B" ^$ G: x3 用自反访问列表解决此问题# E( b. \$ g+ } H1 M2 A
注意:因为自反列表只能建立在命名访问控制列表中,所以这里只能用命名控制列表2 s( s" h4 I" j2 c' b" B' h
r2#sh ip access-lists
" v$ u; x7 o# N) E3 U) C& lReflexive IP access list REF+ o. C4 G, E* ~! z0 Y
触发的自反列表项,匹配自反列表后自动产生
2 v5 G f4 ?0 y# \ YExtended IP access list REFIN
7 i4 B5 W. Z, W# E% {5 [/ Wdeny tcp host 23.0.0.3 host 12.0.0.12 ^0 w' A9 L! Y4 `3 Q; P# W7 J
permit ip any any6 X; A u0 z9 P2 D' |" A. V
evaluate REF8 u; @5 q" b0 b3 b) Q
根据上面的自反列表项执行# C5 V% a: p/ {, `
Extended IP access list REFOUT
" t9 \; V1 V- Npermit ip any any reflect REF5 _- }+ }( d8 ?# y2 @
建立自反列表
8 t6 {, N% }( H5 Q% [- H9 er2(config)#int s2/2
6 S9 m3 H- y) K* _! P+ ?/ R+ r' wr2(config-if)#ip access-group REFIN in1 Z, y+ J2 h% |5 j8 S- Q) i
在进方向调用列表REFIN2 i0 G. I# h" Z+ i6 v. I
r2(config-if)#ip access-group REFOUT out
% I% @- G# B: [: {/在出方向调用列表REFOUT" P# H6 ~0 N/ \; H! E) \
下面进行检验
" H0 a! D3 I& l" i2 Q0 f' m2 xr3#telnet 12.0.0.1
M4 R, {% h" Y0 tTrying 12.0.0.1 ...7 w/ l' g. \ I# D0 j
Destination unreachable; gateway or host down7 k8 T; e& Z* [: v' n( P- `
R3无法登陆R1,这一步成功。再到R1上验证
/ L: P, q) R9 ^# e3 ]5 i% n, g2 Nr1#telnet 23.0.0.3
' d) z7 a) s% FTrying 23.0.0.3 ...
b( K4 d+ i. x1 _Connection timed out; remote host not responding
, c8 k+ @2 H9 ?3 V) Z% BR1也无法登陆R3,这个需求失败了,我们到R2上查看一下ACL
* b# I6 `/ M6 d, x b4 B. c5 `" Cr2#sh ip access-lists, B7 ]$ y$ R! L3 W+ ^9 H8 k
Reflexive IP access list REF
( h- W+ g; g9 A0 e* J% u, g0 K0 tpermit tcp host 23.0.0.3 eq telnet host 12.0.0.1 eq 11013 (5 matches) (time left 285)
# a9 k+ P# W8 Z7 B: X8 z6 yExtended IP access list REFIN
' ?8 [# R+ Z; x7 _$ x* hdeny tcp host 23.0.0.3 host 12.0.0.1 (18 matches)8 x' G$ h$ w# c) i/ e, g
permit ip any any (150 matches)
1 X; M) t6 k0 b4 t* j5 hevaluate REF* M& J/ E2 q8 h4 o* U0 E9 R! M4 _
Extended IP access list REFOUT
[( h, W/ I* ~0 c7 P' n4 L0 @permit ip any any reflect REF (5 matches)
' |9 N: K f! R9 e! \4 n2 B
% g6 x, t0 G2 d L+ _: S' w2 ^0 W3 Y2 G/ |1 ]
让我们仔细的分析一下这个过程,当R3登陆R1时,R2 in 方向的REFIN 列表的第一条语句 deny tcp host 23.0.0.3 host 12.0.0.1 起了作用,因此登陆失败。
7 w' s5 q8 e! }2 U/ w4 D: Z+ z当R1登陆R3时,R1先向R3发起TCP请求,当这个请求数据包从R2的S2/2接口出来时匹配了REFOUT 列表的permit ip any any reflect REF 的这条语句。并触发了一条自反项。
4 a' v% |' \# ?+ w& F8 H我们可以看到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 这条语句在这里实际上被架空了因此 控制列表语句的顺序是至关重要的。 |