프록시 캐시 동작 원리
프록시 서버는 클라이언트와 원격 서버 사이에서 중계 역할을 수행한다. 첫 번째 사용자가 파일을 요청하면 프록시가 해당 파일을 로컬에 저장하고, 이후 동일한 요청이 발생할 때 원격 서버 대신 캐시된 복사본을 제공한다.
주요 이점은 다음과 같다:
- 응답 시간 단축: 원격 요청 감소로 지연 시간 최소화
- 대역폭 절약: 반복되는 데이터 전송량 감소
- 중앙 집중식 보안 관리: 전사적 네트워크 접근 정책 적용
추가적으로 특정 웹사이트, 포트, 서비스에 대한 접근을 허용하거나 차단할 수 있다. 예를 들어 쇼핑몰, 채용 사이트, 게임, 동영상 플랫폼 접근을 금지하거나 특정 시간대에만 외부 인터넷 사용을 허용할 수 있다.
배포 모드 비교
| 모드 | 설정 방식 | 사용자 인지 | 적용 환경 |
|---|---|---|---|
| 선택적 프록시 | 비강제 | 명시적 | 성능 최적화 |
| 명시적 강제 프록시 | 수동 설정 | 명시적 | 기업 기본 통제 |
| 투명 프록시 | 게이트웨이 자동 라우팅 | 무감각 | 엄격한 규정 준수 |
Squid 설치 및 기본 환경 구성
네트워크 환경 준비
서버 환경:
- 운영체제: Rocky Linux 또는 AlmaLinux
- 서버 IP: 192.168.0.50/24 (브리지 모드)
- 게이트웨이: 192.168.0.1
- DNS: 8.8.8.8
클라이언트 환경 설정:
# 정적 IP 설정
nmcli connection modify eth0 ipv4.method manual ipv4.addresses 192.168.0.100/24
nmcli connection up eth0
# 외부 연결 차단 확인 (의도적으로 실패해야 함)
curl -I https://www.google.com --connect-timeout 5Squid 패키지 설치 및 실행
# 저장소 업데이트 및 설치
dnf update -y
dnf install squid -y
# 서비스 활성화
systemctl enable --now squid
# 방화벽 규칙 적용
firewall-cmd --permanent --add-service=squid
firewall-cmd --reload
# 설치 확인
rpm -qa | grep squid
squid --version클라이언트 프록시 연결 설정
Firefox 브라우저 설정:
- 설정 → 네트워크 설정 → 수동 프록시 구성
- HTTP 프록시: 192.168.0.50, 포트: 3128
- "모든 프로토콜에 이 프록시 사용" 체크
연결 검증 테스트:
# Squid 중지 시 접근 불가 확인
systemctl stop squid
# 브라우저에서 웹사이트 접속 시도 (실패 예상)
# Squid 재시작 후 정상 동작 확인
systemctl start squid고급 ACL 설정 및 접근 제어
핵심 설정 파일 구조
/etc/squid/squid.conf의 주요 지시어:
| 지시어 | 기능 |
|---|---|
| http_port | 수신 포트 정의 (기본 3128) |
| acl | 접근 제어 목록 생성 |
| http_access | ACL 기반 허용/거부 결정 |
설정 파일 정리된 내용 확인:
grep -vE '^\s*#|^\s*$' /etc/squid/squid.conf | head -50ACL 유형 및 적용 예시
IP 주소 기반 제어:
# 허용할 클이언트 정의
acl authorized_hosts src 192.168.0.100 192.168.0.101
acl internal_network src 10.0.0.0/8 172.16.0.0/12
http_access allow authorized_hosts
http_access deny allURL 키워드 필터링:
# 특정 문자열이 포함된 URL 차단
acl prohibited_terms url_regex -i "gambling|betting|casino"
acl shopping_sites url_regex -i "amazon\.com|ebay\.com|aliexpress"
http_access deny prohibited_terms
http_access deny shopping_sites파일 확장자 차단:
# 실행 파일 및 미디어 다운로드 제한
acl dangerous_extensions urlpath_regex -i \.(exe|msi|bat|cmd|scr)$
acl media_files urlpath_regex -i \.(mp4|avi|mkv|mov|wmv)$
http_access deny dangerous_extensions
http_access deny media_files시간대 기반 접근 통제
# 업무 시간 정의 (월-금, 09:00-18:00)
acl business_hours time MTWHF 09:00-18:00
acl lunch_break time MTWHF 12:00-13:00
# 업무 시간 외 인터넷 사용 차단
http_access deny !business_hours
# 또는 점심 시간만 허용
# http_access allow lunch_break
# http_access deny all안전한 포트 관리
# 허용할 서비스 포트 정의
acl secure_services port 80 443 22
acl mail_services port 25 587 993 995
http_access deny !secure_services !mail_services캐시 저장소 및 모니터링
디스크 캐시 구성
# 캐시 디렉터리 초기화
squid -z
# 설정 파일에서 캐시 크기 조정
cache_dir ufs /var/spool/squid 2000 16 256
# 형식: 저장 방식, 경로, 용량(MB), 1차 디렉터리 수, 2차 디렉터리 수
# 메모리 캐시 설정
cache_mem 512 MB
maximum_object_size_in_memory 512 KB캐시 관리자 인터페이스
# 런타임 정보 조회
squidclient -h localhost -p 3128 mgr:info | head -30
# 캐시 객체 통계
squidclient mgr:storedir
# 활성 연결 확인
squidclient mgr:client_list로그 분석 및 문제 해결
# 실시간 접근 로그 모니터링
tail -f /var/log/squid/access.log | awk '{print $3, $7, $9}'
# 설정 파일 구문 검증
squid -k parse
# 설정 변경 후 재로드 (서비스 중단 없음)
squid -k reconfigure
# 캐시 효율성 확인
squidclient mgr:counters | grep -E "cache|hit|miss"운영 환경 적용 시나리오
연구 개발부서 특화 정책
# GitHub 및 기술 문서 사이트만 허용
acl dev_team src 192.168.10.0/24
acl tech_resources dstdomain .github.com .stackoverflow.com .docs.python.org
http_access allow dev_team tech_resources
http_access deny dev_team게스트 네트워크 제한
# 게스트 대역폭 제한 및 시간 제약
acl guest_wifi src 192.168.100.0/24
acl peak_hours time SMTWHFA 08:00-22:00
delay_pools 1
delay_class 1 2
delay_access 1 allow guest_wifi
delay_parameters 1 1000000/1000000 50000/50000
http_access allow guest_wifi peak_hours
http_access deny guest_wifiSSL Bump를 통한 HTTPS 검사 (고급)
# SSL 인증서 생성 및 설정
openssl req -new -newkey rsa:2048 -sha256 -days 365 -nodes -x509 \
-keyout /etc/squid/ssl_bump.pem -out /etc/squid/ssl_bump.pem
# squid.conf 설정
http_port 3128 ssl-bump cert=/etc/squid/ssl_bump.pem generate-host-certificates=on
ssl_bump bump all핵심 운영 원칙
- ACL 규칙은 위에서 아래로 순차 평가되며, 첫 번째 일치 항목이 적용된다
- 모든 http_access 체인의 마지막에 명시적 거부 규칙(http_access deny all)을 포함해야 한다
- 설정 변경 후 반드시 squid -k parse로 구문 검증을 수행한다
- 대규모 환경에서는 외부 인증(LDAP, Kerberos)과 연동을 고려한다
- 캐시 디렉터리는 전용 디스크 또는 고성능 스토리지에 배치한다