自反訪問控制列表

自反訪問控制列表(轉)
  1. 自反訪問控制列表(轉)
    自反訪問控制列表
    1.一個面臨的控制問題
    我們首先看下圖
      圖片:



    1.一個面臨的控制問題
    我們首先看下圖
     
    有這樣一個要求,就是我們要允許內部的機器可以訪問外部,可是不允許外部的主機訪問內部,有人說,這個簡單,用一個訪問控制列表,在Seial1上做如下配置
    router(config)#access-list 100 deny ip any any
    router(config-if)#ip access-group 100 in
    這樣做的結果是外面肯定不能訪問內部了,可是我們從內部出去的數據包也甭想回來了,所以這種做法不行
    我們可以繼續開動腦筋,我們知道TCP在建立連接之前,有一個三次握手過程,在TCP的包頭裏面有一個標誌位,我們的擴展訪問控制列表可以對這個標誌位進行控制。我們分析下,內部主機向外發起連接的時候,SYN位爲1,而外部的主機迴應包裏面爲 SYN=1 ACK=1
    而一個外部主機要想內部發起連接,他的第一個包只是SYN=1,而ACK=0,所以,我們可以通過這種方式來做
    Router(config)#access-list 100 permit tcp any any ack
    或者
    Router(config)#access-list 100 permit tcp any any established
    然後應用到接口上
    router(config-if)#ip access-group 100 in
    這個方法是可以,但是如果不是TCP的應用,是UDP的程序該如何辦?很顯然,通過這個方式是解決不了的。我們用自反訪問列表就可以很好的解決這個問題
    2. 自反訪問控制列表
    自反訪問列表的英文名字是Reflexive Access Lists,Reflexive這個詞我們翻譯成自反,如何自反呢?就是他會根據一個方向的訪問控制列表,自動創建出一個反方向的控制列表,那麼,創建一個什麼樣的控制列表呢?就是和原來的控制列表—IP的源地址和目的地址顛倒,並且源端口號和目的端口號完全相反的一個列表。並且還有一定的時間限制,過了時間,就會超時,這個新創建的列表就會消失,這樣大大增加了安全性。
    具體案例:
    拓撲圖如下

    圖片:


    需求如下:
    R1模仿內網,R3模仿外網,現在要求R1可以遠程登錄到R3,但是不允許R3發起任何到R1的連接。
    三臺路由器初始配置如下:
    R1#sh run
    interface Serial0
    ip address 10.1.1.1 255.255.255.0
    router ospf 1
    log-adjacency-changes
    network 0.0.0.0 255.255.255.255 area 0
    line vty 0 4
    password cisco
    login
    R2#sh run
    interface Serial0
    ip address 10.1.1.2 255.255.255.0
    clockrate 64000
    interface Serial1
    ip address 192.168.1.1 255.255.255.0
    clockrate 64000
    router ospf 1
    log-adjacency-changes
    network 0.0.0.0 255.255.255.255 area 0
    R3#sh run
    interface Loopback0
    ip address 3.3.3.3 255.255.255.0
    interface Ethernet0
    no ip address
    shutdown
    interface Serial0
    no ip address
    interface Serial1
    ip address 192.168.1.2 255.255.255.0
    router ospf 1
    log-adjacency-changes
    network 0.0.0.0 255.255.255.255 area 0
    line vty 0 4
    password cisco
    login
    R1上的路由表
    R1#sh ip route
    Codes: C - connected, S - static, R - RIP, M - mobile, B - BGP
            D - EIGRP, EX - EIGRP external, O - OSPF, IA - OSPF inter area
            N1 - OSPF NSSA external type 1, N2 - OSPF NSSA external type 2
            E1 - OSPF external type 1, E2 - OSPF external type 2
            i - IS-IS, L1 - IS-IS level-1, L2 - IS-IS level-2, ia - IS-IS inter area
            * - candidate default, U - per-user static route, o - ODR
            P - periodic downloaded static route
    Gateway of last resort is not set
          3.0.0.0/32 is subnetted, 1 subnets
    O        3.3.3.3 [110/129] via 10.1.1.2, 00:03:42, Serial0
          10.0.0.0/24 is subnetted, 1 subnets
    C        10.1.1.0 is directly connected, Serial0
    O     192.168.1.0/24 [110/128] via 10.1.1.2, 00:03:42, Serial0
    測試一下
    R1#ping 3.3.3.3
    Type escape sequence to abort.
    Sending 5, 100-byte ICMP Echos to 3.3.3.3, timeout is 2 seconds:
    !!!!!
    Success rate is 100 percent (5/5), round-trip min/avg/max = 60/62/68 ms
  2. R1#
    R1#telnet 3.3.3.3
    Trying 3.3.3.3 ... Open
    User Access Verification
    Password:
    R3>
    在R3上測試一下:
    R3#ping 10.1.1.1
    Type escape sequence to abort.
    Sending 5, 100-byte ICMP Echos to 10.1.1.1, timeout is 2 seconds:
    !!!!!
    Success rate is 100 percent (5/5), round-trip min/avg/max = 60/60/60 ms
    R3#telnet 10.1.1.1
    Trying 10.1.1.1 ... Open
    User Access Verification
    Password:
    R1>
    路由是通暢的,R1可以正常的遠程登錄到R3,因爲沒有作任何控制,所以R3照樣可以訪問R1
    解決方案1:
    使用擴展訪問控制列表,控制TCP標誌位
    在R2上做如下配置
    interface Serial1
    ip address 192.168.1.1 255.255.255.0
    ip access-group 100 in
    clockrate 64000
    access-list 100 permit tcp any any established   //用ACK也行
    access-list 100 permit ospf any any           //保持ospf路由協議正常工作
    R1上做測試:
    R1#ping 3.3.3.3 
    Type escape sequence to abort.
    Sending 5, 100-byte ICMP Echos to 3.3.3.3, timeout is 2 seconds:
    .....
    Success rate is 0 percent (0/5)
    R1#telnet 3.3.3.3
    Trying 3.3.3.3 ... Open
  3. User Access Verification
    Password:
    R3>
    這個時候,我們發現不能ping 通了,原因是什麼呢?
    access-list 100 permit tcp any any established
    access-list 100 permit ospf any any  
    我們在訪問控制列表中沒有允許ICMP協議,所以返回的數據包在R2上面被拒絕掉了,但是telnet成功了,因爲我們在進來的訪問控制列表裏允許了TCP。
    在R3上做測試:
    R3#ping 10.1.1.1
    Type escape sequence to abort.
    Sending 5, 100-byte ICMP Echos to 10.1.1.1, timeout is 2 seconds:
    U.U.U
    Success rate is 0 percent (0/5)
    R3#telnet 10.1.1.1
    Trying 10.1.1.1 ...
    % Destination unreachable; gateway or host down
    我們看R3是不能訪問R1的任何東西了,爲什麼呢?ping不通的原因是我們在R2上阻止了ICMP,而telnet爲什麼不行呢,雖然我們允許了TCP包,但是因爲是R3向R1發起初始化連接,TCP裏面的標誌位SYN=1,ACK=0,而我們的訪問控制列表的關鍵詞established定義了只有ACK=1的包才能被允許,所以,這個初始連接包就被拒絕了,那麼我們這種做法就滿足了試驗要求。
    解決方案2:
    使用自反訪問控制列表
    在R2 做如下配置
    interface Serial0
    ip address 10.1.1.2 255.255.255.0
    ip access-group tcp-out in
    clockrate 64000
    !        
    interface Serial1
    ip address 192.168.1.1 255.255.255.0
    ip access-group tcp-in in
    clockrate 64000
    ip access-list extended tcp-in
    permit ospf any any
    evaluate telnet
    ip access-list extended tcp-out
    permit ospf any any
    permit tcp any any reflect telnet
    需要注意以下幾點
    1)         自反訪問控制列表只能和基於名字的擴展訪問控制列表一起工作
    2)         他自己不能工作,必須寄生於擴展訪問控制列表,並且有兩個訪問列表才行,也就是
    一個列表創建自反列表
    例如
    ip access-list extended tcp-out
    permit tcp any any reflect telnet
    注意關鍵詞 refect,當由符合tcp any any 的數據流通過的時候,就會產生一個名字叫做telnet的自反列表,但是它是產生而已,還不能被使用,因爲沒與應用到接口上
    令外一個列表進行調用
    ip access-list extended tcp-in
       evaluate telnet
    在進來的訪問列表裏面,用關鍵字evaluate 來調用已經產生的telnet自反列表。
    在R1上做測試
    R1>en
    R1#telnet 3.3.3.3
    Trying 3.3.3.3 ... Open
    User Access Verification
    Password:
    R3>
    我們看看R2上:
    R2#show access-lists
    Extended IP access list tcp-in
         10 permit ospf any any (72 matches)
         20 evaluate telnet
    Extended IP access list tcp-out
         20 permit ospf any any (72 matches)
         30 permit tcp any any reflect telnet
    Reflexive IP access list telnet
          permit tcp host 3.3.3.3 eq telnet host 10.1.1.1 eq 11003 (26 matches) (time left 258)
    已經產生了一個自反訪問控制列表,他的源端口是23,目的端口是11003,正好是我們剛纔從R1上telnet的返回的數據流。
    從R3上做下測試:
    R3#telnet 10.1.1.1
    Trying 10.1.1.1 ...
    % Destination unreachable; gateway or host down
    我們看不成功,這個連接的源端口號是一個大於10000得一個隨機端口號,目的端口號是23 ,但是訪問控制列表並不允許這樣的數據流,所以訪問失敗,這個滿足我們的試驗需求。
    我們還可以對這個自反列表存在時間進行控制,我們看看這個自反列表
    permit tcp host 3.3.3.3 eq telnet host 10.1.1.1 eq 11003 (26 matches) (time left 258),time left 258是指如果沒有數據流的情況下,再過258秒,這個自反列表既要從緩存中被清掉。這無疑增加了安全性,降低了被IP欺騙的可能。
    這個時間我們可以用如下的方式修改:
    ip access-list extended tcp-out
    permit tcp any any reflect telnet timeout 600   //單位是秒
    另外在全局模式下,可以使用另外一個命令修改超時時間:
    r2(config)#ip reflexive-list timeout 600
    這樣就把時間改成了10分鐘,而默認是5分鐘
    現在有一個新的需求:
    我們要求在R2可以telnet到R3,但是R3不能訪問R2
    我們在R2 上做如下配置
    interface Serial1
    ip address 192.168.1.1 255.255.255.0
    ip access-group tcp-in in
    ip access-group tcp-out out
    clockrate 64000
    ip access-list extended tcp-in
    permit ospf any any
    evaluate telnet
    ip access-list extended tcp-out
    permit ospf any any
    permit tcp any any reflect telnet
    我們首先在R3上測試一下:
    R3#telnet 192.168.1.1
    Trying 192.168.1.1 ...
    % Destination unreachable; gateway or host down
    結果是滿意的
    我們再在R2上測試一下:
    R2#telnet 3.3.3.3
    Trying 3.3.3.3 ...
    % Connection timed out; remote host not responding
    結果卻出乎我們的預料。原因在哪裏?
    我們看一下R2上的訪問列表
    R2#show access-lists
    Extended IP access list tcp-in
         10 permit ospf any any (230 matches)
         20 evaluate telnet
    Extended IP access list tcp-out
         20 permit ospf any any (202 matches)
         30 permit tcp any any reflect telnet
    Reflexive IP access list telnet
    自反列表竟然爲空!這是爲什麼呢?原因在於訪問列表的一個特性,就是出去的訪問列表不對這個路由器自己產生的數據包進行檢查,也就是我們從R2上telnet 到R3的數據流是從R2產生的,所以沒有經過這個下面這個訪問控制列表的檢查
    ip access-list extended tcp-out
    permit ospf any any
    permit tcp any any reflect telnet
    訪問控制列表,那麼自然就不會產生自反訪問列表telnet了。
    解決的辦法有兩個:
    一個是通過本地路由策略(local policy route-map)
    ip local policy route-map cisco
    route-map cisco permit 10
    match ip address tcp-out
    在R2上再測試一下:
    R2#telnet 3.3.3.3
    Trying 3.3.3.3 ... Open
    User Access Verification
    Password:
    R3>
    R2上看下訪問列表:
    //注意,不能在上面的配置中打exit,如果是這樣,那麼自反列表剩下的時間立刻被降爲6秒,不好觀察結果,我採用的是在R1上遠程登錄(telnet)到R2再觀察
    r2#show access-lists
    Extended IP access list tcp-in
         10 permit ospf any any (8 matches)
         20 evaluate telnet
    Extended IP access list tcp-out
         10 permit ospf any any
         20 permit tcp any any reflect telnet
    Reflexive IP access list telnet
          permit tcp host 3.3.3.3 eq telnet host 192.168.1.1 eq 11002 (time left 297)
    好的,我們看看現在就可以了!
    當然,我們還有另外的一個方法:
    R2上這樣配置:
    ip access-list extended tcp-in
    permit ospf any any
    evaluate telnet
    permit tcp any eq telnet any ack---------------------------加上了這條指令
    ip access-list extended tcp-out
    permit ospf any any
    permit tcp any any reflect telnet
    在R2上測試:
    r2#telnet 3.3.3.3
    Trying 3.3.3.3 ... Open
    User Access Verification
    Password:
    R3>
    成功登陸,符合我們的期望:
    在R3上進行測試:
    R3#telnet 192.168.1.1
    Trying 192.168.1.1 ...
    % Destination unreachable; gateway or host down
    結果也是我們所需要的
    總結:
    自反訪問控制列表在第四層上分析數據流,是一個按需生成的控制列表,在沒有數據流的時候,也就是不需要的時候,會自動消失,是一種較自動化的數據控制方式,在一定程度上防止了IP地址欺騙***,非常有效的保護了用戶的網絡免受***破壞,並且對UDP數據包最有效(對於UDP包,擴展訪問控制列表毫無辦法)。

     
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章