사전 학습
해당 포스팅은 프록시 서버에 대해 이해하기와 이어지기에 해당 내용을 보고 오는 것을 추천합니다!
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 응답이 반환되는지 확인해보자.
시나리오별 설정 가이드
이번에는 squid
설정 방법에 대해 더 익숙해지기 위해서 여러 시나리오를 구상한 후,
각 시나리오에 필수적으로 기입해야 할 설정들을 알아볼 것이다.
시나리오 1: 모든 클라이언트의 웹사이트 접속 현황 기록하기
해당 시나리오는 어떤 클라이언트가 어떤 웹사이트에 언제 접속했는지 파악하여 내부 네트워크 사용 현황을 모니터링하는 것을 목표로 함.
1. 기본 설정 확인
Squid 설정 파일 (squid.conf
)은 일반적으로 /etc/squid/squid.conf
또는 /usr/local/squid/etc/squid.conf
경로에 있다.
먼저 이 파일이 존재하는지 확인하자.
2. 접근 허용 설정 (ACL - Access Control List)
내부 네트워크 사용자들이 프록시를 통해 인터넷에 접속할 수 있도록 허용해야 한다.
acl localnet src 192.168.1.0/24
: 내부 네트워크 IP 대역을 정의.192.168.1.0/24
는 예시이며, 실제 환경에 맞게 수정해야 함. 여러 대역이 있다면 여러 줄로 추가할 수 있다.
http_access allow localnet
: localnet으로 정의된 클라이언트의 HTTP 요청을 허용.http_access deny all
: 위에서 허용되지 않은 모든 요청은 차단. (보안상 중요)
3. 로그 설정
Squid는 기본적으로 접속 로그를 기록하지만, 로그 형식이나 경로를 변경할 수 있다.
access_log daemon:/var/log/squid/access.log squid
: 접속 로그를/var/log/squid/access.log
파일에 squid 기본 형식으로 기록한다.- 로그 파일 경로와 이름은 원하는 대로 변경 가능함. 더 자세한 정보를 원하면
logformat
지시어를 사용하여 사용자 정의 로그 형식을 만들 수 있음.
- 로그 파일 경로와 이름은 원하는 대로 변경 가능함. 더 자세한 정보를 원하면
4. 설정 적용 및 Squid 재시작
설정 파일을 수정한 후에는 Squid를 재시작하여 변경 사항을 적용해야 한다.
sudo systemctl restart squid
# 또는
sudo service squid restart
5. 로그 확인
설정이 적용되면 /var/log/squid/access.log
파일에 클라이언트 접속 기록이 쌓이는 것을 확인할 수 있습니다. 로그에는 시간, 클라이언트 IP, 접속한 URL 등의 정보가 포함된다.
2. 특정 불법 사이트 접속 차단하기
이 시나리오는 업무에 불필요하거나 유해한 것으로 판단되는 특정 웹사이트 및 특정 키워드가 포함된 URL 접속을 차단하는 것을 목표로 함.
1. 차단할 사이트 목록 파일 생성
차단할 도메인 목록을 담은 파일을 생성하자.
예를 들어, /etc/squid/blocked_sites.txt
파일을 만들고
각 줄에 차단할 도메인(예: example-illegal-site.com)을 입력해주면 된다.
# /etc/squid/blocked_sites.txt 예시
badsite1.com
anotherbadsite.org
2. 차단할 URL 키워드 목록 파일 생성 (선택 사항)
URL에 특정 키워드가 포함된 경우 차단하고 싶다면,
해당 키워드 목록 파일을 생성해주자.
예를 들어, /etc/squid/blocked_keywords.txt
파일을 만들고 각 줄에 차단할 키워드(예: gambling)를 입력하자.
# /etc/squid/blocked_keywords.txt 예시
gambling
adult
3. ACL 설정
squid.conf
파일에 차단 목록을 참조하는 ACL을 추가하자.
# blocked_sites.txt 파일에 있는 도메인으로의 접근을 blocked_domains라는 ACL로 정의합니다.
acl blocked_domains dstdomain "/etc/squid/blocked_sites.txt"
# blocked_keywords.txt 파일에 있는 키워드가 URL에 포함된 경우 (대소문자 구분 없음 -i) blocked_urls라는 ACL로 정의합니다.
acl blocked_urls url_regex -i "/etc/squid/blocked_keywords.txt"
# blocked_domains ACL에 해당하는 요청을 차단합니다.
http_access deny blocked_domains
# blocked_urls ACL에 해당하는 요청을 차단합니다.
http_access deny blocked_urls
# 중요: http_access deny 규칙은 http_access allow localnet 규칙 앞에 위치해야 효과적으로 차단할 수 있습니다. Squid는 http_access 규칙을 위에서부터 순서대로 평가합니다.
4. 설정 적용 및 Squid 재시작
위와 동일하게 Squid를 재시작.