~/network/concepts/vacl
보안

VACL

1. ACL이 걸리는 세 지점

Nexus에서 ACL은 서로 다른 세 지점에 붙을 수 있고, 이름과 성격이 다르다.

구분적용 대상적용 명령방향 지정
PACL (Port ACL)L2 물리 포트 / port-channelip port access-group <acl> in입력만 (in)
VACL (VLAN ACL)VLAN 전체vlan filter <map> vlan-list <id>없음
RACL (Router ACL)L3 인터페이스 (SVI, routed port)ip access-group <acl> {in|out}in / out

여기서 VLAN과 SVI를 같은 대상으로 묶지 않는 것이 중요하다. VLAN은 L2 브로드캐스트 도메인이고, interface Vlan563 같은 SVI는 그 도메인에서 L3로 나가고 들어오는 출입구다. 이름이 비슷해 "VLAN 인터페이스에 걸린 ACL이니 VACL"로 읽기 쉽지만, 둘은 별개의 지점이고 붙는 ACL도 다르다.

        [라우팅 테이블 / 다른 서브넷]
        ┌──────────┴──────────┐
        │  interface Vlan563   │  ← SVI (L3 출입구) : RACL이 붙는 곳
        └──────────┬──────────┘
     ═══════════════════════════════  ← VLAN 563 (L2 도메인) : VACL이 붙는 곳
    │              │              │
10.78.9.102   10.78.9.200   10.78.8.161

그래서 구분 기준은 설정이 어디에 들어가는가다.

설정 위치종류
interface Vlan563 하위의 ip access-group ... in|outRACL
전역 설정의 vlan filter <map> vlan-list 563VACL

SVI 설정에서 흔히 보는 아래 형태가 RACL이다.

interface Vlan563
  ip access-group SOME_OUT_Filter out

VACL은 interface Vlan563 블록 안에 들어가지 않고, VLAN 번호를 인자로 받는 별도 명령으로 붙는다. 명령 계통 자체가 다르므로 구성을 보면 바로 구분된다.

vlan access-map SOME_MAP 10
  match ip address SOME_ACL
  action forward
vlan filter SOME_MAP vlan-list 563

ip access-group ... in|out이 보이면 VACL이 아니라 RACL이며, 뒤이어 설명하는 방향 개념도 RACL에만 해당된다. 붙는 지점이 다르다는 사실은 같은 VLAN 내부 통신에서 드러난다. 10.78.9.102 → 10.78.9.200은 같은 서브넷이라 라우팅이 필요 없고 SVI를 아예 지나가지 않으므로, SVI에 걸린 RACL은 이 패킷을 볼 수 없다. VACL은 잡는다. (3-2 참고)


2. RACL의 방향: 기준점은 "스위치"다

        [스위치 라우팅 엔진]
       in ↑    │    ↓ out
   ┌───────────┴───────────┐
   │      VLAN 호스트       │
   └───────────────────────┘
  • in = 호스트가 보낸 패킷이 스위치로 들어오는 것 → 호스트 입장에서는 "나가는" 트래픽
  • out = 스위치가 호스트 쪽으로 내보내는 것 → 호스트 입장에서는 "들어오는" 트래픽

방화벽 정책은 보통 존/보호대상 기준으로 "인바운드"를 말한다. 기준점이 호스트 쪽이다. 기준점이 서로 반대라서 같은 패킷을 두고 라벨이 뒤집힌다.

이 때문에 "물리 방화벽이 inbound면 SVI는 out"이라는 식의 대응 관계를 외우는 경우가 있다. 자주 맞기는 하지만 법칙은 아니다.

대응 관계가 깨지는 경우

  • 방화벽 정책을 존 기준이 아니라 인터페이스 기준으로 운용하는 조직
  • 방화벽이 클라이언트 앞이 아니라 서버 앞에 있는 구성 → 방화벽 인바운드가 SVI in에 대응
  • 한쪽 방향에만 필터가 걸려 있어 애초에 대응시킬 대상이 없는 경우

외우는 대신, ACL이 걸린 인터페이스 위에 서서 "이 패킷이 지금 어느 쪽으로 이 인터페이스를 통과하나" 만 보면 된다.


3. VACL의 핵심 성질

3-1. 방향이 없다

RACL은 인터페이스를 통과하는 방향을 지정하지만, VACL은 해당 VLAN에 속한 트래픽 전체에 적용된다. in/out 키워드가 문법에 존재하지 않는다.

따라서 VACL의 ACL을 쓸 때는 정/역방향을 한 access-map 안에서 양쪽 다 고려해야 한다. RACL처럼 "이 방향만 보면 된다"는 식으로 좁혀 생각할 수 없다.

3-2. bridged 트래픽까지 잡는다

RACL은 라우팅되는(L3로 넘어가는) 트래픽만 본다. 같은 VLAN 안의 호스트끼리 통신(같은 서브넷 간 L2 스위칭)은 SVI를 지나지 않으므로 RACL에 걸리지 않는다.

VACL은 같은 VLAN 내부 통신까지 필터링한다. "같은 서브넷 안에서의 접근 제어"가 필요할 때 쓰는 도구다.

10.78.9.102 ──────────────► 10.78.9.200   (같은 VLAN)
             RACL: 안 걸림
             VACL: 걸림

3-3. 매칭되지 않으면 drop이다

VACL의 access-map 어느 항목에도 매칭되지 않은 패킷은 폐기된다. 마지막에 광범위 permit 항목을 두지 않으면 해당 VLAN 통신이 통째로 끊긴다.

운영 중인 VLAN에 VACL을 새로 붙이는 작업이 위험한 이유가 이것이다. 반드시 마지막 항목을 확인하고 작업해야 한다.

3-4. IP 외에도 매칭 가능

vlan access-map MAP 10
  match ip address ACL_NAME      ← IPv4
  match ipv6 address ACL6_NAME   ← IPv6
  match mac address MACL_NAME    ← 비IP 트래픽

4. VACL 구성 문법

! 1) 매칭용 ACL 정의
ip access-list VACL_MATCH_DENY
  10 permit tcp 10.78.9.0/24 10.78.9.200/32 eq 22

ip access-list VACL_MATCH_ANY
  10 permit ip any any

! 2) access-map으로 ACL과 동작을 묶음
vlan access-map V563_MAP 10
  match ip address VACL_MATCH_DENY
  action drop
  statistics per-entry

vlan access-map V563_MAP 20
  match ip address VACL_MATCH_ANY
  action forward

! 3) VLAN에 적용
vlan filter V563_MAP vlan-list 563

읽는 법

  • access-map은 시퀀스 순서대로 평가되고, 첫 매칭에서 멈춘다.
  • actionforward 또는 drop이며, ACL 안의 permit/deny와는 의미가 다르다.
    • ACL의 permit은 "이 트래픽이 이 항목에 해당된다"는 뜻일 뿐이다.
    • 실제 허용/차단은 action이 결정한다.
    • permit + action drop = 차단이다. 헷갈리기 쉬운 지점이다.
  • ACL 안의 deny는 "이 항목에 해당되지 않음"으로 처리되어 다음 access-map 시퀀스로 넘어간다.
  • statistics per-entry를 넣으면 히트 카운트를 볼 수 있어 검증에 유용하다.

5. 적용 순서

여러 종류의 ACL이 동시에 걸린 경우, 패킷은 대략 다음 순서로 검사된다.

[입력 포트] PACL → VACL → 입력 RACL → (라우팅) → 출력 RACL → VACL

주의: 이 순서는 플랫폼과 NX-OS 릴리스에 따라 세부 차이가 있다. 특히 라우팅되는 트래픽에서 VACL과 RACL의 상대적 순서, 그리고 출력 측 VACL 적용 여부는 기종별로 다르게 문서화되어 있다. 실제 설계에 반영할 때는 해당 장비/버전의 Security Configuration Guide를 직접 확인해야 한다.

핵심만 기억하면 된다: 어느 한 단계에서 drop되면 뒤 단계는 보지 않는다. 여러 ACL이 겹친 VLAN에서 통신이 안 될 때는 "어느 단계에서 죽었는지"를 순서대로 좁혀가야 한다.


6. 정방향·역방향 정책 작성

RACL도 VACL도 stateless다. 세션을 추적하지 않는다.

  • 방화벽(stateful): 정방향 정책 하나면 리턴 트래픽이 자동 허용된다.
  • 스위치 ACL(stateless): 정방향과 역방향을 각각 명시해야 한다.

ACL 라인의 문법은 아래 형태다.

permit tcp <출발지> [출발지포트] <목적지> [목적지포트]

포트 연산자(eq, range)는 바로 앞에 나온 주소에 붙는 옵션이며 생략 가능하다.

정방향 (클라이언트 → 서버 22번):

permit tcp 10.78.9.102/32 10.77.126.185/32 eq 22
              └출발지┘         └─목적지─┘  └목적지포트┘

역방향 (서버 22번 → 클라이언트):

permit tcp 10.77.126.185/32 eq 22 10.78.9.102/32
              └─출발지─┘  └출발지포트┘  └─목적지─┘

역방향에서 목적지 포트를 지정하지 않는 이유: 클라이언트가 받는 포트는 임시 포트(ephemeral, 대략 1024~65535 중 랜덤)라서 특정할 수 없다.

"목적지 → 출발지로 뒤집어서 걸어라"는 지시는 신청 기준의 목적지가 이 라인에서는 출발지 자리에 온다는 뜻이고, 문법 어순이 바뀐다는 뜻이 아니다.


7. 확인 명령어

! RACL 적용 상태
show run int vlan <id>
show ip access-list <ACL_NAME>

! VACL 적용 상태
show vlan filter
show vlan access-map
show vlan access-list <MAP_NAME>

! 히트 카운트 (statistics per-entry 설정 시)
show ip access-list <ACL_NAME> statistics
clear ip access-list counters <ACL_NAME>

시퀀스 번호를 지정해 라인을 끼워 넣을 때는 반드시 show ip access-list해당 구간이 비어 있는지, 앞선 permit/deny 순서에 영향이 없는지 확인한다.