본문 바로가기

Network 모험기

[기타]Prefix list와 ACL의 차이

 

실습환경도 메롱이고, 주제가 선정되기 전인데 뭔가 쓰긴 써야겠고 싶어서, 정말 별거 아닌 내용을 들고 왔습니다. 

 

사실 저는 초창기에 Prefix-list를 왜 쓰는지 잘 몰랐습니다. 

약간 'Prefix-list ACL'으로 생각되었거든요. 

ACL에 비해서 낯선 Config와 쓸데없이 Config가 길어서 거부감이 있었습니다. 

 

이제는 정확히 왜 쓰고, 어떻게도 가지고 놀수 있는지 알기때문에 한번 공유해보록 하겠습니다. 

 

1. Prefix-list 

 

Prefix-list부터 무슨 의미인지 어떻게 사용하는지 짚고 넘어가겠습니다. 

 

Prefix-list는 말그래도 Prefix들의 list를 의미합니다. 

너무 당연한 소리라고 생각되시겠지만 정말 중요합니다. 

 

10.0.0.3/24와 10.0.0.5/24의 Prefix는 같을까요? 

네 맞습니다 같습니다

 

그렇다면 10.0.0.3/24와 10.0.0.3/23의 Prefix는 같을까요? 

아뇨. 이는 다른 Prefix입니다

 

흔히들 IP에 Network부분과 Host부분이 있다고들 하고, 이 Network부분을 유식하게 부르는 말이 바로 Prefix입니다. 

바로 위의 예에서보면 IP가 같더라도 subnet mask가 다르다면 이는 다른 Prefix 취급을 하게됩니다. 

 

Prefix-list를 장비에서 적용했을때, 

ip prefix-list test permit 10.0.0.3/24와  ip prefix-list test permit 10.0.0.5/24 는 

ip prefix-list test permit 10.0.0.0/24 이라는 Prefix로 동일하게 적용되는것을 볼 수 있습니다.

 

만약 위와같이 적용된 상태에서, Redistribute나 Distribute list에 해당 Prefix를 적용했다고 가정했을때, 

10.0.0.0/25는 매칭이 될까요?  

 

정답은 매칭되지 않는다' 입니다.

 

우리가 Permit해준것은 10.0.0.0/24 단 한개의 Prefix입니다. 

10.0.0.0/25를 허용해주려면 위의 예와 같이 똑같이 아래처럼 한줄을 추가해줘야합니다. 

 

ip prefix-list test permit 10.0.0.0/25

 

타이트한 환경에서는 허용해주는 Prefix를 매번 추가해줄 수 있지만,

그렇지 않은 상황에서는 참으로 번거로운 상황이 아닐수 없습니다.

그렇기에  Prefix-list에서는 한가지 편의성을 제공해줍니다. 

바로 부등식이죠. 

 

ge (Greater or equal) : 정의한 Prefix를 기준으로 특정 값보다 크거나 같은 서브넷을 모두 포함함 

le : (Less or equal) : 정의한 Prefix를 기준으로 특정 값보다 작거나 같은 서브넷을 모두 포함함 

 

여기서 말하는 특정 값Subnet Mask의 Bit입니다. 

예를 들어보겠습니다. 

 

ip prefix-list test permit 10.0.0.0/24 ge 24 

 

위 Config의 뜻은 10.0.0.0/24를 기준으로 24보다 같거나 큰 어떤 Subnet mask가 온다한들 모두 Permit이라는 뜻입니다. 

10.0.0.30/30 도, 10.0.0.254/32 도 모두 위의 Prefix-list기준으로는 모두 허용입니다. 

 

정리해보자면 10.0.0.0/24에 속한 어떤 Prefix들 중 24보다 같거나 큰 Subnet mask를 가지는 Prefix는 모두 허용이라는 의미입니다. 

 

단, 10.0.1.1/30 은 허용되지 않습니다.

왜냐하면 우리의 기준은 10.0.0.0/24이기 떄문입니다. 

기준에 통과하지못한 Prefix는 Subnet mask가 범위 내라도 출발부터 탈락인 셈이죠

 

이번에는 똑같은 의미를 표현하는데 'ge'가 아닌  'le'를 사용해보겠습니다. 

 

ip prefix-list test permit 10.0.0.0/24 le 32 

큰 틀은 ge를 사용할 때와 동일합니다만, 부등식이 반대가 되었습니다. 

 

이는, 10.0.0.0/24에 속한 어떤 Prefix들 중 32보다 같거나 작은 Subnet mask를 가지는 Prefix는 모두 허용이라는 의미입니다. 

저는 ge를 통한 handling보다는 le를 사용한 Handling을 선호했는데, 그 이유는 기준이되는 Subnet mask bit 부터 ~ X 까지, 

이런식으로 생각해서 사용하기가 편했습니다. 

 

이런 방법으로도 활용 가능합니다. 

 

ip prefix-list test permit 10.0.0.0/24 ge 28 le 30

 

10.0.0.0/24의 기준을 만족하면서, Subnet mask가 28보다 크거나 같고, 30보다 작거나 같은 서브넷만 포함되는 셈이죠.

그렇기때문에 10.0.0.0/24은 허용되지 않습니다. 단지 기준의 역할만 하는것이고,

10.0.0.0/28, 10.0.0.16/28 이런 Prefix만 허용하게하는 Prefix-list의 완성인셈이죠.

 

이럴거면 28을 기준으로 잡으면 되지않냐 하실 수 있는데, 그렇게되면 기준이 달라집니다. 

 

ip prefix-lsit test permit 10.0.0.0/28 le 30  

 

위와 같이 정의했으면, 10.0.0.0/28은 Permit될 지언정, 10.0.0.16/28은 적용되지않습니다. 

분명한 차이가 있는셈이죠. 

 

다만 Prefix-list는 정확하게 Prefix만을 골라낼 수 있도록 정형화된 Subnet mask가 필요합니다. 

255.255.255.7 과 같은 식으로는 불가능하죠. 

사실 Prefix를 골라내기 위해 사용하는 기능인데, Prefix로 정의하지 못할 Subnet mask를 쓰는 것부터 말이 안되긴합니다. 

 

 

따라서 결론적으로,  Prefix-list는 말그래도 Prefix들의 list를 의미합니다. 

 

 

 2. ACL( Access-Control list) 

 

기본적으로 ACL은 Access를 제어하하기 위하여 설계된 기능입니다.

Inbound 혹은 Outbound 방향으로 ACL을 설정하여, 트래픽을 허용할지 차단할지를 결정하며, 

IP, ESP, AHP와 같은 Protocol 부터 TCP/UDP의 특정 Port 단위 차단이 가능한 접근 제어에 특화된 List라고 보시면 됩니다.

또한 시간에 대한 핸들링도 가능한데, 업무 시간 즉 월요일부터 금요일까지 9-18시에는 어떤 ACL이 작동하게하여,

특정 통신은 막는다던지 하는 Time base control까지 가능합니다. 

 

Standard ACL과 같이 출발지의 IP만 보는 방식과 위에 언급한대로, protocol부터 Port번호까지 보는 Extended ACL까지 제공되며,

이는 Access control뿐만 아니라, Redistribute 과 같은 라우팅 전파 제어의 역할도 가능합니다.

 

ACL은 심지어 Prefix-list와 같은 정형화된 subnet mask bit도 필요 없습니다. 

 

예를 들어보겠습니다. 

 

우리가 흔히 접근제어를 하는 할때, 아래와 같이 사용하곤 합니다. 

 

ip access-list extended test 

 deny ip 10.10.10.0 0.0.0.255 any 

 permit ip any any 

 

위 Config의 의미는 출발지가 10.10.10.0/24인 대역에서 어디를 목적지로 하던 차단하라는 의미입니다.

Inbound에 걸리던 Outbound에 걸리던 방향 차이이지 사실 의미는 같습니다. 

 

여기서 제가 0.0.0.254로 잘못 적었다면, config의 문법오류 일까요? 

답은 아닙니다.

 

여기서 한가지 짚고 넘어가겠습니다 아래 표를 보시죠. 

 

 

제가 설명드리고 싶은 부분이 바로 이부분이였습니다.

Wildcard mask의 각 Bit는 의미가 있습니다.

 

0 = 반드시 일치하여아 하는 부분 

1 = 어떤 값이던 상관없는 부분 

(Subnet mask bit는 반대로 이해해주시면 됩니다)

 

자, 그럼 10.10.10.10 은 위 표의 내용상 포함되는것을 알수 있습니다. 

10.10.11.10은 어떨까요? 

3번째 옥텟의 마지막 Bit가 0이고, Wildcard mask의 Bit또한 0이기에, 반드시 0이여야하는데 11은 1로 끝나게됩니다. 

그럼 포함되지않는것이죠 

 

이 부분을 잘 기억하면서 아래 Config를 보시죠. 

 

ip access-list extended test

 deny ip 10.10.10.0 0.0.0.254 any 

 permit ip any any 

 

 

원래대로라면, 4번째 옥텟이 무슨 값이던, 앞선 3개의 옥텟이 모두 일치한다면 포함되었지만 사정이 달라졌습니다. 

4번째옥텟의 마지막은 무조건 0이여야하는것이죠. 

 

그럼 이 ACL에 포함되는 몇개의 IP만 기재해 보겠습니다. 

 

10.10.10.0, 10.10.10.2, 10.10.10.4, 10.10.10.6 .. 

 

당연히 눈치를 채셨겠지만 설명하자면, 이제 저 ACL은 10.10.10.0/24 중 4번째 옥텟이 짝수일때만 포함되어지게 된겁니다. 

전체 Config로 보았을때, 출발지(Source IP)가 짝수일때만 Deny, 그 외에는 Permit이 되버린것이죠. 

 

ip access-list extended test

 deny ip 10.10.10.1 0.0.0.254 any 

 permit ip any any 

 

그렇다면 위의 Config가 의미하는 바는 명확합니다. 10.10.10.0/24 중 4번째 옥탯이 홀수인 경우만 Deny, 그 외는 Permit이 되는것이죠. 

 

한번만 더 해보겠습니다. 

이제는 마지막 옥텟이 8의 배수일때만 Deny하는 Config입니다. 

 

ip access-list extended test

 deny ip 10.10.10.0 0.0.0.248 any 

 permit ip any any 

 

1,2,4를 의미하는 마지막 3개를 전부 0으로 고정시켜놓았기때문에, 변경이 가능한 Bit는 네번째 옥텟의 앞 5bit밖에 되질 않습니다. 

8,16,24,32 등과 같은 8의 배수만 Deny하는 ACL이 만들어진것이죠. 

 

그리고 반드시 잊지말아야하는, ACL의 마지막에는 All deny가 포함되어 있습니다. 

Zero trust를 위해 Whitelist를 만든다고 Permit으로만 ACL을 꾸릴 수도 있겠지만, WAN에서는 BGP, IPSec 관련 Port 등 , LAN에서는 심지어 HSRP Multicast IP까지 열어줘야하기때문에, 네트워크 장비에서 All deny를 활용하시고자 한다면,

정말 세심하게 검토하고 또 검토하고 설정해야 하는점 알아두시면 좋습니다. 

 

이렇기 다양한 기능을 제공하는 ACL 때문에 제가 일을 시작한지 얼마 안된 초반에는

Prefix-list가 제공하는 모든 기능을 ACL로 사용할 수 있는데 왜 Prefix-list를 쓰냐고 착각을 한겁니다.

 

 

 

3. 차이점 

 

아래 구성도를 보면서 한번 이야기해봅시다. 

 

 

 

ISP들로부터 0.0.0.0/0 (Default routing) 이외에도 ISP가 제공하는 특정 서비스에 대한 공인IP 대역이 흘러들어올 수 있습니다. 

물론 BGP Capacity 기능을 활용하여, ISP측에서 광고하는 대역을 CE에서 조정할 수도 있겠지만,

이는 PE의 협조가 필요하기에, 조건부로 할 수 있는 설정이라 저는 굳이 추천하고 싶지는 않습니다. 

(BGP의 Capacity 기능은 제가 다룬적이 없는것같은데, 시간 내서 한번 다루겠습니다. 생각보다 재밌는 기능입니다) 

 

위의 구성도처럼 구성되어있다고 가정했을때, 엔지니어 입장에서 디폴트 라우팅(0.0.0.0/0)만 받고싶다 가정해보겠습니다. 

ACL을 통해서 0.0.0.0/0을 허용하게 된다면 어떻게 될까요? 

 

ip access-list extended test

 permit  ip 0.0.0.0 0.0.0.0 any 

 deny ip any any 

 

route-map test permit 10 

 match ip address test 

 

router bgp 1 

 neighbor 1.1.1.1 route-map test in 

 

정답은 정확히 0.0.0.0 만 BGP table로 올라가게 됩니다. 

 

0.0.0.0을 확실하게 지정해줬기 때문입니다. 

 

다른 예를 들어보겠습니다. 

 

10.10.0.0/16

10.10.2.0/24

10.10.4.0/24 

      등등 

 

특수한 상황이긴 한데, 만약에 eBGP로부터 위의 대역을 받고 있고, 10.10.0.0/16만 BGP table로 올려야 할때, 

ACL로 정확하게 분리할 수 있을까요 ? 

 

아니요. 못합니다. 

 

10.10.0.0/16을 허용하는 순간, 자동적으로 하위 서브넷은 All permit이 되어버립니다. 

Prefix로 써보자면, 

10.10.0.0/16 le 32 로 표현할 수 있겠네요

 

이런 경우는 왕왕 존재합니다.

LAN의 aggressive L3 스위치의 가시성을 확보하고자 모든 Prefix를 포함하는 대역만 분리해서 전달을 원할수도 있으며,

어떤 큰 클래스의 특정 서브넷 단위만 전달받고 싶어할때, ACL로는 처치 곤란입니다.

제일 세분화해서 쪼갠다고 한들, 만약 그 안에 전달받고 싶지않은 Subnet이 포함되어있다면,

고객의 니즈를 반영하지 못한게 됩니다.

 

이런 상황에서 사용할 수 있도록 Prefix-list가 개발된 것입니다.

정확하게 원하는 대역만 특정이 가능하다는것은 Config가 복잡해도 활용할 여지는 충분합니다. 

 

 물론 이러한 특수한 상황이 아닌 경우에는 ACL로 대부분 처리할 수 있지만, 

상황별로 사용할 수 있는 기술이 늘어난것은 엔지니어 입장에서는 편하다고 생각합니다. 

 

 

4. 맺으며 

 

사실 제가 간단히 적었지만, ACL은 정말 많은 기능을 내포하고 있습니다. 

별개의 주제로 다뤄도 될정도로 다양한 기능을 제공합니다. 

 

다만, ACL로는 요청한 서비스를 제공하기 어려운 상황일 때,

Prefix단위로 뭔가를 제어해야할 때, Prefix-list는 정말 유용하게 사용 될겁니다. 

 

상황에 맞게 적절하게 사용할 줄 아는것이 참 어렵긴 하지만,

차이를 분명히 안다면 ACL과 Prefix-list 정도는 충분히 활용하실 수 있을거라 믿으면서, 포스팅을 마치겠습니다.