인프라 Access-List
ACL 여정 4/5 — 앞 세 편은 “지나가는” 트래픽을 걸렀습니다. 이번 편은 관점을 바꿔 네트워크 장비 자체를 향하는 트래픽을 보호합니다.
라우터 보안 정책 강의에서 설명했듯이, 라우터는 종종 네트워크 가장자리에서 사용되어 공격에 취약합니다. 이 때문에 가장 일반적인 공격 일부를 차단하면서 정말 필요한 트래픽만 허용하는 access-list가 있어야 합니다.
access-list가 어떻게 보일지는 라우터의 역할에 따라 달라집니다. 인터넷 접속을 위해 사용자가 뒤에 있는 NAT/PAT용으로 사용하나요, 아니면 인터넷의 트랜짓 라우터인가요? VPN이나 BGP를 사용하나요? 어떤 종류의 트래픽이 라우터를 통과하나요? 인프라 access-list를 만들기 전에 답해야 할 모든 질문입니다.
인프라 access-list가 어떻게 생겼는지 보여드리기 위해 일반적인 인프라 access-list에서 볼 수 있는 몇 가지 일반 문장을 보여드리겠습니다.
1. 구성
토폴로지는 다음과 같습니다.
위의 라우터는 인터페이스 하나로 인터넷에 연결되어 있고 공인 IP 주소를 가지고 있습니다. 라우터 뒤에는 인터넷 접속이 필요한 호스트가 있습니다.
1.1. ICMP 패킷 필터링
ICMP는 디버깅, 트러블슈팅, 오류 보고에 중요한 프로토콜이므로 완전히 차단해서는 안 됩니다. 그러나 정찰이나 DoS 공격에 악용될 수 있으므로 제한하는 것이 현명할 수 있습니다.
R1(config-ext-nacl)# permit icmp any any echo-reply
R1(config-ext-nacl)# permit icmp any any unreachable
R1(config-ext-nacl)# permit icmp any any time-exceeded
R1(config-ext-nacl)# deny icmp any any위 access-list 문장으로 핑에 응답할 수 있도록 echo-reply만 허용합니다. unreachable과 time-exceeded는 traceroute에 필요합니다. 다른 모든 ICMP 유형은 거부됩니다.
1.2. IP Fragment 필터링
조각화(fragmentation)는 IP 패킷을 여러 개의 더 작은 패킷으로 나누는 프로세스입니다. 이는 패킷이 인터페이스 MTU에 비해 너무 클 때 유용할 수 있습니다.
조각화의 문제는 여러 익스플로잇이 있다는 것이므로, 모든 조각화된 패킷을 드롭하는 것이 현명할 수 있습니다.
R1(config-ext-nacl)# deny ip any any fragments1.3. RFC 3330 주소 필터링
RFC 3330은 IPv4용으로 할당된 특수 주소를 설명합니다. 인터넷 연결에서 받을 수 있는 정상적인 패킷 중에 이러한 특수 주소를 소스 주소로 가진 것은 없습니다.
R1(config-ext-nacl)# deny ip host 0.0.0.0 any
R1(config-ext-nacl)# deny ip 127.0.0.0 0.255.255.255 any
R1(config-ext-nacl)# deny ip 192.0.2.0 0.0.0.255 any
R1(config-ext-nacl)# deny ip 224.0.0.0 15.255.255.255 any이 문장들을 설명해 보겠습니다.
- 0.0.0.0을 소스 IP 주소로 사용하는 IP 패킷은 절대 봐서는 안 되므로 차단합니다.
- 127.0.0.0/8 범위는 루프백용입니다. 인터넷에서 이 주소를 사용하는 IP 패킷은 절대 봐서는 안 됩니다.
- 192.0.2.0/24는 IANA에 의해 TEST-NET으로 할당되었으며, 이 범위의 주소는 인터넷에서 사용되지 않습니다.
- 224.0.0.0/4는 멀티캐스트 범위입니다.
1.4. RFC 1918 주소 필터링
사설 주소는 로컬 네트워크에서 사용되므로, 인터넷에서 사설 주소를 소스로 가진 IP 패킷은 봐서는 안 됩니다.
R1(config-ext-nacl)# deny ip 10.0.0.0 0.255.255.255 any
R1(config-ext-nacl)# deny ip 172.16.0.0 0.15.255.255 any
R1(config-ext-nacl)# deny ip 192.168.0.0 0.0.255.255 any1.5. RFC 2827 주소 필터링
자체 공인 주소 공간이 있다면 access-list에 추가해야 합니다. 인터넷에서 자신의 IP 주소 중 하나를 소스로 가진 IP 패킷은 절대 봐서는 안 됩니다. 이런 패킷은 거의 100% 스푸핑된 트래픽이므로 인바운드에서 바로 차단합니다.
R1(config-ext-nacl)# deny ip <MY_PUBLIC_RANGE> <WILDCARD> any예를 들어 자체 할당 범위가 203.0.113.0/24라면 다음과 같이 걸어둡니다.
R1(config-ext-nacl)# deny ip 203.0.113.0 0.0.0.255 any반대 방향(아웃바운드)에서는 “내 네트워크에서 나가는 패킷의 소스는 반드시 내 주소 공간이어야 한다”는 규칙을 걸어 두면, 내부에서 감염된 호스트가 외부로 스푸핑 공격을 내보내는 것을 막을 수 있습니다(BCP 38의 기본 정신입니다).
1.6. BGP 필터링
ISP와 BGP 피어링하는 라우터라면, 루프백/링크 서브넷과 BGP(TCP 179) 포트 사이의 트래픽은 반드시 열어두어야 합니다. 그렇지 않으면 access-list 자체가 BGP 세션을 끊어버립니다.
R1(config-ext-nacl)# permit tcp host <PEER_IP> host <LOCAL_IP> eq bgp
R1(config-ext-nacl)# permit tcp host <PEER_IP> eq bgp host <LOCAL_IP>두 문장이 필요한 이유는 BGP가 먼저 세션을 여는 쪽이 소스 포트를 랜덤으로 쓰고 목적지 포트를 179로 쓰기 때문입니다. 어느 쪽이 먼저 세션을 열지 미리 알 수 없으므로 양방향 모두 허용해야 합니다.
그 외에 라우팅/관리 프로토콜이 라우터로 직접 들어와야 한다면(OSPF, SSH, SNMP 등) 같은 방식으로 명시적으로 열어주고, 마지막에 deny ip any any log로 나머지를 막습니다.
R1(config-ext-nacl)# deny ip any any log2. 결론
- 인프라 access-list는 라우터에 꽂히는 “기본 보안 툴킷” 같은 개념입니다. 방화벽이 별도로 있어도, 라우터 스스로가 경계에서 명백히 잘못된 트래픽(특수/사설 주소, 스푸핑, 과도한 ICMP 등)을 걸러내도록 해두는 것이 좋은 모범 사례입니다.
- ICMP는 완전히 막지 말고
echo-reply,unreachable,time-exceeded정도는 허용해 운영(ping, traceroute)을 유지합니다. - RFC 3330/1918/2827 범위는 모두 “인터넷에서 소스로 올 일이 없는” 주소이므로 인바운드에서 바로 드롭합니다.
- BGP 등 필수 제어 트래픽은 명시적으로 열고, 마지막에
deny ip any any log로 가시성을 확보합니다. - 실제 배치 위치는 라우터 역할(트랜짓, 에지, VPN 종단 등)에 따라 다르므로, 이 강의의 내용은 그대로 복붙하는 템플릿이 아니라 출발점으로 보고 환경에 맞게 다듬어 사용해야 합니다.
출처: networklessons.com - Infrastructure Access-List
태그: ACL, Security
→ 다음 편: 14_시간 기반 ACL — 고정 규칙을 넘어 업무시간/야간 차등 정책을 짭니다.