4단계
4단계 — SSH 터널 + 루프백 바인딩
25 분
4단계 — SSH 터널 + 루프백 바인딩
운영 서버에 공개 된 포트가 많을수록 보안 취약. 127.0.0.1 바인딩 + SSH 터널 패턴이 표준 답.
문제 — 0.0.0.0 바인딩의 위험
postgres:
ports:
- "5432:5432" # ← 외부 어디서나 접근 가능 (위험!)
이렇게 띄우면 인터넷 어디서든 5432 포트를 두드릴 수 있어요. 봇이 24/7 비밀번호 무차별 대입.
답 — 루프백 바인딩
postgres:
ports:
- "127.0.0.1:5432:5432" # 서버 자기 자신만 접근 가능
127.0.0.1: prefix 가 핵심. 이제 외부에선 닿지 못해요.
그럼 어떻게 접근하지? — SSH 터널
내 노트북 → 운영 서버 의 5432 로 암호화된 터널 을 만들어요.
ssh -L 5433:127.0.0.1:5432 user@my-server.com
이러면:
- 내 노트북의
localhost:5433→ SSH → 서버의127.0.0.1:5432 - 봇은 닿지 못함 (SSH 키 없으면 진입 X)
# 다른 터미널에서
psql -h localhost -p 5433 -U user -d myapp
# → 운영 DB 에 접근 가능
백그라운드 터널 + autossh
매번 ssh 명령을 띄우긴 번거로워요. autossh 가 끊기면 자동 재연결:
autossh -f -N -L 5433:127.0.0.1:5432 user@my-server.com
-f 백그라운드, -N 셸 X (포트 포워딩만).
어떤 포트가 열려야 하나
| 포트 | 외부 노출? |
|---|---|
| 22 (SSH) | ✅ — 키 인증만, 비번 X |
| 80, 443 (HTTP, HTTPS) | ✅ — Caddy 만 |
| 5432 (PostgreSQL) | ❌ — 127.0.0.1 만 |
| 6379 (Redis) | ❌ — 127.0.0.1 만 |
| 3000+ (앱) | ❌ — Caddy 가 reverse_proxy |
운영 서버는 3 개 포트만 외부 노출 (22, 80, 443). 나머지는 모두 SSH 터널로.
ufw 방화벽 한 줄
sudo ufw allow 22/tcp
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw default deny incoming
sudo ufw enable
직접 해 보기
EC2 무료 인스턴스를 띄우고 위 ufw 규칙을 적용. nmap your-ip 로 외부에서 스캔해 보면 3 포트만 보여야 정상.
더 깊이
다음 단계
5단계에서는 진짜 클라우드 — AWS 의 핵심 5 서비스를 만나요.