사전 학습
해당 포스팅은 프록시 서버에 대해 이해하기와 이어지기에 해당 내용을 보고 오는 것을 추천합니다!
Forward Proxy
구성에 앞서, Forward Proxy 는 클라이언트와 인터넷 사이에 위치하여 클라이언트의 요청을 대신 처리해 주는 서버이다.
또한, 해당 클라이언트는 내부 네트워크에 위치하며, 프록시 서버는 내부 혹은 DMZ 네트워크에 위치한다.
클라이언트가 Forward Proxy에 요청을 보내면, 프록시 서버가 이를 인터넷으로 전달하고, 응답을 받아 클라이언트에게 반환한다.
이를 통해 클라이언트의 IP 주소를 숨기거나, 컨텐츠 필터링, 캐싱, 보안 등을 제공한다.
1. Squid Proxy
Squid Proxy는 일반적으로 Cache / web proxy에 가깝지만, 일반적인 프록시 서버가 가지는 특성을 가지고 있으며,
클라이언트의 요청을 전달(Forward)하는 Forward Proxy와 같은 방향성을 지닌다.
주로 HTTP와 HTTPS 트래픽을 처리하며, 캐싱을 통해 네트워크 성능을 향상시키고, 네트워크 대역폭을 절약하는데 도움을 준다.
Squid는 그 뿐만 아니라, 웹 필터링, 액세스 제어, 로깅 등의 기능도 제공하고 있다.
nginx, apache 등과 달리 Squid의 경우 Proxy로 사용하기 위한 별도 설정 없이 그 자체가 프록시를 위한 오픈소스이기 때문에,
구축이 간단하고, 패키지 형태로도 설치가 가능하여 config 설정만 잘 구성하면 추후 관리적 측면에서 비교적 수월하다는 특징이 있다.
2. 구성도
위 그림과 같이 [내부 네트워크]
표시가 있는 클라이언트에서 Server A, B에게 요청을 할 때,
110.21.50.99
IP를 가진 Squid Proxy를 통해서 요청이 전달될 수 있도록 하는 구성으로 진행해보겠다.
- 여기서 내부 네트워크 라고 함은 "인증 및 인가되지 않은 접근은 불가능하며, 외부 통신은 제한"라는 가정이 전제된다.
- Forward Proxy는 DMZ 구간에 배포된 서버이며, 내/외부 경계에 위치하여 제약 사항이 존재한다.
3. Squid Proxy 구축
3-1. 설치
sudo apt-get install -y squid
3-2. 구성
config 파일 확인
vim /etc/squid/squid.conf
squid가 리스닝하는 default 포트 정보 확인
$ cat /etc/squid/squid.conf | grep "^http_port"
http_port 3128
well-known
포트이기 때문에 테스트 환경이 아닌 실제 환경에서 사용한다면 포트를 변경하는 것을 권장함.
3-3. ACL 및 인증 구성 적용
cp -R /etc/squid/squid.conf /etc/squid/squid.conf.bak
먼저 구성 변경 후, 원치 않은 에러 상황을 방지하기 위해 미리 백업본을 생성해놓고 진행하겠다.
그리고 squid.conf
에는 주석 처리된 부분이 매우 많은데, 수정 시 이러한 내용 때문에 번거로울 수 있어, 주석 부분을 모두 제거해주겠다.
sudo sed -i '/^#/ d' /etc/squid/squid.conf
sudo sed -i '/^$/ d' /etc/squid/squid.conf
정책 설정은 간단하다.
기본적으로 Deny 정책을 고수하되, localhost의 접근은 허용하고,
특정 조건에 따라 적용될 ACL에 반영할 값을 정의 한 후, 접근 규칙에 반영하는 구조이다.
이번 실습에서 요구할 정책 조건은 다음과 같다.
- 내부 클라이언트에서 google.com 접근 시 차단 / 그 외 허용
- 내부 클라이언트에서 외부 서버(192.168.219.166)에 80,443 접근 시 허용 / 그 외 모두 차단
따라서 이번 실습에서 추가 및 변경할 부분은 다음과 같다. (이외 항목 기본 값 유지
)
- 정의 규칙
- ACL 포트 정의 규칙
- ACL 특정 출발지 및 목적지 네트워크 & 도메인 정의 규칙
- 접근 제어 규칙
- 도메인 허용/차단 규칙
- 내부 네트워크에서 목적지 서버로의 접근 규칙
위 사항이 반영된 .conf
파일은 다음과 같다.
# Squid 기본 설정
http_port 3128
visible_hostname your-squid-server
# 접근 제어 목록 정의
# 내부망 허용
acl internal_network src 172.16.0.0/24
# google.com 도메인 차단
acl blocked_google dstdomain .google.com
# 192.168.219.166 목적지 및 포트 제한
acl target_server dst 192.168.219.166
acl allowed_ports port 80 443
# 접근 제어 규칙
# 내부망에서의 접근을 허용
http_access allow internal_network
# 도메인 허용/차단 규칙
http_access deny blocked_google
http_access allow !blocked_google
# 특정 서버로의 접근을 80, 443 포트만 허용
http_access allow target_server allowed_ports
# 나머지 모든 요청은 차단
http_access deny all
설정 반영이 완료되었으면 squid
를 재시작하자.
sudo systemctl restart squid
3-4. 클라이언트 구성
- 윈도우 11 클라이언트
브라우저에서 프록시 설정을 진행해보자.
3-5. 프록시 테스트
클라이언트에서 google.com
으로의 접근이 정상적으로 차단되는지 확인해보자.
Squid proxy의 access.log(/var/log/squid/access.log
)를 확인하여, 403 응답이 반환되는지 확인해보자.
그 외 요청(www.naver.com
)을 보내서 200 응답이 반환되는지 확인해보자.