๊ณ ์ฑ๋ฅ ์น ์บ์ฑ & ํฌ์๋/๋ฆฌ๋ฒ์ค ํ๋ก์ ์๋ฒ ์์ ๊ฐ์ด๋: ํฌํธ 3128 ํฌ์๋ ํ๋ก์, ACL(src, dstdomain) ๊ธฐ๋ฐ ์ธ๊ฐ ์ ์ด, NCSA ๊ธฐ๋ณธ ์ธ์ฆ, ๋์คํฌ/์ธ๋ฉ๋ชจ๋ฆฌ ์บ์ ํ๋(cache_dir, refresh_pattern), SSL Bumping(HTTPS ๊ฒ์ฌ), ์คํ ํ๋ก์ ๋ฐฉ์ง ๋ฐ access.log ๋ถ์
## 1. Squid ์ค์น & ํ๊ฒฝ ๊ตฌ์ฑ ๊ฐ์ด๋ (Installation)
### ๐ป ์์คํ
์ค์น ๋ฐ ์คํ ์๊ตฌ์ฌ์ (System Requirements)
| ํญ๋ชฉ | ์ต์ ์ฌ์ (Minimum) | ๊ถ์ฅ ์ฌ์ (Recommended) | ์ฐธ๊ณ ๋ฐ ๋น๊ณ |
| :--- | :--- | :--- | :--- |
| **์ด์์ฒด์ (OS)** | Linux (Ubuntu, Debian, RHEL, Rocky, Alpine), FreeBSD | Ubuntu 22.04 / 24.04 LTS, Rocky Linux 9, Alpine 3.20 | ๋น๋๊ธฐ I/O (epoll / libaio) ์ง์ POSIX ์ปค๋ ๊ถ์ฅ |
| **CPU** | 1 ์ฝ์ด (x86_64 / ARM64) | 4 ์ฝ์ด ~ 8 ์ฝ์ด ์ด์ | ๊ธฐ๋ณธ์ ์ผ๋ก ๋จ์ผ ํ๋ก์ธ์ค ์ด๋ฒคํธ ๋๋ฆฌ๋ธ. ๋ฉํฐ ์ฝ์ด๋ `workers N` ์ง์์ด๋ก ๋ณ๋ ฌํ |
| **๋ฉ๋ชจ๋ฆฌ (RAM)** | 512 MB ์ด์ | 4 GB ~ 16 GB ์ด์ | ๋์คํฌ ์บ์ ์ธ๋ฑ์ฑ์ 1GB ์คํ ๋ฆฌ์ง๋น ์ฝ 10MB~14MB RAM ์์ฝ ํ์ (`cache_mem` ๋ณ๋ ํ ๋น) |
| **๋์คํฌ (Storage)** | 2 GB ์ฌ์ ๊ณต๊ฐ | 50 GB ~ 500 GB ์ด์์ ๊ณ ์ NVMe/SSD | ์บ์ ๋๋ ํฐ๋ฆฌ(`cache_dir`) ์
์ถ๋ ฅ IOPS ์ฑ๋ฅ์ด ํ๋ก์ ๋ณ๋ชฉ์ ํต์ฌ ์์ธ |
| **๋คํธ์ํฌ / ๋ฐํ์** | Squid 5.x LTS ๋๋ Squid 6.x LTS | ์ ์ฉ ์ฌ๋ด ์๋ธ๋ท, ๊ธฐ๋ณธ ํฌํธ 3128 (TCP) | ๊ณต์ฉ ์ธํฐ๋ท ๋
ธ์ถ ์ ๋ฐ๋์ ์ธ์ฆ ๋ฐ ACL ์๊ฒฉ ์ ์ฉ (์คํ ํ๋ก์ ์
์ฉ ๋ฐฉ์ง) |
---
### ๐ ์ด์์ฒด์ ๋ณ ์ค์น ๋ช
๋ น์ด
```bash
# ๐ง [1] Ubuntu / Debian ์ค์น (Squid ๊ธฐ๋ณธ ํจํค์ง & ์ธ์ฆ ํฌํผ ๋๊ตฌ)
sudo apt update
sudo apt install -y squid apache2-utils
# ์๋น์ค ํ์ฑํ ๋ฐ ์ํ ํ์ธ
sudo systemctl enable --now squid
sudo systemctl status squid
# ๐ง [2] RHEL / Rocky Linux 9 / AlmaLinux ์ค์น
sudo dnf install -y epel-release
sudo dnf install -y squid httpd-tools
sudo systemctl enable --now squid
# ๐ณ [3] Docker ๋จ๋
์ปจํ
์ด๋ ๋น ๋ฅธ ์คํ (Ubuntu ๊ธฐ๋ฐ ๊ณต์ ์ด๋ฏธ์ง)
# ๋ก์ปฌ ํฌํธ 3128์ ๋ฐ์ธ๋ฉํ์ฌ ๋ฐฑ๊ทธ๋ผ์ด๋ ๊ตฌ๋
docker run -d \
--name squid-proxy \
--restart always \
-p 3128:3128 \
ubuntu/squid:5.2-22.04_beta
```
---
## 2. Squid ์ํคํ
์ฒ & ๋ฉํ ๋ชจ๋ธ (Mental Model)
Squid๋ ํด๋ผ์ด์ธํธ์ ์ธ๋ถ ์ธํฐ๋ท ์ฌ์ด์์ ๋์ญํญ์ ์ ์ฝํ๊ณ (Caching), ์กฐ์ง ๋ด๋ถ์ ์น ์ ๊ทผ ํต์ ๋ฐ ๊ฐ์ฌ(Forward Proxy), ๋๋ ๋ฐฑ์๋ ์น ์๋ฒ์ ๋ถํ๋ฅผ ๋์ด์ฃผ๋ ๊ฐ์๊ธฐ(Reverse Proxy) ์ญํ ์ ์ํํฉ๋๋ค.
### ๐งญ ํฌ์๋ ํ๋ก์์ ์บ์ฑ ํ๋ฆ (Forward Proxy & Cache Flow)
```
[์ฌ๋ด ํด๋ผ์ด์ธํธ]
(๋ธ๋ผ์ฐ์ /์๋ฒ)
โ
โ HTTP/HTTPS Request (Proxy: 3128)
โผ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ Squid Proxy Server โ
โ โ
โ [1] ACL ๊ฒ์ฆ ๋จ๊ณ โ
โ โโ IP ๊ฒ์ฌ (src localnet) โ
โ โโ ์ธ์ฆ ๊ฒ์ฌ (http_access allow authenticated) โ
โ โโ ๋๋ฉ์ธ/ํฌํธ ๊ฒ์ฌ (http_access deny blocked_sites) โ
โ โ
โ [2] ์บ์ ์์ง (Cache Manager) โ
โ โโ In-Memory Cache (cache_mem: Hot Objects) โ
โ โ โโโ [HIT] โโ> ์ฆ์ ํด๋ผ์ด์ธํธ๋ก ์๋ต (์ด๊ณ ์) โ
โ โโ On-Disk Cache (cache_dir ufs/aufs/rock) โ
โ โโโ [HIT] โโ> ๋์คํฌ์์ ์ฝ์ด ํด๋ผ์ด์ธํธ๋ก ๋ฐํ โ
โ โ
โ [3] ์บ์ ๋ฏธ์ค (MISS) ์ฒ๋ฆฌ โ
โ โโโ ์ธ๋ถ ์ธํฐ๋ท ์๋ณธ ์๋ฒ๋ก ์์ฒญ ์ ๋ฌ (Origin Fetch) โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ
[MISS ์์๋ง] โ GET /index.html
โผ
[์ธํฐ๋ท ์๋ณธ ์น ์๋ฒ]
(Origin Web Servers)
```
### ๐ Squid ๋์ ๋ชจ๋ ๋น๊ต
| ๋ชจ๋ | ์ฃผ์ ์ญํ | ํฌํธ ์ค์ ์์ | ์ผ๋ฐ์ ์ธ ์ฉ๋ |
| :--- | :--- | :--- | :--- |
| **์ ๋ฐฉํฅ ํ๋ก์ (Forward Proxy)** | ๋ด๋ถ ํด๋ผ์ด์ธํธ๊ฐ ์ธ๋ถ ์น์ ์ ๊ทผํ ๋ ๊ฒฝ์ | `http_port 3128` | ์ฌ๋ด ์ฌ์ค๋ง ์ธ๋ถ ์ธํฐ๋ท ํต์ , ๋์ญํญ ์ ๊ฐ, ๊ฐ์ฌ ๋ก๊ทธ |
| **ํฌ๋ช
ํ๋ก์ (Transparent/Intercept)** | ํด๋ผ์ด์ธํธ ๋ธ๋ผ์ฐ์ ์ค์ ์์ด ๋ผ์ฐํฐ(iptables)๊ฐ ๊ฐ๋ก์ฑ | `http_port 3128 intercept` | ๋คํธ์ํฌ ๋ฐฉํ๋ฒฝ ์ฐ๋ํ ๊ฐ์ ํ๋ก์ |
| **์ญ๋ฐฉํฅ ํ๋ก์ (Reverse Proxy/Accel)** | ์ธ๋ถ ์ฌ์ฉ์๊ฐ ๋ด๋ถ ์น ์๋ฒ๋ค์ ์ ๊ทผํ ๋ ๊ด๋ฌธ | `http_port 80 accel defaultsite=api.test` | ์น ์๋ฒ ์๋จ์ ์ ์ ์ฝํ
์ธ ์บ์ฑ ๊ฐ์๊ธฐ |
| **HTTPS SSL Bumping** | ์ํธํ๋ HTTPS(443) ํธ๋ํฝ ๋ณตํธํ ๋ฐ ์ ํด ํจํท ๊ฒ์ฌ | `http_port 3128 ssl-bump cert=...` | ๊ธฐ์
๋ณด์ DLP, ์
์ฑ์ฝ๋ ์ ์
์ฐจ๋จ |
---
## 3. [์ด๋ณด์ 1๋จ๊ณ] 3๋ถ ํฌ๋ก์๋: ํฌ์๋ ํ๋ก์ ๊ตฌ์ฑ
๊ธฐ๋ณธ ํฌํธ `3128`์์ ์ฌ๋ด ๋ก์ปฌ ๋คํธ์ํฌ(192.168.0.0/16 ๋๋ 127.0.0.1)์ ์์ฒญ์ ํ์ฉํ๋ ์ต์ ๊ตฌ์ฑ ํ์ผ์
๋๋ค.
### ๐ ์ต์ ๋์ ์ค์ ํ์ผ (`/etc/squid/squid.conf`)
```nginx
# 1. ์์ ๋๊ธฐ ํฌํธ ์ค์
http_port 3128
# 2. ACL(์ ๊ทผ ์ ์ด ๋ชฉ๋ก) ์ ์
acl localhost src 127.0.0.1/32 ::1
acl localnet src 10.0.0.0/8
acl localnet src 172.16.0.0/12
acl localnet src 192.168.0.0/16
# ์์ ํ ํ์ค ํฌํธ๋ง ํ์ฉ
acl SSL_ports port 443
acl Safe_ports port 80 # http
acl Safe_ports port 21 # ftp
acl Safe_ports port 443 # https
acl Safe_ports port 1025-65535 # unprivileged ports
acl CONNECT method CONNECT
# 3. ์ธ๊ฐ ์ ์ฑ
(์์์ ์๋๋ก ์์๋๋ก ํ๊ฐ๋จ)
# ์์ ํ์ง ์์ ํฌํธ ์ ๊ทผ ๊ฑฐ๋ถ
http_access deny !Safe_ports
# SSL ์ธ ๋นํ์ค ํฌํธ๋ก์ CONNECT ๋ฉ์๋(ํฐ๋๋ง) ์ฐจ๋จ
http_access deny CONNECT !SSL_ports
# ๋ก์ปฌ ๊ด๋ฆฌ์ ๋ฐ ์ฌ์ค๋ง ํ์ฉ
http_access allow localhost
http_access allow localnet
# ๊ทธ ์ธ ๋ชจ๋ ์ ๊ทผ์ ์๊ฒฉํ ์ฐจ๋จ (์คํ ํ๋ก์ ๋ฐฉ์ง ํ์)
http_access deny all
# 4. ์๋ฒ ์๋ณ ํค๋ ๋ณด์ ๋ง์คํน (์ ํ)
visible_hostname lucky-squid-proxy
forwarded_for delete
via off
```
### ๐งช ๋์ ๊ฒ์ฆ ๋ฐ ํ
์คํธ ๋ช
๋ น์ด
```bash
# [1] ์ค์ ํ์ผ ๋ฌธ๋ฒ ๊ฒ์ฌ (์ค๋ฅ๊ฐ ์์ผ๋ฉด ์๋ฌด๋ฐ ์๋ฌ ์ถ๋ ฅ ์์ด ์ข
๋ฃ)
sudo squid -k parse
# [2] ์บ์ ์ค์ ๋๋ ํฐ๋ฆฌ ์ด๊ธฐํ (์ต์ด 1ํ ํ์)
sudo squid -z
# [3] ์๋น์ค ์ฌ์์
sudo systemctl restart squid
# [4] curl๋ก ํ๋ก์ ๊ฒฝ์ HTTP ์์ฒญ ํ
์คํธ
curl -x http://localhost:3128 -I http://example.com
```
#### ๐ฅ๏ธ ์์ ์ถ๋ ฅ ๊ฒฐ๊ณผ (Console Output)
```http
HTTP/1.1 200 OK
Content-Encoding: gzip
Accept-Ranges: bytes
Age: 382410
Cache-Control: max-age=604800
Content-Type: text/html; charset=UTF-8
Date: Sat, 10 Oct 2026 13:30:00 GMT
ETag: "3147526947"
Expires: Sat, 17 Oct 2026 13:30:00 GMT
Last-Modified: Thu, 17 Oct 2024 07:18:26 GMT
Server: ECS (dcb/7F82)
Vary: Accept-Encoding
X-Cache: HIT from lucky-squid-proxy
X-Cache-Lookup: HIT from lucky-squid-proxy:3128
Content-Length: 648
Connection: keep-alive
```
> **์ฑ๊ณต ํ์ธ**: ์๋ต ํค๋์ `X-Cache: HIT from lucky-squid-proxy`๊ฐ ํฌํจ๋์ด ์๋ค๋ฉด Squid ํ๋ก์๊ฐ ์ ์์ ์ผ๋ก ์์ฒญ์ ์ค๊ณํ๊ณ ์บ์ํ๊ณ ์์์ ์๋ฏธํฉ๋๋ค!
---
## 4. [2๋จ๊ณ] ํต์ฌ ๊ธฐ๋ฅ: ACL ๋ฌธ๋ฒ, ์ฌ์ฉ์ ์ธ์ฆ & ์บ์ ํ๋
### ๐ก๏ธ 1. ACL(Access Control List) ๊ธฐ๋ณธ ๋ฌธ๋ฒ๊ณผ ์์ฐจ ํ๊ฐ
Squid์ ๋ณด์ ์ ์ด๋ **"First-Match-Wins (์ต์ด ์ผ์น ์ฐ์ )"** ์์น์ ๋ฐ๋ฆ
๋๋ค. ์๋จ์ ๋ฑ๋ก๋ ๊ท์น์ด ๋จผ์ ์ผ์นํ๋ฉด ํ๋จ ๊ท์น์ ํ๊ฐ๋์ง ์์ต๋๋ค.
```nginx
# ==========================================
# ๋ค์ํ ์ ํ์ ACL ์ ์
# ==========================================
# 1) ์ถ๋ฐ์ง IP ๋์ญ ๊ธฐ๋ฐ (src)
acl dev_team src 192.168.10.0/24
acl qa_team src 192.168.20.0/24
# 2) ๋ชฉ์ ์ง ๋๋ฉ์ธ ๊ธฐ๋ฐ (dstdomain) - ์ (.)์ผ๋ก ์์ํ๋ฉด ์๋ธ๋๋ฉ์ธ ํฌํจ
acl allowed_work_domains dstdomain .github.com .npmjs.org .docker.com
acl blocked_domains dstdomain .facebook.com .tiktok.com .gambling.com
# 3) URL ์ ๊ทํํ์ ๊ธฐ๋ฐ (url_regex) - ๋์๋ฌธ์ ๋ฌด์ -i
acl media_files url_regex -i \.(mp4|avi|mkv|iso)$
# 4) ์ ์ ์๊ฐ๋ ๊ธฐ๋ฐ (time) - M T W H F A S (์ ํ ์ ๋ชฉ ๊ธ ํ ์ผ)
# ํ์ผ ์
๋ฌด์๊ฐ: ์~๊ธ 09:00 ~ 18:00
acl work_hours time M T W H F 09:00-18:00
# 5) HTTP ์์ฒญ ๋ฉ์๋ (method)
acl safe_methods method GET HEAD POST
# ==========================================
# http_access ๊ท์น ์ ์ฉ (์ฐ์ ์์ ์ค์)
# ==========================================
# ์ฐจ๋จ 1: ์ ํด/์ค๋ฝ ์ฌ์ดํธ๋ ์ฆ์ ๊ฑฐ๋ถ
http_access deny blocked_domains
# ์ฐจ๋จ 2: ์
๋ฌด์๊ฐ ์ค ๋์ฉ๋ ๋ฏธ๋์ด ํ์ผ ๋ค์ด๋ก๋ ์ฐจ๋จ
http_access deny media_files work_hours
# ํ์ฉ: ๊ฐ๋ฐํ ๋ฐ QAํ์ ์น์ธ๋ ๋๋ฉ์ธ ์ ์ ํ์ฉ
http_access allow dev_team allowed_work_domains
http_access allow qa_team
# ๋ง์ง๋ง ์์ ์ฅ์น: ์ผ์นํ์ง ์๋ ๋ชจ๋ ํธ๋ํฝ ๊ฑฐ๋ถ
http_access deny all
```
---
### ๐ 2. NCSA ๊ธฐ๋ณธ ์ฌ์ฉ์ ์ธ์ฆ (Basic Authentication)
ํ๋ก์ ์ฌ์ฉ ์ ์ฌ์ฉ์ ์ด๋ฆ๊ณผ ์ํธ๋ฅผ ์๊ตฌํ๋๋ก ์ค์ ํฉ๋๋ค (`apache2-utils`์ `htpasswd` ํ์ฉ).
```bash
# [1] ์ธ์ฆ์ฉ ๋น๋ฐ๋ฒํธ ํ์ผ ์์ฑ (์ฌ์ฉ์ lucky ๊ณ์ ์ถ๊ฐ)
sudo htpasswd -c /etc/squid/passwords lucky
# ๋น๋ฐ๋ฒํธ ์
๋ ฅ ํ ์๋ฃ
# [2] ํ์ผ ๊ถํ์ squid ์คํ ๊ณ์ (proxy)์ผ๋ก ๋ณ๊ฒฝ
sudo chown proxy:proxy /etc/squid/passwords
sudo chmod 640 /etc/squid/passwords
```
```nginx
# /etc/squid/squid.conf ์ ์ธ์ฆ ํฌํผ ๋ฑ๋ก
# ์ธ์ฆ ํฌํผ ํ๋ก๊ทธ๋จ ๊ฒฝ๋ก์ ๊ณ์ ํ์ผ ์ง์
auth_param basic program /usr/lib/squid/basic_ncsa_auth /etc/squid/passwords
auth_param basic children 5 startup=2 idle=1
auth_param basic realm LuckyTechWorld Corporate Secure Proxy
auth_param basic credentialsttl 2 hours
auth_param basic casesensitive on
# ์ธ์ฆ๋ ์ฌ์ฉ์ ACL ์ ์
acl authenticated_users proxy_auth REQUIRED
# ์ธ์ฆ๋ ์ฌ์ฉ์๋ง ์ธ๋ถ ์น ์ํ ํ์ฉ
http_access allow authenticated_users
http_access deny all
```
```bash
# ์ธ์ฆ ํ๋ก์ ๊ฒฝ์ curl ํ
์คํธ
curl -x http://lucky:MySecretPassword@localhost:3128 -I https://www.google.com
```
---
### ๐พ 3. ์ธ๋ฉ๋ชจ๋ฆฌ & ๋์คํฌ ์บ์(Cache Directory) ํ๋
Squid์ ์ง๊ฐ๋ ๋คํธ์ํฌ ํธ๋ํฝ ์ ์ฝ๊ณผ ์๋ต ๊ฐ์์ ์ํ ๊ฐ๋ ฅํ ์บ์ ์์คํ
์ ์์ต๋๋ค.
```nginx
# ==========================================
# ์ธ๋ฉ๋ชจ๋ฆฌ ์บ์ (RAM)
# ==========================================
# ์์ฃผ ์์ฒญ๋๋ ์์ ๊ฐ์ฒด๋ฅผ ๋ฉ๋ชจ๋ฆฌ์ ๋ณด๊ด (์๋ฒ ์ฌ์ RAM์ ๋ง์ถฐ ์ค์ )
cache_mem 512 MB
# ๋ฉ๋ชจ๋ฆฌ์ ๋ณด๊ดํ ์ ์๋ ๋จ์ผ ๊ฐ์ฒด์ ์ต๋ ํฌ๊ธฐ (๊ธฐ๋ณธ๊ฐ: 512 KB)
maximum_object_size_in_memory 1 MB
# ==========================================
# ๋์คํฌ ์บ์ (Storage)
# ==========================================
# ํ์: cache_dir [ํ์ผ์์คํ
ํ์
] [๊ฒฝ๋ก] [ํฌ๊ธฐ(MB)] [L1๋๋ ํฐ๋ฆฌ์] [L2๋๋ ํฐ๋ฆฌ์]
# ufs ๋๋ ๋น๋๊ธฐ ๊ณ ์ฑ๋ฅ aufs ๊ถ์ฅ
# 10GB ์ฉ๋, 16๊ฐ์ 1์ฐจ ๋๋ ํฐ๋ฆฌ, 256๊ฐ์ 2์ฐจ ๋๋ ํฐ๋ฆฌ
cache_dir aufs /var/spool/squid 10240 16 256
# ๋์คํฌ์ ์ ์ฅํ ์ต์ / ์ต๋ ํ์ผ ํฌ๊ธฐ
minimum_object_size 0 KB
maximum_object_size 200 MB
# ์บ์ ๋น์ฐ๊ธฐ ์๊ณ์น (๋์คํฌ ์ฌ์ฉ๋ฅ ์ด 95%์ ๋๋ฌํ๋ฉด 90%๊ฐ ๋ ๋๊น์ง ์ค๋๋ ์บ์ ์ ๋ฆฌ)
cache_swap_low 90
cache_swap_high 95
# ==========================================
# ์บ์ ์๋ช
๊ท์น (refresh_pattern)
# ํ์: refresh_pattern [-i] regex min percent max [options]
# ==========================================
# ์ ์ ์น ๋ฆฌ์์ค(์ด๋ฏธ์ง, CSS, JS, ํฐํธ) 1์ผ~7์ผ ๋์ ๊ฐ์ ์บ์ฑ
refresh_pattern -i \.(css|js|woff|woff2|ttf|png|jpg|jpeg|gif|ico|svg)$ 1440 40% 10080 override-expire ignore-no-cache
# deb/rpm ํจํค์ง ํ์ผ 7์ผ๊ฐ ์บ์ฑ (OS ์
๋ฐ์ดํธ ํธ๋ํฝ ๋ํญ ์ ๊ฐ)
refresh_pattern -i \.(deb|rpm|tar\.gz|zip)$ 10080 80% 43200 override-expire
# ๊ธฐ๋ณธ ์น ๋ฆฌ์์ค (0๋ถ ์ต์, 20% ๊ฒฝ๊ณผ์จ, ์ต๋ 4320๋ถ=3์ผ)
refresh_pattern ^ftp: 1440 20% 10080
refresh_pattern ^gopher: 1440 0% 1440
refresh_pattern -i (/cgi-bin/|\?) 0 0% 0
refresh_pattern . 0 20% 4320
```
---
## 5. [3๋จ๊ณ] ์ค๋ฌด ์์ฉ: SSL Bumping, ์ฐจ๋จ ์ ์ฑ
& ๋ฆฌ๋ฒ์ค ํ๋ก์
### ๐ 1. SSL Bumping (HTTPS ํธ๋ํฝ ๊ฐ์์ฑ ํ๋ณด & ํจํท ๊ฒ์ฌ)
ํ๋ ์น ํธ๋ํฝ์ 95% ์ด์์ HTTPS(443) ์ํธํ ํต์ ์
๋๋ค. ์ฌ๋ด DLP(๋ฐ์ดํฐ ์ ์ถ ๋ฐฉ์ง) ๋๋ ์ ํด ์ฌ์ดํธ ์๋ฒฝ ์ฐจ๋จ์ ์ํด ์ฌ๋ด Root CA๋ฅผ ๋ฐ๊ธ๋ฐ์ ์ค๊ฐ์์ HTTPS๋ฅผ ๊ฒ์ฌ(Peek & Bump)ํ ์ ์์ต๋๋ค.
> **์ฃผ์**: SSL ๋ณตํธํ๋ ํ๋ก์ ์๋ฒ์ `squid-openssl` ํจํค์ง๊ฐ ์ค์น๋์ด ์์ด์ผ ํ๋ฉฐ ์ฌ๋ด ๋จ๋ง๊ธฐ์ ์์ฒด ์ฌ์ค CA ์ธ์ฆ์๊ฐ ์ค์น๋์ด ์ ๋ขฐ๋์ด์ผ ํฉ๋๋ค.
```bash
# [1] Squid์ฉ ์์ฒด ์ฌ์ค Root CA ์ธ์ฆ์ ์์ฑ (10๋
์ ํจ)
sudo mkdir -p /etc/squid/ssl_cert
sudo openssl req -new -newkey rsa:2048 -days 3650 -nodes -x509 \
-keyout /etc/squid/ssl_cert/squid_ca.pem \
-out /etc/squid/ssl_cert/squid_ca.pem \
-subj "/C=KR/ST=Seoul/O=LuckyTech/CN=LuckyTech Security Proxy Root CA"
# [2] ๋ธ๋ผ์ฐ์ /๋จ๋ง๊ธฐ ๋ฐฐํฌ์ฉ DER ํ์ ๊ณต๊ฐ ์ธ์ฆ์ ๋ณํ
sudo openssl x509 -in /etc/squid/ssl_cert/squid_ca.pem -outform DER -out /etc/squid/ssl_cert/squid_ca.der
sudo chown -R proxy:proxy /etc/squid/ssl_cert
sudo chmod 400 /etc/squid/ssl_cert/squid_ca.pem
# [3] ๋์ SSL ์ธ์ฆ์ ์์ฑ ์บ์ DB ์ด๊ธฐํ
sudo /usr/lib/squid/security_file_certgen -c -s /var/lib/squid/ssl_db -M 20MB
sudo chown -R proxy:proxy /var/lib/squid/ssl_db
```
```nginx
# /etc/squid/squid.conf SSL Bumping ์ค์
# SSL ์์ ํฌํธ ๋ฐ ์ธ์ฆ์ ๋ฐ์ธ๋ฉ
http_port 3128 ssl-bump \
cert=/etc/squid/ssl_cert/squid_ca.pem \
generate-host-certificates=on \
dynamic_cert_mem_cache_size=16MB
sslcrtd_program /usr/lib/squid/security_file_certgen -s /var/lib/squid/ssl_db -M 20MB
# SSL Bump ๊ท์น ์ ์
acl step1 at_step SslBump1
acl step2 at_step SslBump2
acl step3 at_step SslBump3
# ๊ธ์ต/๊ณต๊ณต๊ธฐ๊ด ๋ฑ ๋ณตํธํ ์์ธ ๋์ ๋๋ฉ์ธ (Bypass / Splice)
acl banking_sites dstdomain .kbstar.com .shinhan.com .wooribank.com
# Step 1: ํด๋ผ์ด์ธํธ SNI ํ์ธ (Peek)
ssl_bump peek step1
# ์์ธ ์ฌ์ดํธ๋ ๋ณตํธํํ์ง ์๊ณ ์๋ ํต์ ๊ทธ๋๋ก ํต๊ณผ (Splice)
ssl_bump splice banking_sites
# ๊ทธ ์ธ ์ผ๋ฐ ์น์ฌ์ดํธ๋ ํ๋ก์๊ฐ ๊ฐ์ ์ธ์ฆ์๋ฅผ ๋ฐ๊ธํ์ฌ ๊ฐ์ฌ ๊ฒ์ฌ (Bump)
ssl_bump bump all
```
---
### ๐ซ 2. ์ฌ๋ด ํ์ดํธ๋ฆฌ์คํธ / ๋ธ๋๋ฆฌ์คํธ ๋๋ฉ์ธ ์ฐจ๋จ ๊ด๋ฆฌ
์ธ๋ถ ํ
์คํธ ํ์ผ๋ก ๋๋ฉ์ธ ๋ชฉ๋ก์ ๋ถ๋ฆฌํ์ฌ ์ด์ํ์ด ๊ด๋ฆฌํ๊ธฐ ํธํ๊ฒ ๊ตฌ์ฑํฉ๋๋ค.
```bash
# ์ฐจ๋จ ๋๋ฉ์ธ ๋ชฉ๋ก ํ์ผ ์์ฑ
sudo tee /etc/squid/blocked_domains.txt << 'EOF'
.gambling.com
.torrent.org
.piratebay.org
.phishing-test.com
EOF
# ํ์ฉ ํ์ดํธ๋ฆฌ์คํธ ๋ชฉ๋ก ํ์ผ ์์ฑ
sudo tee /etc/squid/allowed_domains.txt << 'EOF'
.github.com
.google.com
.microsoft.com
.luckylabs.internal
EOF
sudo chown proxy:proxy /etc/squid/*.txt
```
```nginx
# /etc/squid/squid.conf ์ ํ์ผ ์ฐ๋
acl blocked_sites dstdomain "/etc/squid/blocked_domains.txt"
acl allowed_sites dstdomain "/etc/squid/allowed_domains.txt"
# 1. ๋ธ๋๋ฆฌ์คํธ ์ฆ์ ์ฐจ๋จ + ์น์ ํ ๊ฑฐ๋ถ ์๋ด ํ์ด์ง ์ ์ก
http_access deny blocked_sites
# 2. ํ์ดํธ๋ฆฌ์คํธ ๋ชจ๋ ์ ์ฉ ์ (์ง์ ๋ ๋๋ฉ์ธ๋ง ํต๊ณผ์ํค๊ณ ์ ํ ๋)
# http_access allow allowed_sites
# http_access deny all
```
---
### ๐ 3. ๋ฆฌ๋ฒ์ค ํ๋ก์(Reverse Proxy / Accelerator Mode) ๊ตฌ์ฑ
์น ์๋ฒ(์: Node.js 3000๋ฒ, Spring Boot 8080๋ฒ) ์๋จ์ Squid๋ฅผ ๋ฐฐ์นํ์ฌ ์ ์ ํ์ผ ์์ฒญ์ ์ด๊ณ ์ ์บ์๋ก ์๋ตํฉ๋๋ค.
```
[์ธํฐ๋ท ์ฌ์ฉ์] โโโ> [Squid :80 Accel] โโโ(Cache Miss ์์๋ง)โโโ> [๋ด๋ถ Web WAS :8080]
```
```nginx
# 80๋ฒ ํฌํธ๋ก ์์ ํ๋ฉฐ ์ญ๋ฐฉํฅ ๊ฐ์๊ธฐ ๋ชจ๋๋ก ๊ตฌ๋
http_port 80 accel defaultsite=mysite.luckytech.com vhost
# ๋ฐฑ์๋ ์๋ณธ ์น ์๋ฒ(Origin) ์ ์
# cache_peer [์๋ฒIP/ํธ์คํธ] parent [ํฌํธ] [ICPํฌํธ] originserver name=[๋ณ์นญ]
cache_peer 192.168.1.100 parent 8080 0 no-query originserver round-robin name=backend_cluster_1
cache_peer 192.168.1.101 parent 8080 0 no-query originserver round-robin name=backend_cluster_2
# ๋ฐฑ์๋๋ก ๋ผ์ฐํ
ํ ACL ์ง์
acl our_sites dstdomain mysite.luckytech.com api.luckytech.com
http_access allow our_sites
cache_peer_access backend_cluster_1 allow our_sites
cache_peer_access backend_cluster_2 allow our_sites
# ๊ทธ ์ธ ์ธ๋ถ ๋ฌด๋จ ๋ฆด๋ ์ด ์์ฒญ ๊ฑฐ๋ถ
http_access deny all
```
---
### ๐ 4. ์์ ํ๋ก์(Upstream Parent Proxy) ์ฒด์ด๋ ์ฐ๋
์ง์ฌ(Branch) Squid ํ๋ก์๊ฐ ๋ณธ์ฌ(HQ) ๋ํ ํ๋ก์๋ฅผ ๊ฑฐ์ณ ์ธํฐ๋ท์ผ๋ก ๋๊ฐ๋๋ก ๊ตฌ์ฑํ ๋ ์ฌ์ฉํฉ๋๋ค.
```nginx
# ๋ณธ์ฌ ์์ ํ๋ก์(10.200.0.1:3128) ๋ฑ๋ก
# default: ๋ค๋ฅธ ๋์์ด ์์ ๋ ์ฌ์ฉ, no-query: ICP ์ง์ ๋นํ์ฑํ
cache_peer 10.200.0.1 parent 3128 0 no-query default name=hq_gateway login=corp_user:secret_token
# ์ฌ๋ด ๋ด๋ถ๋ง(10.0.0.0/8) ์์ฒญ์ ์์ ํ๋ก์๋ฅผ ํ์ง ์๊ณ ์ง์ (DIRECT) ์ฐ๊ฒฐ
acl internal_network dst 10.0.0.0/8
always_direct allow internal_network
# ๊ทธ ์ธ ๋ชจ๋ ์ธ๋ถ ์ธํฐ๋ท ์์ฒญ์ ๋ฐ๋์ ์์ ํ๋ก์๋ฅผ ๊ฒฝ์ ํ๋๋ก ๊ฐ์
never_direct allow all
```
---
## 6. ํ๋ก๋์
์ด์ ๋ช
๋ น์ด & ํธ๋ฌ๋ธ์ํ
(Operations)
### ๐ ์ฃผ์ CLI ์ ์ด ๋ช
๋ น์ด ์์ฝ
| ๋ช
๋ น์ด | ๊ธฐ๋ฅ ๋ฐ ์ฌ์ฉ ๋ชฉ์ |
| :--- | :--- |
| `squid -k parse` | ์ค์ ํ์ผ(`/etc/squid/squid.conf`)์ ๋ฌธ๋ฒ ์ค๋ฅ ๋ฐ ๋๋ฝ ์ฌํญ ์ฌ์ ๊ฒ์ฌ |
| `squid -k reconfigure` | **๋ฌด์ค๋จ ์ค์ ๋ฆฌ๋ก๋** (์ ACL์ด๋ ํ์ผ ๋ณ๊ฒฝ ํ ์๋น์ค ์ค๋จ ์์ด ์ฆ์ ๋ฐ์) |
| `squid -z` | ๋์คํฌ ์ค์ ์บ์ ๋๋ ํฐ๋ฆฌ(`cache_dir`) ๊ตฌ์กฐ๋ฅผ ์ ๊ท ์์ฑ/์ด๊ธฐํ |
| `squid -k shutdown` | ๊ธฐ์กด ์ฐ๊ฒฐ์ด ์์ ํ๊ฒ ์ข
๋ฃ๋ ๋๊น์ง ๋๊ธฐ ํ ์ ์ ํ๋ก์ธ์ค ์ข
๋ฃ |
| `squid -k check` | ํ์ฌ Squid ํ๋ก์ธ์ค๊ฐ ๋ฐฑ๊ทธ๋ผ์ด๋์์ ์ ์ ๋์ ์ค์ธ์ง ํ๋ก์ธ์ค ํ์ธ |
| `squidclient mgr:info` | ์บ์ ์ ์ค๋ฅ , ์ฌ์ฉ ๋ฉ๋ชจ๋ฆฌ, ํ์ฑ ์ฐ๊ฒฐ ์ ๋ฑ ์ค์๊ฐ ๋ด๋ถ ํต๊ณ ์กฐํ |
```bash
# squidclient๋ฅผ ํตํ ์บ์ ํต๊ณ ๋ชจ๋ํฐ๋ง
squidclient -p 3128 mgr:info | grep "Request Hit Ratios" -A 2
```
---
### ๐ `access.log` ๋ถ์ ๋ฐ ์บ์ ์ ์ค ์ํ ์ฝ๋ ์ดํด
๋ก๊ทธ ํ์ผ ๊ฒฝ๋ก: `/var/log/squid/access.log`
```bash
# ์ค์๊ฐ ์์ฒญ ๋ฐ ์บ์ ์ ์ค ์ฌ๋ถ ๋ชจ๋ํฐ๋ง
sudo tail -f /var/log/squid/access.log
```
#### ๐ ์ฃผ์ ๋ก๊ทธ ํ๊ทธ (Result Codes)
```
1773239400.123 15 192.168.1.50 TCP_HIT/200 15204 GET http://static.lucky.com/logo.png - HIER_NONE/- image/png
1773239401.456 120 192.168.1.50 TCP_MISS/200 48291 GET http://news.example.com/today.html - HIER_DIRECT/93.184.216.34 text/html
1773239402.001 2 192.168.1.50 TCP_DENIED/403 3921 CONNECT bad-domain.com:443 - HIER_NONE/- text/html
```
| ๋ก๊ทธ ์ํ ํ๊ทธ | ์๋ฏธ ๋ฐ ์ํ ์ค๋ช
| ๊ถ์ฅ ์กฐ์น |
| :--- | :--- | :--- |
| **`TCP_HIT`** | ๋์คํฌ ์บ์์์ ์ ํจํ ์ฌ๋ณธ์ ์ฐพ์ ์ฆ์ ์๋ต ๋ฐํ | ์ ์ (๋คํธ์ํฌ ๋์ญํญ ์ ์ฝ๋จ) |
| **`TCP_MEM_HIT`** | ๋ฉ๋ชจ๋ฆฌ(`cache_mem`)์์ ์ด๊ณ ์์ผ๋ก ๊ฐ์ฒด๋ฅผ ์ฐพ์ ๋ฐํ | ์ต์์ ์ฑ๋ฅ ์ํ |
| **`TCP_MISS`** | ์บ์์ ์์ด ์ธ๋ถ ์๋ณธ ์น ์๋ฒ๋ก ์ง์ ์์ฒญ์ ๊ฐ์ ธ์ด | ์ ์ (์ฒซ ์์ฒญ ๋๋ ๋ง๋ฃ๋ ๊ฐ์ฒด) |
| **`TCP_REFRESH_UNMODIFIED`** | ๋ง๋ฃ๋์ด ์๋ณธ ์๋ฒ์ `If-Modified-Since` ๊ฒ์ฆ ํ 304 ๋ฐ์ ์บ์ ์ฌ์ฌ์ฉ | ํจ์จ์ ์ธ ๊ฐฑ์ ๋์ |
| **`TCP_DENIED`** | `http_access deny` ๊ท์น์ ๊ฑธ๋ ค 403 Forbidden ์ฐจ๋จ๋จ | ์ฐจ๋จ ๋์ ๋๋ฉ์ธ ๋๋ ๋ฏธ์ธ๊ฐ IP ํ์ธ |
| **`TCP_TUNNEL`** | HTTPS CONNECT ๋ฉ์๋๋ฅผ ํตํด ์ํธํ ํฐ๋์ ํต๊ณผ์ํด | ์ผ๋ฐ์ ์ธ HTTPS ํฌ์๋ฉ ์ํ |
---
## 7. ๋ณด์ ๋ฐ ์ฑ๋ฅ ์ต์ ํ ์ฒดํฌ๋ฆฌ์คํธ (Production Checklist)
1. **์คํ ํ๋ก์(Open Proxy) ์ฐจ๋จ ํ์ (`http_access deny all`)**
- ์ค์ ํ์ผ์ ๋ง์ง๋ง ๋ผ์ธ์๋ ๋ฐ๋์ `http_access deny all`์ด ์์นํด์ผ ํฉ๋๋ค.
- ํฌํธ 3128์ด ๊ณต์ธ IP์ ๋
ธ์ถ๋ ์ํ์์ ์ธ๊ฐ๊ฐ ํ๋ ค ์์ผ๋ฉด ์ธ๋ถ ํด์ปค์ ์คํธ ๋ฐ์ก์ง ๋ฐ DDoS ๊ฒฝ์ ์ง๋ก ์
์ฉ๋ฉ๋๋ค.
2. **OS ํ์ผ ๋์คํฌ๋ฆฝํฐ(File Descriptors) ํ์ฅ**
- ๋์ ์ ์์๊ฐ ๋ง์ ๊ฒฝ์ฐ `Too many open files` ์๋ฌ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค.
```bash
# /etc/security/limits.conf
proxy soft nofile 65536
proxy hard nofile 65536
```
- `/etc/squid/squid.conf`์ `max_filedescriptors 65536` ์ง์ .
3. **DNS ์ฟผ๋ฆฌ ์บ์ฑ ์ต์ ํ (`positive_dns_ttl`)**
- Squid๋ ์์ฒด ๋ด๋ถ DNS ํด๋ผ์ด์ธํธ๋ฅผ ๋ด์ฅํ๊ณ ์์ต๋๋ค.
```nginx
# ์ฑ๊ณตํ DNS ์กฐํ 15๋ถ๊ฐ ์บ์ฑ, ์คํจํ DNS ์กฐํ 1๋ถ๊ฐ ์บ์ฑ
positive_dns_ttl 15 minutes
negative_dns_ttl 1 minute
dns_nameservers 1.1.1.1 8.8.8.8
```
4. **ํด๋ผ์ด์ธํธ ๊ฐ์ธ์ ๋ณด ๋ณดํธ ๋ฐ ํค๋ ์์ฅ (Anonymity)**
- ์ธ๋ถ ์น ์๋ฒ์ ์ฌ๋ด ๋ด๋ถ IP๊ฐ ๋
ธ์ถ๋์ง ์๋๋ก X-Forwarded-For ๋ฐ Via ํค๋๋ฅผ ๋นํ์ฑํํฉ๋๋ค.
```nginx
forwarded_for off
via off
request_header_access X-Forwarded-For deny all
```
์๊ฒฌ ๋ฐ ์ง๋ฌธ
0์์ง ๋ฑ๋ก๋ ์๊ฒฌ์ด ์์ต๋๋ค. ์ฒซ ๋ฒ์งธ ๋๊ธ์ ๋จ๊ฒจ๋ณด์ธ์!
๋๊ธ ์์
๋๊ธ ์ญ์