自反访问列表的应用

 

试验说明:三台路由器串联,要求阻止R3对R1的远程访问(telnet),但只能在R2上做。R1可以对R3进行telnet登陆。

1 底层配置

R1

interface Serial2/1

ip address 12.0.0.1 255.255.255.0

router eigrp 90

network 12.0.0.0 0.0.0.255

no auto-summary

�D�D�D�D�D�D�D�D�D�D�D�D�D�D�D�D

R2

interface Serial2/1

ip address 12.0.0.2 255.255.255.0

interface Serial2/2

ip address 23.0.0.2 255.255.255.0

router eigrp 90

network 0.0.0.0

no auto-summary

�D�D�D�D�D�D�D�D�D�D�D�D�D�D�D�D

R3

interface Serial2/1

ip address 23.0.0.3 255.255.255.0

router eigrp 90

network 23.0.0.0 0.0.0.255

no auto-summary

 

2 在R2上做ACL 拒绝R3对R1的所有TCP连接,但不能影响R1对R3的telnet

在这里我们先用扩展访问列表做一下,看能不能实现。

r2(config)#access-list 100 deny tcp host 23.0.0.3 host 12.0.0.1

r2(config)#access-list 100 permit ip any any

r2(config)#int s2/2

r2(config-if)#ip access-group 100 in /    将ACL应用到接口

 

为了验证将R1和R3的VTY线路配置成直接登陆,无需密码。

r1(config)#line vty 0 4

r1(config-line)#no login

r3(config)#line vty 0 4

r3(config-line)#no login

 

 

现在进行验证。

r3#telnet 12.0.0.1

Trying 12.0.0.1 ...

% Destination unreachable; gateway or host down

在R3上无法telnetR1,访问列表起了作用。我们再去R1做一下验证。

 

r1#telnet 23.0.0.3

Trying 23.0.0.3 ...

% Connection timed out; remote host not responding

这时,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。

综上所述,在R2上用扩展访问列表可以阻止R3主动向R1发起的TCP连接。但也阻止了R3被动向R1发的TCP回应。这是不合题意的。因此就目前而言,扩展访问列表无法满足这个需求。于是就引出了一个新型的访问列表�D�D�D自反访问控制列表。

 

**************************************************************************************************************************************************************

 

3 用自反访问列表解决此问题。

 

注意:因为自反列表只能建立在命名访问控制列表中,所以这里只能用命名控制列表

 

r2#sh ip access-lists

Reflexive IP access list REF / 触发的自反列表项,匹配自反列表后自动产生

Extended IP access list REFIN

deny tcp host 23.0.0.3 host 12.0.0.1

permit ip any any

evaluate REF / 根据上面的自反列表项执行

Extended IP access list REFOUT

permit ip any any reflect REF / 建立自反列表

 

r2(config)#int s2/2

r2(config-if)#ip access-group REFIN in / 在进方向调用列表REFIN

r2(config-if)#ip access-group REFOUT out /在出方向调用列表REFOUT

 

下面进行检验

r3#telnet 12.0.0.1

Trying 12.0.0.1 ...

% Destination unreachable; gateway or host down

 

 

 

R3无法登陆R1,这一步成功。再到R1上验证

 

 

 

r1#telnet 23.0.0.3

Trying 23.0.0.3 ...

% Connection timed out; remote host not responding

R1也无法登陆R3,这个需求失败了,我们到R2上查看一下ACL

r2#sh ip access-lists

Reflexive IP access list REF

permit tcp host 23.0.0.3 eq telnet host 12.0.0.1 eq 11013 (5 matches) (time left 285)

Extended IP access list REFIN

deny tcp host 23.0.0.3 host 12.0.0.1 (18 matches)

permit ip any any (150 matches)

evaluate REF

Extended IP access list REFOUT

permit ip any any reflect REF (5 matches)

 

让我们仔细的分析一下这个过程,当R3登陆R1时,R2 in 方向的REFIN 列表的第一条语句 deny tcp host 23.0.0.3 host 12.0.0.1 起了作用,因此登陆失败。

当R1登陆R3时,R1先向R3发起TCP请求,当这个请求数据包从R2的S2/2接口出来时匹配了REFOUT 列表的permit ip any any reflect REF 的这条语句。并触发了一条自反项。

我们可以看到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 这条语句在这里实际上被架空了因此 控制列表语句的顺序是至关重要的。

下面我们就对这个列表进行修改。

r2#sh ip access-lists

Reflexive IP access list REF

permit tcp host 23.0.0.3 eq telnet host 12.0.0.1 eq 11014 (22 matches) (time left 252)

Extended IP access list REFIN

evaluate REF

deny tcp host 23.0.0.3 host 12.0.0.1 (3 matches)

permit ip any any (60 matches)

Extended IP access list REFOUT

permit ip any any reflect REF (18 matches)

我现在将REFIN 列表中evaluate REF 条目放在了第一位 这时当R1向R3的TCP 请求触发了自反列表后,R3向R1的回应在到R2的REFIN列表时匹配的是 evaluate REF 语句,这条语句直接按照自反项 permit tcp host 23.0.0.3 eq telnet host 12.0.0.1 eq 11014 执行。按照我们的分析现在,R1应该可以成功telnet R3。现在进行验证。

 

r1#telnet 23.0.0.3

Trying 23.0.0.3 ... Open

 

r3>

 

r3#telnet 12.0.0.1

Trying 12.0.0.1 ...

% Destination unreachable; gateway or host down

 

我们看到R1可以成功登陆到R3,而R3无法登陆到R1 需求满足。

 

**************************************************************************************************************************************************************

现在我们做进一步的扩展,现在的需求是禁止R3对R1和R2的所有TCP连接,而不能影响R1和R2对R3的TCP连接。

1 在R2上建立命名访问列表和自反列表

 

r2#sh ip access-lists

Reflexive IP access list REF

Extended IP access list REFIN

evaluate REF

deny tcp host 23.0.0.3 any / 禁止23.0.0.3向所有目的发出的TCP连接

permit ip any any (3 matches)

Extended IP access list REFOUT

permit ip any any reflect REF (19 matches)

 

2 进行验证

r3#telnet 12.0.0.1

Trying 12.0.0.1 ...

% Destination unreachable; gateway or host down

 

r3#telnet 23.0.0.2

Trying 23.0.0.2 ...

% Destination unreachable; gateway or host down

这时,R3已经无法登陆到R1和R2上, 需求满足

 

r1#telnet 23.0.0.3

Trying 23.0.0.3 ... Open

 

r3>

R1可以成功登陆到R3,需求满足

r2#telnet 23.0.0.3

Trying 23.0.0.3 ...

% Connection timed out; remote host not responding

R2无法登陆到R3,需求不满足。这是什么原因呢,让我们再来看一下控制列表。

 

r2#sh ip access-lists

Reflexive IP access list REF

Extended IP access list REFIN

evaluate REF

deny tcp host 23.0.0.3 any (21 matches)

permit ip any any (531 matches)

Extended IP access list REFOUT

permit ip any any reflect REF (28 matches)

 

我们看到这时没有自动产生一条自反项,也就意味着自反列表没有被触发,说明没有数据匹配到permit ip any any reflect REF 这条语句 。所以当R2向R3发起TCP连接后,R3向R2进行TCP回复的数据包到达R2的S2/2接口后,按照REFIN 列表进行匹配,先匹配第一条evaluate REF 由于没有自反项被触发,所以这条语句不执行,接着匹配下一条语句:

deny tcp host 23.0.0.3 any 数据包匹配上了这条语句,所以被拒绝。那为什么R2向R3的TCP请求没有触发自反列表呢?这是由于控制列表的一个原则,那就是:本路由器上out方向的控制列表对本路由器自身产生的流量不起作用。在本例中R2对R3的TCP请求根本没有匹配上REFOUT 列表的permit ip any any reflect REF 语句,原因如上所述。那么如何解决这个问题,让R2能登陆到R3,目前有两种方法;

 

方法一 :对访问控制列表进行修改。

 

r2#sh ip access-lists

Reflexive IP access list REF

Extended IP access list REFIN

permit tcp host 23.0.0.3 eq telnet host 23.0.0.2 established

evaluate REF

deny tcp host 23.0.0.3 any

permit ip any any (15 matches)

Extended IP access list REFOUT

permit ip any any reflect REF (29 matches)

 

permit tcp host 23.0.0.3 eq telnet host 23.0.0.2 established 这条语句表示允许R3用自己的23号端口对R2的TCP请求进行回复。这条语句也可以换一种写法。

permit tcp host 23.0.0.3 eq telnet host 23.0.0.2 ack rst

 

下面再次进行验证;

r3#telnet 23.0.0.2

Trying 23.0.0.2 ...

% Destination unreachable; gateway or host down

 

r3#telnet 12.0.0.1

Trying 12.0.0.1 ...

% Destination unreachable; gateway or host down

R3无法登陆R1和R2 需求成功

�D�D�D�D�D�D�D�D�D�D�D�D�D�D�D�D

r1#telnet 23.0.0.3

Trying 23.0.0.3 ... Open

 

r3>

R1可以登陆R3,需求成功。

�D�D�D�D�D�D�D�D�D�D�D�D�D

r2#telnet 23.0.0.3

Trying 23.0.0.3 ... Open

 

r3>

R2现在也成功登陆R3,需求成功。

�D�D�D�D�D�D�D�D�D�D�D�D�D�D�D�D�D�D�D�D�D�D�D�D�D�D�D�D

�D�D�D�D�D�D�D�D�D�D�D�D�D�D�D�D�D�D�D�D�D�D�D�D�D�D�D�D

方法二 不修改原来的控制列表,而使用本地策略路由。

1 建立route-map

r2(config)#route-map R2 permit 10

r2(config-route-map)#match ip add REFOUT

这个route-map匹配刚才建立的REFOUT列表。

 

2 在全局下建立本地策略调用route-map

r2(config)#ip local policy route-map R2

 

3 验证

r2#telnet 23.0.0.3

Trying 23.0.0.3 ... Open

 

r3>exi

R2成功登陆R3。 现在看一下控制列表。

 

r2#sh ip access-lists

Reflexive IP access list REF

permit tcp host 23.0.0.3 eq telnet host 23.0.0.2 eq 11018 (54 matches) (time left 0)

Extended IP access list REFIN

evaluate REF

deny tcp host 23.0.0.3 any (27 matches)

permit ip any any (1257 matches)

Extended IP access list REFOUT

permit ip any any reflect REF (63 matches)

 

这个策略的作用是让本路由器产生的数据匹配本路由器的控制列表(本例为REFOUT列表)。从而打破了上面所说的那个控制列表的规则。

现在R2向R3的TCP请求的数据包也要匹配出方向的控制列表REFOUT ,所有也就触发了自反列表,从而自动产生一条自反项。当R3向R2的TCP请求数据包到达R2后匹配入方向的控制列表REFIN 先匹配第一条 evaluate REF 匹配成功。所以就按照自反项

permit tcp host 23.0.0.3 eq telnet host 23.0.0.2 eq 11018 执行。所以登陆成功。

 

 

 

 

 

你可能感兴趣的:(自反访问列表的应用)