본문 바로가기

네트워크

[네트워크] 37. 액세스 리스트 Access Control List

이 게시물은 킹 오브 네트워킹 (피터전)을 공부한 내용을 바탕으로 작성됨.


사실 지금 CCNA 준비하고 있어서 포스팅을 잠깐 쉬려했는데 CCNA 기출을 돌리면 돌릴수록 개념공부가 절실하다는 게 느껴진다.. 특히 ACL, NAT 부분은 출제빈도가 높은데 개념이 잘 안잡혀있으니까 답 찾기가 어렵다. 급할수록 돌아가라는 말이 이럴때 필요한 듯 ㅎㅎ 혹시 CCNA 준비하는 분들이 이 글을 본다면 ACL, NAT은 개념공부를 꼭 하시길 권장합니다.

 

 

 

 


액세스 리스트(ACL, Access Control List)

 

액세스 리스트는 일단 영어로 Access control list라고 쓰인다. 한국어로는 중간에 컨트롤을 빼먹고 말하니까 CCNA 처음 접근할 때 읭? 했다.

 

ACL의 목적은 라우터에서 특정한 패킷을 차단/허용하기 위해 사용된다. (위에서 언급했듯이 CCNA 출제 빈도가 아주 높다! 집중집중집중) 방식에 따라 종류를 다음과 같이 나눠볼 수 있다.

 

  • Standard ACL - 패킷 검사할 때 출발지 IP 주소만을 참조
  • Extended ACL - 패킷 검사할 때 출발지/목적지 IP주소, 프로토콜 번호, 전송계층 포트번호까지 전부 다 참조
  • Numbered ACL - ACL을 정의할 때 번호를 사용
  • Named ACL - ACL을 정의할 때 이름을 사용

 

 

 

 

ACL을 본격적으로 공부하기 전에, 네트워크 보안장비에 대해 대표적인 몇 가지를 알아보고 가자.

 

  • 방화벽(Firewall, FW) - 가장 많이 사용되는 네트워크 보안 장비. 사전에 정의된 rule에 따라 트래픽을 제어한다. Cisco의 대표적인 방화벽 장비로 ASA가 있으며, 라우터도 방화벽 기능을 제공한다.
  • VPN gateway - VPN(Virtual Private Network, 가상 사설망) 게이트웨이는 인터넷과 같은 public network를 사설망 private network처럼 사용할 수 있도록 하는 장비이다. 이 기능을 위해 패킷 암호화, authentication, 패킷 변조확인 등의 기능을 제공한다. Cisco는 라우터, ASA등을 VPN 장비로 이용한다.
  • IPS - IPS(Intrusion Prevention System, 침입방지 시스템)은 가변적인 공격 트래픽을 차단하거나 탐지하는 장비이다. 공격을 탐지하는 장비를 IDS(Intrusion Detection System)이라고 명칭하여 IPS와 구분하는 경우도 있으나, 대부분 IDS도 공격 차단 기능을 보유하므로, 마케팅을 위해 이름을 다르게 지은것 뿐이다.

 

 

 

 

 

이제 ACL 실습을 진행해보도록 하자.

 

 

 

 

위 같은 네트워크를 설정해준다.

 

 

R1(config)#interface g 0/0
R1(config-if)#ip address 1.1.10.1 255.255.255.0
R1(config-if)#no shut
R1(config-if)#interface s0/3/0
R1(config-if)#ip address 1.1.12.1 255.255.255.0
R1(config-if)#no shut


... 나머지 생략

 

 

 

 

그 다음으로 각 라우터에 OSPF 라우팅을 설정해준다. (ACL을 사용하든 어쩌든 일단 라우팅 프로토콜을 설정하는 건 아주 기본이다.)

 

R1(config)#router ospf 1
R1(config-router)#router-id 1.1.1.1
R1(config-router)#network 1.1.10.1 0.0.0.0 area 0
R1(config-router)#network 1.1.12.1 0.0.0.0 area 0

R2(config)#router ospf 1
R2(config-router)#router-id 1.1.2.2
R2(config-router)#network 1.1.12.2 0.0.0.0 area 0
R2(config-router)#network 1.1.23.2 0.0.0.0 area 0

R3(config)#router ospf 1
R3(config-router)#router-id 1.1.3.3
R3(config-router)#network 1.1.23.3 0.0.0.0 area 0
R3(config-router)#network 1.1.30.3 0.0.0.0 area 0
R3(config-router)#network 1.1.3.3 0.0.0.0 area 0

 

 

굳이 area 나눌 필요 없으므로 모든 interface를 전부 area 0에 설정해주었다. OSPF 설정을 마치고 난 후 R1의 라우팅 테이블을 확인해보면 다음과 같다.

 

 

 

R1#show ip route

Gateway of last resort is not set

     1.0.0.0/8 is variably subnetted, 7 subnets, 2 masks
O       1.1.3.0/24 [110/129] via 1.1.12.2, 00:00:40, Serial0/3/0
C       1.1.10.0/24 is directly connected, GigabitEthernet0/0
L       1.1.10.1/32 is directly connected, GigabitEthernet0/0
C       1.1.12.0/24 is directly connected, Serial0/3/0
L       1.1.12.1/32 is directly connected, Serial0/3/0
O       1.1.23.0/24 [110/128] via 1.1.12.2, 00:01:36, Serial0/3/0
O       1.1.30.0/24 [110/129] via 1.1.12.2, 00:00:40, Serial0/3/0

 

 

AD가 110으로 설정된 것들이 OSPF를 통해 얻어진 라우팅 경로들이다. R1에서 가장 먼 네트워크인 R3의 1.1.30.3 까지 통신이 수행되는지 확인하기 위해 핑을 때려보자.

 

 

R1#ping 1.1.30.3

Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 1.1.30.3, timeout is 2 seconds:
!!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max = 2/17/36 ms

 

 

아주 잘 됨! 이제 ACL을 사용하기 위한 기본 설정을 모두 마쳤다. 

 

 

 

 

 

 

 


Standard ACL

 

ACL의 가장 기초형태인 Standard ACL을 이용하여 트래픽 제어를 해본다. ACL은 IP 프로토콜당 (IPv4, IPv6), 인터페이스당, 방향당 하나씩 정의할 수 있다. 따라서 ACL을 정의하기에 앞서 ACL을 적용할 라우터, 인터페이스, 그리고 방향을 미리 결정해야 한다.

 

 

 

 

이번에는 위에서 정의한 네트워크를 내부망/외부망으로 분리하여 생각한다. 이때 외부 네트워크와 연결되는 라우터를 경계 라우터 (Perimeter router)라고 하는데, 보통 경계 라우터의 외부 인터페이스에서 내부 네트워크로 들어오는 패킷들을 제어(permit/deny)하는 경우가 많다.

 

 

예를들어 1.1.23.3 또는 1.1.30.3으로부터 R2로 들어오는 패킷들만 허용하는 방법은 다음과 같다.

 

 

 

                         ①   ②       ③        ④
  R2(config)#access-list 1 permit 1.1.23.3 0.0.0.0
⑤ R2(config)#access-list 1 permit 1.1.30.3 0.0.0.0
⑥ R2(config)#interface s0/3/1
⑦ R2(config-if)#ip access-group 1 in

 

하나하나 살펴본다.

 

  1. access-list 명령어 다음에 적당한 번호 아무거나 입력해준다. 다만 Standard ACL은 1~99, 1300~1999 범위 내의 번호만 허용된다. (이런 짜잘한 내용도 CCNA 기출에 있다..!)
  2. ACL 번호 다음에는 permit, deny, remark 세 가지 명령어 중 하나가 온다. permit은 패킷들을 허용, deny는 패킷들을 차단, remark는 ACL에 주석을 달 때 사용한다.
  3. 출발지 IP address를 입력한다. (Standard ACL은 출발지 IP address만을 보고 패킷을 제어한다고 했었다.)
  4. Wildcard mask를 사용한다. wildcard mask가 무엇인지는 조금 있다가 알아본다.
  5. ACL은 프로토콜당, 인터페이스당, 방향당 하나씩 지정되어야 하므로, 패킷의 출발지 IP address가 달라지는 경우에는 문장을 하나 더 입력해주어야 한다. 또한 Standard ACL의 마지막에는 묵시적으로 '나머지는 전부 차단'이라는 문장이 숨어져있다. 따라서 해당 주소들이 아닌 다른 출발지 IP address에서 오는 패킷들은 전부 차단된다.
  6. ACL을 적용할 interface에 접근한다.
  7. ip access-group + ACL 번호 + 방향을 지정한다. 이 경우에는 1.1.23.3, 1.1.30.3에서 출발하여 R2의 s0/3/1 interface로 들어오는(in) 패킷들을 permit한다는 것이다.

 

 

 

 

 

이제 위 네트워크에서 1.1.23.3, 1.1.30.3으로부터 발생하여 1.1.12.2로 도착하는 패킷들은 허용되지만, 1.1.3.3에서 출발하는 패킷은 deny된다.

 

 

파란 화살표 방향은 permit이지만 빨간 화살표 방향은 deny된다. 확장핑으로 R3에서 ping source를 1.1.3.3으로 설정하여 진짜 핑이 실패하는 걸 보여주고 싶은데...... 어째서인지 내 실습환경에서는 확장핑에 source IP address를 지정하는 칸이 뜨질 않는다 ㅠ

 

 

 

 

R2#show ip access-lists
Standard IP access list 1
    10 permit host 1.1.23.3 (117 match(es))
    20 permit host 1.1.30.3

 

 

R2에서 적용된 access-list를 확인해보면 위와 같다.

 

 

 

 

 

 


와일드카드 마스크 (Wildcard mask)

 

 

 

예를들어 R3의 Gi0/0 interface와 연결된 200대가 넘는 PC들이 전부 1.1.30.0/24 network에 속한다고 해보자. 이때 이 PC들이 내부망과 연결하기 위해 R2에서 ACL를 설정한다면 다음처럼 하나하나 전부 설정해주어야 하는 참사가 발생한다.

 

R2(config)#access-list 1 permit 1.1.30.1 0.0.0.0
R2(config)#access-list 1 permit 1.1.30.2 0.0.0.0
...
R2(config)#access-list 1 permit 1.1.30.254 0.0.0.0

 

 

이러한 참사를 방지하기 위해 우리는 wildcard mask를 사용한다.

 

 

후니의 시스코 네트워킹에서는 wildcard mask를 단순히 subnet mask를 2진수 반전시킨 것이라고 배웠었다. 이렇게 기억하는 것도 좋지만, wildcard mask는 이것보다는 더 깊은 의미를 갖고있다.

 

1.1.30.0/24는 subnet mask가 255.255.255.0이므로 2진수 반전시켜서 얻은 wildcard mask는 0.0.0.255이다. 그리고 이게 실제로 이 네트워크의 wildcard mask가 맞다. 이러한 경우에는 단순히 2진수 반전으로 wildcard mask를 얻어도 좋다.

 

하지만 wildcard mask의 참의미를 꼭 알고 넘어가야 한다. 1.1.30.0 0.0.0.255는 1.1.30.0~1.1.30.255 사이의 주소를 의미한다. 따라서 위 네트워크에서 1.1.30.0/24에 속하는 모든 PC들에 한 번에 ACL 설정하기 위해서는 다음과 같은 명령어를 사용한다.

 

R2(config)#access-list 1 permit 1.1.30.0 0.0.0.255

 

 

더불어, subnet maks는 반드시 1이 연속되어야 한다는 룰이 있었지만, wildcard mask는 1이나 0이 연속될 필요가 없다. (wildcard mask가 단순히 subnet mask를 반전시킨 것이 아니라는 게 확실해지는 순간)

 

 

그래서 wildcard mask는 어떻게 구하는걸까?

 

예시를 알아보기 위해 1.1.2.0/24, 1.1.3.0/24 두 네트워크의 wildcard mask를 구해보도록 한다. 먼저 두 네트워크를 2진수로 풀어쓰면 다음과 같다.

 

0000 0001 . 0000 0001. 0000 0010. 0000 0000 (1.1.2.0)

0000 0001 . 0000 0001. 0000 0011. 0000 0000 (1.1.3.0)

           0000 0000 . 0000 0000. 0000 0001. 1111 1111 (wildcard mask)

 

 

두 네트워크를 2진수로 풀어썼을 때 23bit까지는 완벽히 일치한다. 따라서 wildcard mask의 23bit까지는 전부 0값을 갖는다. 24번째 bit부터 서로 다른 값을 가지므로, 24번째 bit부터는 전부 1값을 갖는다.

 

 

 

 

다음 예시로 1.1.4.0/24 ~ 1.1.7.0/24 범위의 총 4개 네트워크의 wildcard mask를 구해보도록 한다.

 

0000 0001 . 0000 0001. 0000 0100. 0000 0000 (1.1.4.0)

0000 0001 . 0000 0001. 0000 0101. 0000 0000 (1.1.5.0)

0000 0001 . 0000 0001. 0000 0110. 0000 0000 (1.1.6.0)

0000 0001 . 0000 0001. 0000 0111. 0000 0000 (1.1.7.0)

          0000 0000 . 0000 0000. 0000 0011. 1111 1111 (wildcard mask)

 

네 개의 network가 전부 22번째 bit까지는 동일한 값을 갖는다. 23번째 bit부터 서로 다른 값을 가질 수 있으므로, wildcard mask는 22번째 bit까지 0 값을, 23번째 bit부터 1 값을 갖는다. 광범위한 네트워크를 하나의 wildcard mask로 축약할 수 있다.

 

 

하지만 모든 네트워크 범위를 wildcard mask로 축약할 수 있는 것은 아니다. 다음 예제로 1.1.1.0~1.1.8.0의 8개 네트워크의 wildcard mask를 구하는 예제를 살펴보도록 한다. 

 

 

0000 0001 . 0000 0001. 0000 0001. 0000 0000 (1.1.1.0)

0000 0001 . 0000 0001. 0000 0010. 0000 0000 (1.1.2.0)

0000 0001 . 0000 0001. 0000 0011. 0000 0000 (1.1.3.0)

0000 0001 . 0000 0001. 0000 0100. 0000 0000 (1.1.4.0)

0000 0001 . 0000 0001. 0000 0101. 0000 0000 (1.1.5.0)

0000 0001 . 0000 0001. 0000 0110. 0000 0000 (1.1.6.0)

0000 0001 . 0000 0001. 0000 0111. 0000 0000 (1.1.7.0)

0000 0001 . 0000 0001. 0000 1000. 0000 0000 (1.1.8.0)

 

이번에는 위 두 예제와 다르게 각각이 비트값이 달라지는 자릿수가 다르다. 이때 1.1.1.0은 어떤 네트워크와도 묶일 수 없다. 1.1.1.0을 1.1.2.0~1.1.3.0과 묶으려고 시도해보자. 그러면 23번째 bit부터 값이 달라지기 시작하기 때문에 wildcard mask는 0.0.3.255가 된다. 따라서 1.1.1.0 0.0.3.255가 되는데, 이것은 1.1.1.0/24~1.1.4.0/24를 의미한다. 1.1.4.0은 애초에 포함하려는 의도가 없었는데 잘못 묶인 것이다. (혹시 틀렸다면 알려주세요)

 

이러한 이유로, 서로 달라지기 시작하는 지점이 같은 묶음끼리만 wildcard mask를 지정할 수 있다.

 

1.1.0.0 0.0.0.255

1.1.2.0 0.0.1.255

1.1.4.0 0.0.3.255

1.1.8.0 0.0.0.255

 

 

 

 

 


ACL 동작방식

 

 

순차적 문장 적용

  • ACL은 첫 문장부터 차례로 확인한다.
  • 순서대로 확인하다가 일치되는 것이 있으면 그것을 적용하고 더 이상의 문장은 확인하지 않는다.
  • 따라서 범위가 좁은 문장을 먼저 지정해야 한다.

 

 

위 개념을 이해하기 위해 1.1.3.0/24에 소속된 IP는 차단하고, 1.1.0.0/16에 소속된 IP는 허용하는 예시를 생각해본다. 

 

R2(config)#access-list 1 permit 1.1.0.0 0.0.255.255
R2(config)#access-list 1 deny 1.1.3.0 0.0.0.255

 

1.1.0.0/16이 1.1.3.0/24를 포함하는 큰 범위이므로, 위처럼 1.1.0.0/16을 먼저 허용해버리면 그 안에 속한 1.1.3.0/24는 차단되지 않고 허용된다. 따라서 범위가 좁은 두번째 문장을 먼저 실행해야만 원하는 목적을 달성할 수 있다.

 

 

 

 

 

라우팅 테이블과 ACL의 적용 순서

  1. 입력(inbound) ACL 적용
  2. 라우팅 테이블 적용
  3. 출력(outbound) ACL 적용

 

수신한 inbound 패킷이 입력 ACL에 의해 차단되면 라우팅 테이블을 참조할 필요도 없이 바로 폐기한다. 만약 inbound ACL이 존재하지 않아서 해당 라우터에 패킷이 입력되면 2단계로 넘어가 라우팅 테이블에 따라 목적지와 연결되는 interface로 패킷을 전달한다. 이때 해당 경로로 outbound ACL이 deny로 적용되어 있다면 그 패킷을 폐기한다.

 

 

 

 

R2(config)#no access-list 1 deny 1.1.3.0 0.0.0.255


R2#show ip access-list

R2#

 

이제까지 R2에 여러개의 access-list를 적용해두었는데, 그 중 하나의 문장만 삭제하기 위해 위 명령어를 입력해주었다. 그런데 웬걸 show ip access-list를 통해 현재 R2가 가지고있는 ACL를 확인해보니 아무것도 없다. 전부 다 지워진 것이다.

 

이처럼 기본적으로 ACL number를 사용한 ACL은 특정 문장만을 제거하거나 수정할 수 없다. 특정 문장만을 제거하는 명령어를 입력할 시 전체 ACL가 삭제된다. 하지만 마지막 문장 다음에 한 문장을 추가하는 것은 가능하다. 따라서 Standard ACL처럼 ACL number를 사용하는 경우에는 기존에 사용한 ACL을 수정하기 위해서는 기존 ACL을 메모장 같은 곳에 따로 저장해둔 후, 거기서 수정하고 다시 복사해서 입력해주는 편이 좋다. (왜 이렇게 불편하게 만든걸까?)

 

 

 

 

 

다음 예시로 출발지 IP address가 1.1.23.3/24, 1.1.3.3/32, 1.1.30.0/24인 경우만 permit하는 standard ACL을 만들어 적용해본다.

 

R2(config)#access-list 2 remark inbound ACL
R2(config)#access-list 2 permit 1.1.23.0 0.0.0.255
R2(config)#access-list 2 permit 1.1.3.3 0.0.0.0
R2(config)#access-list 2 permit 1.1.30.0 0.0.0.255
R2(config)#interface s0/3/1
R2(config-if)#ip access-group 2 in

 

맨 첫번째 줄은 remark로, 주석을 다는 것이다. ACL number 2에 inbound라는 주석을 추가하여 나중에 다른 사용자들이 숫자 2로 지정된 ACL을 보았을 때 inbound ACL이라는 것을 알 수 있게하는 용도이다.

 

 

 

R2#show ip access-list
Standard IP access list 2
    10 permit 1.1.23.0 0.0.0.255 (23 match(es))
    20 permit host 1.1.3.3
    30 permit 1.1.30.0 0.0.0.255

 

wildcard를 0.0.0.0으로 지정하면 host로 지정되며 wildcard는 출력되지 않는다.

 

 

 

 

R2#show ip interface s0/3/1
Serial0/3/1 is up, line protocol is up (connected)
  Internet address is 1.1.23.2/24
  Broadcast address is 255.255.255.255
  Address determined by setup command
  MTU is 1500
  Helper address is not set
  Directed broadcast forwarding is disabled
  Outgoing access list is not set
  Inbound  access list is 2

 

 

ACL을 설정해준 interface s0/3/1의 정보를 살펴보면 Outbound ACL은 not set, Inbound ACL은 ACL number 2로 설정되어 있음을 확인할 수 있다.

 

 

 

 

 

이번에는 Outbound ACL을 설정해보자.

 

R2(config)#access-list 10 remark Outbound ACL
R2(config)#access-list 10 deny 1.1.3.3
R2(config)#access-list 10 deny 1.1.12.2
R2(config)#access-list 10 permit any
R2(config)#interface s0/3/0
R2(config-if)#ip access-group 10 out

 

 

 

 

이때 빨간색 경로는 차단되지만, 파란색 경로는 차단되지 않는다. 파란색 경로(1.1.12.2)도 분명 deny 해주었는데 왜 차단되지 않는걸까? 그 이유는 ACL을 R2에 설정해주었는데 1.1.12.2가 R2 자신의 interface이기 때문이다. Outbound ACL은 ACL이 설정된 라우터에서 출발하는 패킷에는 적용되지 않는다.

 

 

 

 

 

 

 


Standard ACL - Telnet

 

이번에는 Standard ACL을 이용하여 Telnet을 제어해보도록 한다.

 

 

R2(config)#access-list 99 remark Telnetl Control
R2(config)#access-list 99 permit 1.1.12.0 0.0.0.255
R2(config)#line vty 0 4
R2(config-line)#access-class 90 in

 

Telnet이라고 해서 크게 다를 건 없다. ACL을 설정할 interface를 그저 telnet으로 잡아주기만 하면 된다. 위 명령어는 R1이 속하는 1.1.12.0/24 네트워크는 telnet 접속을 허용하고, 나머지는 자동으로 telnet 접속을 차단하는 것이다. 따라서 R1에서는 R2로 telnet 접속이 가능하지만, R3에서의 접속은 차단된다.

 

 

물리적 interface와 비교하여 한가지 다른점이 있다면 interface에 ACL을 설정해줄 때 명령어가 살짝 다르다.

  • 물리 interface - ip access-group 10 out
  • virtual interface - access-class 90 in

 

 

R3>telnet 1.1.23.2
Trying 1.1.23.2 ...Open

[Connection to 1.1.23.2 closed by foreign host]

 

 

 

 

이제 다음 실습으로 넘어가기 위하여 R2에 걸려있는 ACL을 전부 삭제해준다.

 

R2(config)#line vty 0 4
R2(config-line)#no access-class 90 in
R2(config-line)#exit
R2(config)#interface s0/3/1
R2(config-if)#no ip access-group 2 in
R2(config-if)#exit
R2(config)#interface s0/3/0
R2(config-if)#no ip access-group 10 out
R2(config-if)#exit

 

 

 

 

 


Extended ACL

 

이제까지 살펴본 Standard ACL은 출발지 IP address만 보고 이 패킷(또는 접속)을 차단할지 허용할지 선택하는 보안장치였다. 지금부터 살펴볼 Extended ACL은 출발지 IP address 뿐만 아니라, 목적지 IP address, 전송계층 출발지 포트번호, 목적지 포트번호까지 제어할 수 있다.

 

 

L3/L4 header는 다음과 같이 구성된다.

Source IP Destination IP Protocol Source Port Destination Port
1.1.23.3 1.1.12.1 TCP 65000 80

 

앞 두 칸은 L3 header / 나머지 세 칸은 L4 header이다. Standard ACL에 비하여 좀 더 세세한 조건으로 정밀하게 트래픽을 제어할 수 있다.

 

 

 

 

 

                          ①    ②     ③        ④           ⑤
  R2(config)#access-list 100 permit ospf host 1.1.23.3 any
⑥ R2(config)#access-list 100 permit tcp host 1.1.23.3 host 1.1.12.1 eq telnet
⑦ R2(config)#access-list 100 permit tcp host 1.1.23.3 host 1.1.12.1 eq 80
⑧ R2(config)#access-list 100 permit ip 1.1.30.0 0.0.0.255 1.1.10.0 0.0.0.255
⑨ R2(config)#interface s0/3/1
  R2(config-if)#ip access-group 100 in

 

  1. Extended ACL은 100~199, 2000~2699 사이의 ACL number를 사용한다. (Standard ACL은 1~99, 1300~1999)
  2. permit / deny / remark 중 하나를 선택한다.
  3. IP header 프로토콜 필드에 설정된 < 프로토콜 번호나 이름 >을 지정한다. 예를들어 OSPF는 IP header에서 프로토콜 번호 89를 사용하므로 OSPF 패킷을 허용하기 위해서는 permit 89 또는 permit ospf를 입력하면 된다. 만약 프로토콜 번호와 상관없이 모든 IP 패킷을 제어하려면 permit ip를 입력한다.
  4. 출발지 network
  5. 목적지 network
  6. 출발지가 1.1.23.3이고 목적지가 1.1.12.1인 telnet 패킷을 허용하는 문장이다. telnet 패킷은 TCP를 사용하므로 IP header 프로토콜 번호를 6으로 지정하거나 직접 TCP라는 이름을 써주면 된다. 더불어 Telnet은 TCP 포트번호가 23이므로 eq 23 또는 eq telnet을 입력하여 포트번호를 지정한다. 여기서 eq는 equal을 의미하는데, 만약 여러 개의 포트번호를 지정하려면 range 옵션을 사용하여 시작과 끝 번호를 지정한다.
  7. 출발지가 1.1.23.3이고 목적지가 1.1.12.1인 HTTP 패킷을 허용하는 문장이다. tcp라고 설정해놓고 웬 HTTP?라고 할수도 있지만, HTTP는 TCP를 사용하는 프로토콜이므로, IP header 프로토콜 번호를 6으로 지정하거나 직접 TCP라는 이름을 써주면 된다. 더불어 HTTP는 TCP port number가 80이므로 eq 80 또는 eq www처럼 포트번호나 프로토콜 이름을 지정해주어야 한다. (여기서 www는 HTTP를 의미한다.)
  8. 출발지 주소가 1.1.30.0/24인 패킷들은 프로토콜 종류에 상관없이 모두 1.1.10.0/24 네트워크에 접속하는 것을 허용하는 문장이다. (프로토콜을 ip로 지정하는 경우에는 프로토콜 종류와 상관없이 전부 허용한다는 의미이다.)
  9. Extended ACL을 interface에 지정하는 방법은 Standard ACL에서와 동일하다.

 

 

 

 

R2#show ip ospf neighbor


Neighbor ID     Pri   State           Dead Time   Address         Interface
1.1.3.3           0   FULL/  -        00:00:33    1.1.23.3        Serial0/3/1
1.1.1.1           0   FULL/  -        00:00:33    1.1.12.1        Serial0/3/0

 

 

R2에서 OSPF neighbor를 확인해 본 모습이다. 자신의 양 옆 라우터 R3(1.1.23.3), R1(1.1.12.1)과 OSPF 이웃관계를 맺고있음을 확인할 수 있다.

 

 

R3#telnet 1.1.12.1
Trying 1.1.12.1 ...Open


User Access Verification

Password: 
R1>exit

[Connection to 1.1.12.1 closed by foreign host]
R3#telnet 1.1.10.1
Trying 1.1.10.1 ...
% Connection timed out; remote host not responding

 

 

R3에서 1.1.12.1와 1.1.10.1으로 각각 telnet 접속을 시도해보았다.

permit tcp host 1.1.23.3 host 1.1.12.1 ep telnet에 의해 1.1.23.3에서 1.1.12.1으로의 telnet은 가능하다. 하지만 1.1.23.3에서 그 외 목적지로 향하는 것은 자동으로 차단되어 telnet 접속이 실패한다.

 

 

 

또한 Telnet 접속에 앞서, Telne 연결 대상자에 password가 지정되어 있어야 한다는 점을 다시 한 번 기억하도록 한다.

 

R1(config)#enable secret cisco
R1(config)#line vty 0 4
R1(config-line)#password cisco
R1(config-line)#end

 

어지간하면 위 password 명령어를 존재하는 모든 라우터에 기본적으로 설정해두면 telnet 접속이 '비밀번호를 설정 안해서' 실패하는 경우는 없다.

 

 

 

 


이름을 사용한 ACL

 

 

named ACL은 ACL을 구성할 때 번호대신 이름을 사용하는 것이다. 즉, standard / extended ACL을 만들 때 번호를 사용하면 numbered, 이름을 사용하면 named ACL이다. 이제까지 공부한 ACL은 번호를 사용하여 구성하였으므로 상세하게 말하면 standard numbered 라고 볼 수 있는 것이다. 

 

그리고 named ACL처럼 이름을 사용하면 직관적으로 이해하기 편하여 장애처리에 유용하여 자주 사용된다.

 

출발지 IP address가 1.1.23.3, 1.1.30.0/24인 것을 허용하는 ACL을 R2에서 만들어 적용하는 방법은 다음과 같다.

 

            ①                  ②        ③
 R2(config)#ip access-list standard internet-in
④R2(config-std-nacl)#permit 1.1.23.3
 R2(config-std-nacl)#permit 1.1.30.0 0.0.0.255
 R2(config-std-nacl)#exit
⑤R2(config)#interface s0/3/1
 R2(config-if)#ip access-group internet-in in

 

 

  1. 앞서 살펴보면 numbered ACL에서는 <access-list 100 permit ospf host 1.1.23.3 any> 이런식으로 설정했었다. 맨 앞에 ip라는 명령어를 입력하지 않았는데, numbered ACL에서는 사용된 번호를 참조하여 어떤 종류의 ACL인지 자동으로 확인할 수 있다. 하지만 named ACL에서는 번호를 사용하지 않기 때문에 IOS가 ACL의 종류를 판단할 수 없으므로 ip 명령어를 직접 입력하여 IP ACL이라는 것을 명시해주어야 한다.
  2. standard ACL을 사용할 것이라는 것 또한 명시해주어야 한다.
  3. ACL의 이름을 적당히 붙여준다. 알아보기 쉬운 것으로
  4. named ACL에서는 config-std-nacl 모드 (표준 IP ACL 설정모드)로 들어가게 되는데, deny / permit / remark 중 하나의 행동을 선택한다.
  5. 만들어 둔 ACL을 interface에 적용한다. 이 과정은 numbered ACL과 동일하다.

 

 

 

 

R2(config)#ip access-list extended s0/3/1-inbound
R2(config-ext-nacl)#permit ospf host 1.1.23.3 any
R2(config-ext-nacl)#permit tcp host 1.1.23.3 host 1.1.12.1 eq telnet
R2(config-ext-nacl)#permit tcp host 1.1.23.3 host 1.1.12.1 eq 80
R2(config-ext-nacl)#permit ip 1.1.30.3 0.0.0.255 1.1.10.0 0.0.0.255
R2(config-ext-nacl)#exit

R2(config)#interface s0/3/1
R2(config-if)#ip access-group s0.3.1-inbound in

 

 

위 명령어는 named ACL을 이용하여 위에서 numbered ACL로 구성했던 내용을 동일하게 구성해 본 명령어이다.

  • 출발지 IP address가 1.1.23.3인 OSPF 패킷을 permit
  • 1.1.23.3 → 1.1.12.1으로 가는 telnet 허용
  • 1.1.23.3 → 1.1.12.1으로 가는 HTTP 허용
  • 1.1.30.0/24 → 1.1.10.0/24로 가는 모든 IP traffic을 허용

 

 

 

 

 

 


IPv6 ACL

 

 

이번에는 IPv6에서 ACL을 적용해보는 경우를 알아보도록 한다. IPv4와 IPv6 ACL은 다음과 같은 차이가 있다.

 

  • named extended ACL만 사용 가능하다.
  • wildcard mask를 사용하지 않는 대신 /n 형태의 subnet mask를 지정한다.
  • interface에 ACL을 적용할 때 ip access-group 명령어 대신 ipv6 traffic-filter 명령어를 사용한다.

 

 

 

위 네트워크를 구성하기 위한 스위치, 라우터 설정은 다음과 같다.

 

SW1(config)#vlan 12
SW1(config-vlan)#vlan 34
SW1(config-vlan)#exit
SW1(config)#interface range fa0/1-2
SW1(config-if-range)#switchport mode access
SW1(config-if-range)#switchport access vlan 12
SW1(config-if-range)#exit
SW1(config)#interface range f0/3-4
SW1(config-if-range)#switchport mode access
SW1(config-if-range)#switchport access vlan 34


SW2(config)#vlan 23
SW2(config-vlan)#exit
SW2(config)#interface range f0/2-3
SW2(config-if-range)#switchport mode access
SW2(config-if-range)#switchport access vlan 23

 

 

R1(config)#interface g0/0
R1(config-if)#ipv6 address 2001:db8:1:12::1/64
R1(config-if)#no shut

R2(config)#interface g0/0
R2(config-if)#ipv6 address 2001:db8:1:12::2/64
R2(config-if)#no shut
R2(config)#interface g0/1
R2(config-if)#ipv6 address 2001:Db8:1:23::2/64
R2(config-if)#no shut

R3(config)#interface g0/1
R3(config-if)#ipv6 address 2001:db8:1:23::3/64
R3(config-if)#no shut
R3(config)#interface g0/0
R3(config-if)#ipv6 address 2001:db8:1:34::3/64
R3(config-if)#no shut

R4(config)#interface g0/0
R4(config-if)#ipv6 address 2001:db8:1:34::4/64
R4(config-if)#no shut

 

 

 

 

다음으로 각 라우터에 EIGRP for IPv6을 설정해준다. (여기서는 ACL에 대해서 다루는 상황이므로, EIGRP를 설정해주는 내용은 자세히 설명하지 않는다.)

 

R1(config)#ipv6 unicast-routing
R1(config)#ipv6 router eigrp 1
R1(config-rtr)#eigrp router-id 1.1.1.1
R1(config-rtr)#no shut
R1(config-rtr)#exit
R1(config)#interface g0/0
R1(config-if)#ipv6 eigrp 1


R2(config)#ipv6 unicast-routing
R2(config)#ipv6 router eigrp 1
R2(config-rtr)#eigrp router-id 1.1.2.2
R2(config-rtr)#no shut
R2(config-rtr)#exit
R2(config)#interface g0/0
R2(config-if)#ipv6 eigrp 1
R2(config-if)#exit
R2(config)#interface g0/1
R2(config-if)#ipv6 eigrp 1
R2(config-if)#exit


R3(config)#ipv6 unicast-routing
R3(config)#ipv6 router eigrp 1
R3(config-rtr)#eigrp router-id 1.1.3.3
R3(config-rtr)#no shut
R3(config-rtr)#exit
R3(config)#interface g0/1
R3(config-if)#ipv6 eigrp 1
R3(config-if)#exit
R3(config)#interface g0/0
R3(config-if)#ipv6 eigrp 1
R3(config-if)#exit


R4(config)#ipv6 unicast-routing
R4(config)#ipv6 router eigrp 1
R4(config-rtr)#eigrp router-id 1.1.4.4
R4(config-rtr)#no shut
R4(config-rtr)#exit
R4(config)#interface g0/0
R4(config-if)#ipv6 eigrp 1

 

 

책에는 EIGRP에 no shut을 안쳐줘서 오류가 떠서 엄청 헤맸다. EIGRP router-id 를 설정해주고 난 후에 interface에서 하는 것처럼 EIGRP도 꼭 no shutdown을 쳐줘야만 한다. (아니면 요것도 라우터 버전마다 다를수도?)

 

 

 

R1#show ipv6 route
IPv6 Routing Table - 5 entries
Codes: C - Connected, L - Local, S - Static, R - RIP, B - BGP
       U - Per-user Static route, M - MIPv6
       I1 - ISIS L1, I2 - ISIS L2, IA - ISIS interarea, IS - ISIS summary
       ND - ND Default, NDp - ND Prefix, DCE - Destination, NDr - Redirect
       O - OSPF intra, OI - OSPF inter, OE1 - OSPF ext 1, OE2 - OSPF ext 2
       ON1 - OSPF NSSA ext 1, ON2 - OSPF NSSA ext 2
       D - EIGRP, EX - EIGRP external
C   2001:DB8:1:12::/64 [0/0]
     via GigabitEthernet0/0, directly connected
L   2001:DB8:1:12::1/128 [0/0]
     via GigabitEthernet0/0, receive
D   2001:DB8:1:23::/64 [90/7680]
     via FE80::202:17FF:FE03:7B01, GigabitEthernet0/0
D   2001:DB8:1:34::/64 [90/10240]
     via FE80::202:17FF:FE03:7B01, GigabitEthernet0/0
L   FF00::/8 [0/0]
     via Null0, receive

 

 

 

EIGRP로 라우팅 프로토콜 설정을 다 마친 후에 R1에서 라우팅 테이블을 출력한 모습이다. AD 90을 가지는 것들이 EIGRP를 통해 얻어진 경로들이다.

 

 

R1#ping 2001:DB8:1:34::4

Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 2001:DB8:1:34::4, timeout is 2 seconds:
!!!!!

 

이제 R1에서 R4으로 ping이 가능하다. 여기까지 왔으면 IPv6 ACL을 설정을 시작할 수 있다. (드디어...!)

 

 

 

 

 

ACL을 설정할 내용은 다음과 같다.

  • 인터넷으로부터 내부망으로 들어오는 핑을 차단한다.
  • 내부망으로부터 인터넷으로 향하는 핑은 허용한다.

 

 

①R2(config)#ipv6 access-list Ipv6Inbound
②R2(config-ipv6-acl)#permit 88 any any
③R2(config-ipv6-acl)#permit icmp any 2001:db8:1:12::/64 echo-reply
 R2(config-ipv6-acl)#exit

 R2(config)#interface g0/1
④R2(config-if)#ipv6 traffic-filter Ipv6Inbound in

 

 

  1. IPv6 ACL은 IPv4 ACL와 달리 Extended만 사용 가능하므로 Standard / Extended를 지정해주지 않는다. 여기서는 Ipv6Inbound라고 적당한 이름을 하나 붙여주었다.
  2. EIGRP for IPv6 패킷을 허용한다.
  3. 2001:db8:1:12::/64 처럼 wildcard mask를 사용하지 않고 subnet mask 비트수를 지정해준다. 핑 응답패킷을 지정하기 위해 echo-reply 옵션을 사용하였다.
  4. interface에 접근한 후, ipv6 traffic-filter 명령어를 이용하여 해당 interface에 IPv6 ACL을 적용하였다.