홈 서버에서 구동한 후, 외부에서 사이트(namecheap.com에서 구매한 도메인)으로 접속까지 완성하였다.
그런데 만약, 데이터들을 더 추가해야 하는 일이 생긴다면?
SSH 포트 포워딩으로 DB 접속 통로를 열어서, 맥에서 로컬로 `load.py`를 그대로 실행하면 홈 서버의 Docker MySQL에 데이터가 들어간다. MySQL의 '루프백만 허용' 제한은 그대로 유지되고, 그 안에서 SSH가 대신 노크해주는 상황이다.
# load.py
# 로컬 설정 그대로 둔 채로 터널만 붙이는 법
# DB_HOST는 localhost로 설정
# DB 접속
def get_connection():
conn = pymysql.connect(
host=config.DB_HOST,
port=config.DB_PORT,
user=config.DB_USER,
password=config.DB_PASSWORD,
database=config.DB_NAME,
charset="utf8mb4",
autocommit=False,
)
return conn
이 과정이 동작하는 방식은 다음과 같다.
먼저, 루프백이란 무엇인가?
컴퓨터가 "자기 자신"과 통신할 때 쓰는 네트워크 경로이다.
주소로는 `127.0.0.1` / `localhost`라는 이름으로 부르는 게 바로 이것이다.
홈 서버의 MySQL은 `127.0.0.1`(자기 자신)에서 온 접속만 받아준다.
그런데 맥에서 `load.py`를 돌리면 어떻게 통과할 수 있는가?
‼️진짜로 문을 통과하는 게 아니라, SSH가 문 안쪽까지 대신 들어가서 노크를 해 준다‼️

[시나리오 A]
맥이 홈서버 IP로 포트에 곧장 접속하면, MySQL은 `127.0.0.1`에서 온 게 아니기 때문에 거부한다.
[시나리오 B]
같은 요청을 SSH 터널에 태우면, 실제로 MySQL 앞에서 노크하는 건 홈 서버 안에 있는 sshd 자신이 되어 루프백 조건을 그대로 만족시킨다.
패킷 하나가 지나가는 과정
* 3307 포트는 내가 설정한 값이다. DB 포트가 3306(기본값)으로 설정되어 있으면 3307 말고 3306을 쓰면 된다.
- [맥] `ssh -fNL 3307:localhost:3307 <홈서버계정>@<홈서버주소>` 실행 → 맥의 `localhost:3307`에 SSH가 리스닝 포트를 하나 열어둠
- [맥] `load.py`가 `.env` 파일에 적혀 있는 설정(`DB_HOST, DB_PORT`)대로 가짜 문에 접속
- [맥 → 홈서버] SSH 클라이언트가 이 데이터를 통째로 암호화해서, 이미 열려있는 SSH 연결(홈 서버의 22번 포트)에 실어서 전송
- [홈서버] `sshd`가 데이터를 복호화하고, `-L`에 적힌 목적지 `localhost:3307` - 즉, 홈서버 자기 자신의 `127.0.0.1:3307` - 로 새 연결을 만들어 대신 접속
- [홈서버] MySQL이 소켓을 보니 발신지가 `127.0.0.1` - 규칙대로 루프백이니 접속을 허용하고, 응답은 같은 경로를 거꾸로 타고 `load.py`에게 돌아감
명령어 해부
ssh -fNL 3307:localhost:3307 <홈서버계정>@<홈서버주소>
| 명령어 | 설명 |
| -fNL | f: 백그라운드 실행 N: 셸은 안 띄우고 포워딩만 L: 로컬 포트 포워딩 * 셋 다 인자가 없어 붙여 써도 무방 |
| 앞의 3307 | 맥에 새로 여는 포트 번호. 이 숫자가 기준 |
| localhost:3307 | SSH로 로그인한 홈서버가 최종적으로 접속할 주소 홈서버 입장의 '자기 자신' |
| <홈서버계정>@<홈서버주소> | 이 터널을 열 수 있는 자격 SSH 로그인 인증을 통과한 사람만 애초에 이 통로를 만들 수 있음 |
한 마디로,
MySQL의 "루프백만 허용" 제한은 그대로 둔 채, SSH 포트 포워딩으로 홈 서버가 자기 자신에게
대신 접속해주는 통로를 열어두면, 맥에서는 평소처럼 로컬 접속인 줄 알고 그대로 실행하면 된다.
'홈 서버 구축기' 카테고리의 다른 글
| 4. CloudFlare Tunnel 연결 (0) | 2026.08.28 |
|---|---|
| 3. 외부 접속 허용 - Tailscale (0) | 2026.08.24 |
| 2. 노트북에 리눅스 설치 (Ubuntu Server) (0) | 2026.08.24 |
| 1. 리눅스 부팅 (0) | 2026.08.24 |