SSH 터널링 설명: 원격 서비스에 안전하게 액세스하기

SSH 터널링을 사용하여 로컬, 원격 및 동적 포워딩으로 프라이빗 데이터베이스, 웹 앱 및 원격 서비스에 접근하세요.

SSH 터널링 설명: 원격 서비스에 안전하게 접근하기

SSH 터널링은 해당 서비스를 인터넷에 노출하지 않고 원격 서비스에 접근할 수 있게 해줍니다. 데이터베이스, 관리 대시보드 또는 개발 서버가 배스천 호스트에서만 접근 가능한 경우, SSH 터널을 통해 로컬 도구가 안전하게 접근할 수 있는 경로를 제공합니다.

주요 패턴은 로컬 포워딩, 원격 포워딩, 동적 포워딩입니다. 각각은 다른 질문에 답합니다: 원격에 있는 것에 접근해야 합니까, 로컬에 있는 것을 노출해야 합니까, 아니면 SOCKS 프록시를 생성해야 합니까?

SSH 터널링이란?

SSH 터널링은 애플리케이션 트래픽을 SSH 연결 내부에 감쌉니다. 서비스에 직접 연결하는 대신 로컬 또는 원격 포워딩된 포트에 연결합니다. SSH는 암호화된 세션을 통해 해당 트래픽을 전달하고 터널의 올바른 측에서 최종 목적지에 연결합니다.

터널은 SSH 클라이언트와 SSH 서버 간의 트래픽을 암호화합니다. 최종 목적지가 SSH 서버 너머에 있는 경우, 마지막 구간은 대상 서비스가 제공하는 보안을 사용합니다. 민감한 서비스의 경우 터널을 사용하더라도 TLS 또는 기본 암호화를 활성화된 상태로 유지하세요.

SSH 터널의 유형

SSH는 세 가지 주요 포트 포워딩 유형을 제공하며, 각각 다른 목적을 제공합니다:

1. 로컬 포트 포워딩 (-L)

로컬 포트 포워딩은 가장 일반적인 유형입니다. 로컬 머신의 포트에서 원격 머신(또는 원격 SSH 서버에서 접근 가능한 머신)의 포트로 트래픽을 전달할 수 있습니다. 이는 로컬 네트워크에서 직접 접근할 수 없는 원격 서버의 내부 네트워크 또는 서버 자체에서 실행되는 서비스에 접근하는 데 이상적입니다.

작동 방식: SSH 클라이언트가 로컬 머신에서 수신 대기합니다. SSH 서버가 목적지에 연결합니다.

사용 사례: 배스천 호스트만 접근할 수 있는 포트 3306의 MySQL 데이터베이스에 접근.

명령 구문:

ssh -L [LOCAL_PORT]:[DESTINATION_HOST]:[DESTINATION_PORT] [SSH_USER]@[SSH_SERVER]

예시:

db.internal.example.com(포트 3306)에서 실행 중인 MySQL 데이터베이스가 있고 bastion.example.com에만 SSH로 접근할 수 있다고 가정합니다. 로컬 머신의 포트 8888에서 데이터베이스에 접근하려면:

ssh -L 8888:db.internal.example.com:3306 [email protected]

이 명령을 실행한 후 로컬 MySQL 클라이언트를 열고 localhost:8888에 연결할 수 있습니다. 트래픽은 bastion.example.com을 통해 db.internal.example.com:3306으로 안전하게 터널링됩니다.

원격 셸이 필요하지 않은 경우 -N을 사용하세요:

ssh -N -L 8888:db.internal.example.com:3306 [email protected]

스크립트의 경우 -o ExitOnForwardFailure=yes를 추가하여 로컬 리스너를 생성할 수 없으면 SSH가 종료되도록 합니다.

2. 원격 포트 포워딩 (-R)

원격 포트 포워딩은 로컬 포워딩의 반대입니다. 원격 SSH 서버의 포트에서 로컬 머신 또는 로컬 머신에서 접근 가능한 머신의 포트로 트래픽을 전달할 수 있습니다. 이는 로컬 머신(또는 로컬 네트워크의 머신)에서 실행 중인 서비스를 원격 서버 또는 해당 네트워크에 노출하는 데 유용합니다.

작동 방식: SSH 서버가 원격 포트에서 수신 대기합니다. SSH 클라이언트가 터널의 로컬 측에서 목적지에 연결합니다.

사용 사례: 원격 동료가 로컬 머신에서 실행 중인 웹 개발 서버(예: 포트 5000의 Flask 앱)에 로컬 머신을 인터넷에 직접 노출하지 않고 접근할 수 있도록 허용.

명령 구문:

ssh -R [REMOTE_PORT]:[DESTINATION_HOST]:[DESTINATION_PORT] [SSH_USER]@[SSH_SERVER]

예시:

로컬 머신의 localhost:5000에서 웹 애플리케이션을 실행 중이라고 가정합니다. remote.example.com의 사용자가 remote.example.com의 포트 9000에 연결하여 접근할 수 있도록 하려면:

ssh -R 9000:localhost:5000 [email protected]

일반적인 OpenSSH 구성에서 원격 리스너는 SSH 서버의 루프백 인터페이스에서만 사용할 수 있습니다. 즉, 원격 호스트의 사용자는 localhost:9000을 테스트할 수 있지만, 다른 머신이 반드시 remote.example.com:9000에 접근할 수 있는 것은 아닙니다.

리스너를 다른 머신에 노출하려면 일반적으로 명령에 0.0.0.0과 같은 바인드 주소와 서버 측 GatewayPorts 설정(예: clientspecified 또는 yes)이 필요합니다. 주의하세요: 원격 포워딩은 노트북이나 로컬 네트워크의 서비스를 원격 네트워크에 노출할 수 있습니다.

3. 동적 포트 포워딩 (-D)

동적 포트 포워딩은 로컬 머신에 SOCKS 프록시를 생성합니다. 특정 목적지로 트래픽을 전달하는 대신, 이 SOCKS 프록시를 사용하도록 구성된 애플리케이션이 SSH 서버에서 접근 가능한 모든 호스트와 포트에 연결할 수 있습니다. 이는 SSH 연결을 다목적 프록시 서버로 효과적으로 전환합니다.

작동 방식: SSH 클라이언트가 SOCKS 프록시로 수신 대기합니다. SOCKS를 지원하는 애플리케이션은 해당 로컬 프록시에 요청을 보내고, SSH 서버가 아웃바운드 연결을 만듭니다.

사용 사례: 공용 Wi-Fi 네트워크에서 모든 브라우저 트래픽을 집이나 사무실의 SSH 서버를 통해 라우팅하여 안전하게 웹을 탐색합니다. 이는 브라우징 활동을 암호화합니다.

명령 구문:

ssh -D [LOCAL_PORT] [SSH_USER]@[SSH_SERVER]

예시:

로컬 머신에서 포트 1080에서 수신 대기하는 SOCKS 프록시를 생성하려면:

ssh -D 1080 [email protected]

이 명령을 실행한 후 브라우저나 다른 애플리케이션을 localhost:1080의 SOCKS 프록시를 사용하도록 구성합니다. 애플리케이션이 SOCKS5를 통한 원격 DNS를 지원하는 경우 DNS 개인정보 보호가 중요할 때 활성화하세요.

실용적인 응용 및 이점

SSH 터널링은 다양한 실용적인 응용을 제공합니다:

  • 안전한 데이터베이스 접근: 데이터베이스 포트를 인터넷에 직접 노출하지 않고, 프라이빗 네트워크의 특정 서버에서만 접근 가능한 데이터베이스(예: PostgreSQL, MySQL, MongoDB)에 접근.
  • 내부 웹 서비스 접근: 공개적으로 노출되지 않은 내부 웹 애플리케이션, 관리 인터페이스 또는 모니터링 대시보드에 연결.
  • 암호화되지 않은 프로토콜 보호: VNC, FTP 또는 일반 HTTP와 같은 안전하지 않은 프로토콜을 암호화된 SSH 터널 내에 감싸 기밀성과 무결성을 제공.
  • 네트워크 제한 극복: 접근이 허용된 서버를 통해 서비스에 접근. 조직의 네트워크 정책을 준수하는 경우에만 이 작업을 수행하세요.
  • 안전한 원격 개발: 원격 서버에서 실행되는 개발 환경이나 도구에 대한 안전한 접근 제공.

요약

로컬 노트북이 프라이빗 원격 서비스에 접근해야 할 때는 로컬 포워딩을 사용하세요. 원격 호스트가 가까운 서비스에 임시로 접근해야 할 때는 원격 포워딩을 사용하세요. 신뢰할 수 있는 SSH 서버를 통해 SOCKS 프록시가 필요할 때는 동적 포워딩을 사용하세요. 터널을 가능한 한 좁게 유지하고 작업이 완료되면 닫으세요.