SSH 터널링(포트 포워딩)은 SSH 프로토콜로 맺은 암호화된 연결 안에 다른 TCP 연결을 실어 보내는 기술이다. 중계 서버에 SSH 로 로그인할 수만 있으면, 그 서버가 닿는 다른 서버의 포트를 내 PC 의 포트인 것처럼 쓸 수 있다. 평문 프로토콜(HTTP · 데이터베이스 · JMX)도 구간 전체가 SSH 로 암호화된다.
일반적인 프록시와 연결 방식은 다르지 않다. 다만 터널을 제한하지 않으면 클라이언트가 중계 서버에서 접근 가능한 모든 서버에 닿을 수 있다는 뜻이므로, 운영 정책 없이 열어 두면 오히려 취약해진다.

| 옵션 | 이름 | 방향 | 쓰는 때 |
|---|---|---|---|
-L |
로컬 포워딩 | 내 PC 포트 → 중계 서버 → 목적지 | 내부망 서버의 웹 UI · DB 에 접속 |
-R |
원격 포워딩 | 중계 서버 포트 → 내 PC → 목적지 | 외부에서 내 쪽 서비스로 들어오게 할 때 |
-D |
동적 포워딩(SOCKS) | 내 PC SOCKS 프록시 → 중계 서버 | 브라우저 전체를 내부망 경유로 |
공통 옵션이다.
-N — 원격 셸을 열지 않고 포워딩만 한다.-f — 백그라운드로 보낸다.-p 포트 — 중계 서버의 SSH 포트가 22 가 아닐 때.내 PC 의 포트를 열어 두고, 그리로 오는 연결을 중계 서버를 거쳐 목적지로 보낸다.
# ssh -L $LOCALHOST_LISTEN_PORT:$TARGET_HOST:$TARGET_PORT $USER_NAME@TUNNEL_SERVER
# ssh -L 내_PC에서_오픈할_포트:실제_접속할_서버_호스트:실제_접속할_서버_포트 중계서버_계정@중계서버_호스트
ssh -L 18080:172.17.0.100:8080 user@172.17.200.200
$TARGET_HOST 는 중계 서버에서 보는 이름이다. 중계 서버 자신이 목적지면 localhost 를 적는다.
ssh -L 8443:192.168.1.66:8443 user@192.168.1.162
ssh -N -f -L 15432:localhost:5432 user@db.example.com
브라우저나 클라이언트는 localhost:18080 · localhost:15432 로 접속한다.

기본적으로 내 PC 의 루프백에만 열린다. 같은 네트워크의 다른 장비에도 열어 주려면 -L 0.0.0.0:18080:... 처럼 바인드 주소를 적는다. 그 순간 터널이 무인증 통로가 되므로 꼭 필요한 때만 쓴다.
중계 서버의 포트로 들어온 연결을 내 PC 로 되돌린다. 방화벽 안쪽에서 밖으로만 연결할 수 있을 때 쓴다.
ssh -N -R 18080:localhost:8080 user@public.example.com
public.example.com:18080 으로 오는 연결이 내 PC 의 8080 으로 간다. 서버 설정에 GatewayPorts yes 가 없으면 중계 서버의 루프백에만 열린다.
목적지를 미리 정하지 않고 SOCKS5 프록시를 연다. 브라우저 프록시를 localhost:1080 으로 지정하면 모든 요청이 중계 서버를 거쳐 나간다.
ssh -N -D 1080 user@bastion.example.com
curl --socks5-hostname localhost:1080 http://internal.example.com/
세션이 끊기면 터널도 끊긴다. 오래 두려면 keepalive 를 켜고, ~/.ssh/config 에 적어 두면 명령이 짧아진다.
Host db-tunnel
HostName bastion.example.com
User user
Port 22
IdentityFile ~/.ssh/id_ed25519
LocalForward 15432 db.internal:5432
ServerAliveInterval 30
ServerAliveCountMax 3
ExitOnForwardFailure yes
ssh -N -f db-tunnel
ExitOnForwardFailure yes 를 두면 포트 열기에 실패했을 때 조용히 붙어 있지 않고 종료한다.
중계 서버에 연결하기 전 세션 설정에서 넣거나, 연결한 상태에서 변경 후 적용한다.

Windows 10 이상은 OpenSSH 클라이언트가 기본 포함돼 있어 PowerShell 에서 ssh -L ... 을 그대로 쓸 수도 있다.
# 터널이 열렸는지
ss -lntp | grep 18080
# 백그라운드 터널 종료
pkill -f "ssh -N -f -L 18080"
서버가 포워딩을 막아 두면 administratively prohibited: open failed 가 뜬다. 중계 서버의 /etc/ssh/sshd_config 에서 AllowTcpForwarding 값을 본다.