📌 ACL(ACcess-List)란?
ACL(Access Control List, 접근 제어 목록)은 네트워크 보안에서 특정 트래픽을 허용하거나 차단하는 규칙 목록임
즉, 어떤 사용자가(또는 기기/네트워크) 어떤 리소스에 접근할 수 있는지 정의하는 규칙 집합임
1. ACL의 역할
ACL은 네트워크 보안을 강화하고, 트래픽을 제어하는 데 사용됩니다. 주요 역할은 다음과 같습니다.
✅ 보안 강화 → 허가되지 않은 접근 차단
✅ 트래픽 제어 → 특정 IP, 포트, 프로토콜 기반 필터링
✅ 네트워크 성능 향상 → 불필요한 트래픽 차단으로 부하 감소
✅ 접근 제어 → 특정 사용자 또는 기기만 허용
2. ACL의 종류
ACL은 두 가지 유형으로 나뉩니다.
![](https://blog.kakaocdn.net/dn/dskEBH/btsMcG1wAoV/hlyL6aPgOzQLuyD2KKtTS0/img.png)
① 표준(Standard) ACL/ ACL 번호 대역 <1-99> or <1300-1999>
- 출발지 IP 주소만 기반으로 트래픽을 허용하거나 차단
- 포트 번호, 프로토콜 등의 세부 설정이 불가능
- 주로 라우터의 가까운 쪽(출발지 근처)에서 적용
🔹 예시 (Cisco IOS 명령어)
access-list 10 permit 192.168.1.0 0.0.0.255 # 192.168.1.0 대역은 허용하고
access-list 10 deny any #나머지 대역은 차단함
- access-list의 끝에는 항상 deny all이 생략되었음(암묵적 거부)
- 같은 정책이라도 포트에서 in 하냐 out 하냐에 따라 전혀 다른 정책이 되기 때문에 잘 적용을 시켜야 하고, 그랬을 때 in or out을 결정하는 주체는 라우터 기준으로 생각하면 됨.
② 확장(Extended) ACL/ ACL 번호 대역 <100-199> or <2000-2699>
- 출발지 및 목적지 IP, 프로토콜(TCP, UDP 등), 포트 번호까지 세부 제어 가능
- 특정 서비스(예: 웹, FTP, SSH 등)만 허용/차단 가능
- 주로 목적지 근처에서 적용 (필터링 후 불필요한 트래픽 방지)
🔹 예시 (Cisco IOS 명령어)
access-list 101 permit tcp 192.168.1.0 0.0.0.255 any eq 80
access-list 101 deny ip any any
➡️ 192.168.1.0/24 대역에서 웹(포트 80) 트래픽만 허용, 나머지는 차단
3. ACL 적용 방법
ACL은 네트워크 장비(라우터, 방화벽 등)에서 인터페이스에 적용하여 동작합니다.
✅ inbound (들어오는 트래픽)
✅ outbound (나가는 트래픽)
🔹 적용 예시 (Cisco IOS 명령어)
interface GigabitEthernet0/0
ip access-group 101 in
➡️ GigabitEthernet0/0 인터페이스에 ACL 101을 들어오는 방향(Inbound) 에 적용
➡️ 같은 정책이라도 포트에서 in을 하냐 out을 하냐에 따라 전혀 다른 정책이 되기 때문에 잘 적용을 시켜야 하고, 그랬을 때 in or out을 결정하는 주체(=라우터)는 그 장비를 기준으로 생각하면 안 됨
4. ACL 사용 예시
✅ 사내 네트워크에서 특정 IP만 인터넷 접속 허용
✅ FTP 서버에 대한 특정 IP 대역만 접근 허용
✅ 웹 트래픽(HTTP, HTTPS)만 허용하고 나머지 차단
✅ 외부에서 내부 네트워크 접근 차단(방화벽 역할)
실습
- ACL을 하는 동안 NAT을 하면 안 됨
- mint와 web이 서로 통신되도록 만들어보자-
![](https://blog.kakaocdn.net/dn/Apm7y/btsL6XQy23a/LBfVA6xMlY4jmoFXyhOkUK/img.png)
mint 서버
![](https://blog.kakaocdn.net/dn/WCIoZ/btsL7qLCTJV/QKba96TzCj3IoMCaXVKSUK/img.png)
- vm 대역도 바꿔주기 vm1로
R2에서 f0/0에서 출발지 주소가 10.10.1.0/24인 접속만 차단하고, 나머지는 다 허용하는 정책을 access-list 1로 만들어서 적용시켜 보자.
1. 정책 생성
R2(config)#access-list 1 deny 10.10.1.0 0.0.0.255
R2(config)#access-list 1 permit any
2. 정책을 특정 인터페이스에 in 혹은 out에 반영
R2(config)#int f0/0
R2(config-if)#ip access-group 1 in
R2(config-if)#no ip access-group 1 in
- 정책 삭제 후에 접속을 해보자
****왜... f0/0에 10.10.1.0 대역을 막았는데, 왜 10.10.2.0 대역이 못 가는 거지?
10.10.1.0 대역에서 R2로 가는 f0/0 막으면 mint서버에서 web으로 요청 보내는 게 막힘
그리고 mint서버에서 2.0 대역을 막고 싶은 거면 deny 2.0 대역을 해야 되는 게 아닌가?
라고 생각할 수도 있지만, 그건 반대일 경우에 가능함, web서버에서 mint서버로 요청 보내는 경우일 때 10.10.2.0 대역을 막는 것임
실습 1) 이번에는 access-list 2를 통해 10.10.1.0 /25만 R2의 f0/1에서 막아보세요.
- 접근제어를 다룰 때는 항상 내가 의도한 대로 구성됐는지를 확인하는 게 제일 중요
= A를 안되게 하고 싶다. = 원래 A가 됐었는데, 내가 의도한 대로 구성한 후 안됨
R2(config)#access-list 2 deny 10.10.1.0 0.0.0.127
R2(config)#access-list 2 permit any
R2(config)#int f0/1
R2(config-if)#ip access-group 2 out
- 안 되는 걸 확인
실습 2) R1에서도 access-list 1을 통해 f0/0에서 출발지가 10.10.1.0 /25인 패킷을 막아보세요
R1(config)#access-list 1 deny 10.10.1.0 0.0.0.127
R1(config)#access-list 1 permit any
R1(config)#int f0/0
R1(config-if)#ip access-group 1 out
실습 3) vmnet1에 10.10.1.200 /24 인 client서버를 한대 두세요.
R2의 f0/0에 access-list를 통해 10.10.1.0 /25는 허용하여 mint가 웹서버에 접속되는지 확인하고, 10.10.1.128 /25는 거부를 하여 client가 웹 접속이 안되는 것을 확인해 보세요
10.10.1.128 /25는 거부를 하여 client가 웹 접속이 안되는 것을 확인해 보세요
-> 128보다 큰 범위는 접속을 거부하고 128보다 작은 범위는 허용한다.
/25 -> 1000 0000 -> 여기부터 증가하는 모든 수를 허용
즉, mint서버는 허용되지만 client 서버는 거부된다.
- 전에 해준 겹치는 deny영역은 다 지워주기
1. 정책생성
R2(config)#access-list 1 per 10.10.1.0 0.0.0.127 #mint 서버 허용 10.10.1.100인 .128보다 작기 때문에 허용
R2(config)#access-list 1 deny 10.10.1.128 0.0.0.127 #client 서버 거부 10.10.1.200은 .128보다 크기 때문에 막힘
R2(config)#access-list 1 per any
2. 정책반영
R2(config-if)#ip access-group 1 in
- client에서는 핑 및 curl이 안되고
- 민트에서는 웹접속이 되는 것을 확인
실습 3-1) 추가적으로 기존의 설정을 삭제하지 말고, R2의 f0/0에서 출발지가 10.10.2.0 /24인 트래픽을 거부시켜 보세요.
f0/0의 out에 access-list 2를 만들어서 10.10.2.0 /24를 거부해 보자
int f0/0
R2(config-if)#ip access-group 2 out
R2(config)#access-list 2 deny 10.10.2.0 0.0.0.255
R2(config)#access-list 2 per any
- 웹서버(10.10.2.80)에서 R1으로 핑을 쳐보면 안되는 것을 확인 가능하다.
- 민트로 돌아와서 웹서버에 접속을 해보자. 아까 되는것을 확인했었는데 지금은 안 된다.
ACL이 Stateless 한 이유
ACL(Access Control List)은 패킷이 들어오거나 나갈 때 규칙을 적용해서 허용하거나 차단하는 역할을 해. 하지만 패킷의 "이전 상태"를 기억하지 않기 때문에 융통성이 없어.
👉 예제: 웹 접속이 막힌 이유
- Mint(10.10.1.100) → Web(10.10.2.80)으로 요청 보냄 (출발지: 10.10.1.100, 목적지: 10.10.2.80)
- ACL이 10.10.2.0/24 대역의 트래픽이 f0/0 인터페이스에서 나가는 걸 차단함.
- Web(10.10.2.80)이 응답을 보내려고 해도, ACL이 나가는 트래픽을 막아서 응답이 돌아오지 못함 → 웹 접속 실패! ❌
👉 즉, ACL은 단순히 "들어오는 것"과 "나가는 것"을 따로 적용하기 때문에 한쪽이 허용되어도 왕복이 안 되면 통신이 안 됨.
확장(Extended ACL)
표준 ACL이 출발지의 IP를 제어했다면 출발지, 목적지 IP뿐 아니라 포트까지 전부 제어할 수 있음.
민트에서 웹서버로 웹접속은 허용하고, 다른 모든 트래픽은 차단해 보자.
민트 - 웹서버 관계에서 웹 접속은 되고, ping이나 기타 ftp 같은 다른 프로토콜은 안되어야 함.
차단되는 대상이 누구인가?
민트-웹서버의 http를 제외한 다른 모든 출발지, 목적지의 프로토콜들.
R2의 f0/0에서 in에 적용할 확장 ACL 정책을 만들어보자.
cisco 실습
access-list 100 permit tcp host 10.10.1.100 host 10.10.2.80 eq 80
- access-list<ACL을 정의하는 데 사용> 100 permit tcp host 10.10.1.100<출발지 ip> host 10.10.2.80<목적지 ip> equal 80<http 포트 번호를 사용한다는 의미임>
- 가는 정책
R2(config)# int f0/0
R2(config-if)#ip access-group 100 in
- R2(config-if)#ip access-group 100<정의한 ACL을 실제 인터페이스에 적용하는 데 사용됨> in<들어오는 트래픽>
- 가는 정책 적용.
R2(config-if)# exit
access-list 110 permit tcp host 10.10.2.80 eq 80 host 10.10.1.100
- 왔다가 돌아가는 정책
R2(config)# int f0/0
R2(config)# ip access-group 110 out<나가는 트래픽>
- 빨간색 정책 (오른쪽 라우터 R2에서 f0/0에 in)
출발지에서 어떤 포트로 나가는지는 모르기 때문에 명시하면 안 됨
목적지는 80번 포트임이 분명함
access-list 100 permit tcp host 10.10.1.100 host 10.10.2.80 eq 80
- 파란색 정책(오른쪽 라우터 R2에서 f0/0에 out)
출발지는 어차피 웹서버의 80번 포트일 것이다. 왜? 들어올 때 목적지가 80번 포트였기 때문.
따라서 출발지에서 포트를 명시하고 반대로, 목적지(mint)로 들어갈 때는 마찬가지로 나온 포트로 들어갈 것이기 때문에 어떤 포트로 나왔는지는 고려 대상도 아니고 알 수도 없다. 따라서 포트를 명시하면 안 됨
int f0/0
ip access-group 100 in
ip access-group 110 out
# 반영
'AWS Cloud School 8기 > 서버가상화_클라우드 이미지' 카테고리의 다른 글
VyOS 실습 (코드만) (0) | 2025.02.11 |
---|---|
VyOS Firewall (0) | 2025.02.11 |
VyOS/ (VyOS nat 해제) (0) | 2025.02.06 |
web + db + tomcat 실습(코드만) (3) | 2025.02.06 |
3-Tier Architecture (3계층 아키텍처)/ Reverse Proxy (리버스 프록시) (0) | 2025.02.06 |