터널링을 위한 로컬 및 원격 SSH 포트 포워딩 구현

SSH 포트 포워딩을 사용하여 안전한 네트워크 액세스 및 방화벽 우회 기능을 활용하십시오. 이 종합 가이드는 로컬(`-L`) 및 원격(`-R`) SSH 터널링 기술의 실질적인 구현 방법을 상세히 설명합니다. 필수 구문을 학습하고, 원격 서비스에 액세스하는 것과 로컬 서비스를 노출하는 것 사이의 주요 차이점을 이해하며, 데이터베이스 연결 보안 또는 개발 환경 공유와 같은 작업에 대한 명확한 예시를 확인하세요. 또한 키 기반 인증을 사용하여 지속적이고 안전한 백그라운드 터널을 생성하기 위한 중요한 모범 사례가 포함되어 있습니다.

31 조회수

로컬 및 원격 SSH 포트 포워딩 구현을 통한 터널링

SSH(Secure Shell)는 안전한 원격 시스템 관리를 위한 필수 프로토콜입니다. 암호화된 터미널 액세스라는 핵심 기능 외에도 SSH는 SSH 터널링이라고도 하는 강력한 기능인 포트 포워딩을 제공합니다. 이 기술을 사용하면 사용자는 임의의 네트워크 트래픽을 SSH 연결을 통해 라우팅하기 위한 안전하고 암호화된 채널을 만들 수 있습니다.

SSH 터널링은 주로 제한적인 방화벽을 우회하거나, 일반 텍스트 프로토콜(HTTP 또는 데이터베이스 연결 등)을 암호화된 SSH 스트림 내에 캡슐화하여 보호하거나, 공개적으로 노출되지 않은 내부 네트워크 리소스에 액세스하는 데 사용됩니다. 로컬 포트 포워딩과 원격 포트 포워딩의 차이점을 이해하는 것은 복잡한 네트워크 아키텍처에서 효과적이고 안전한 터널링 솔루션을 배포하는 데 중요합니다.

본 가이드에서는 로컬 및 원격 SSH 포트 포워딩의 메커니즘, 구문 및 실제 응용 프로그램을 탐구하여 다양한 경계를 넘어 네트워크 트래픽을 안전하게 라우팅하는 데 필요한 지식을 제공합니다.


SSH 터널링 기본 사항 이해하기

SSH 터널은 특정 머신의 특정 포트를 다른 머신의 특정 포트에 매핑하는 안전한 일대일 연결을 설정하며, 이때 SSH 서버가 릴레이 지점 역할을 합니다. 이 터널을 통과하는 모든 데이터는 SSH 프로토콜에 의해 자동으로 암호화되어 기밀성과 무결성을 보장합니다.

포트 포워딩에는 로컬, 원격 및 동적(SOCKS 프록시)의 세 가지 주요 유형이 있습니다. 이 문서는 가장 일반적인 두 가지 직접 터널링 방법인 로컬(-L)과 원격(-R)에 중점을 둡니다.

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

로컬 포트 포워딩은 가장 일반적인 터널링 형태입니다. 이는 로컬 클라이언트 머신(터널이 시작되는 곳)이 SSH 서버를 통해서만 액세스할 수 있는 대상 호스트의 서비스에 액세스할 수 있도록 허용합니다.

로컬 포워딩을 원격 네트워크 내부로의 보안 액세스라고 생각하면 됩니다.

사용 사례: 데이터베이스 액세스 보호

비공개 네트워크(10.0.0.5)에서 실행 중인 MySQL 데이터베이스(포트 3306)에 액세스해야 한다고 가정해 보겠습니다. 로컬 머신은 이 비공개 IP에 직접 액세스할 수 없지만, 배스천 SSH 서버(bastion.example.com)는 액세스할 수 있습니다. 로컬 포워딩은 배스천 호스트를 통해 로컬 머신의 포트를 원격 데이터베이스 포트에 매핑합니다.

로컬 포워딩 구문 (-L)

명령어 구조는 다음과 같습니다:

ssh -L [LocalPort]:[DestinationHost]:[DestinationPort] [SSHUser]@[SSHServer]
매개변수 설명
LocalPort 로컬 머신에서 연결할 포트입니다.
DestinationHost 액세스하려는 최종 서비스의 호스트 이름/IP입니다.
DestinationPort DestinationHost에 있는 최종 서비스의 포트입니다.
SSHServer 터널을 처리하는 중간 서버(배스천 호스트)입니다.

실제 로컬 포워딩 예제

로컬 머신의 포트 9999에 연결하여 원격 MySQL 서버(10.0.0.5:3306)에 액세스하려면:

ssh -L 9999:10.0.0.5:3306 [email protected]

연결이 설정되면 로컬에서 localhost:9999로 이루어지는 모든 연결은 bastion.example.com을 통해 안전하게 터널링되어 10.0.0.5:3306에서 나타납니다.

서비스에 연결하려면:

# 애플리케이션(예: MySQL 클라이언트)을 다음으로 연결:
호스트: 127.0.0.1
포트: 9999

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

원격 포트 포워딩은 덜 직관적입니다. 이는 원격 SSH 서버가 터널이 시작된 로컬 클라이언트 머신에서 실행 중인 서비스에 액세스할 수 있도록 허용합니다.

원격 포워딩을 로컬 서비스를 SSH 서버를 통해 원격 네트워크에 액세스할 수 있도록 만드는 것이라고 생각하면 됩니다.

사용 사례: 로컬 개발 서버 노출

노트북에서 포트 3000으로 로컬 웹 개발 서버를 실행 중인데, 동료(또는 웹훅 서비스)가 공개적으로 액세스 가능한 SSH 서버(public.example.com)를 통해 이 서버에 액세스해야 한다고 가정해 보겠습니다.

원격 포워딩 구문 (-R)

명령어 구조는 다음과 같습니다:

ssh -R [ServerPort]:[DestinationHost]:[DestinationPort] [SSHUser]@[SSHServer]
매개변수 설명
ServerPort SSH 서버에 열릴 포트입니다.
DestinationHost 로컬 측의 호스트(일반적으로 localhost 또는 127.0.0.1)입니다.
DestinationPort 노출하려는 로컬 서비스의 포트입니다.
SSHServer 공개적으로 액세스 가능한 포트를 호스팅할 원격 서버입니다.

실제 원격 포워딩 예제

로컬 웹 서버(포트 3000에서 실행 중)를 공개 SSH 서버의 포트 8080을 통해 노출하려면:

ssh -R 8080:localhost:3000 [email protected]

터널이 설정되면 public.example.com:8080에 연결하는 사용자의 트래픽은 안전하게 로컬 머신의 포트 3000으로 터널링됩니다.

서버 구성 참고 사항: GatewayPorts

기본적으로 대부분의 SSH 서버는 루프백 인터페이스(127.0.0.1)에서만 원격 포워딩된 연결을 수신 대기합니다. SSH 서버에서 포워딩된 포트가 외부 호스트에서 액세스 가능하도록 하려면(즉, 로컬 서비스를 진정으로 공개하려면), SSH 서버(sshd_config)를 구성하여 GatewayPorts yes를 활성화하고 SSH 서비스를 다시 시작해야 합니다. 이 설정을 사용하지 않으면 연결은 SSH 서버 자체에서 직접 실행되는 다른 애플리케이션에서만 사용할 수 있습니다.


SSH 터널링 모범 사례

터널이 안정적이고 안전하며 효율적으로 실행되도록 하려면 다음 운영 팁을 고려하십시오.

터널을 백그라운드에서 실행

지속적인 작업을 위해 터널은 터미널 세션에서 분리되어 백그라운드에서 조용히 실행되어야 합니다. 다음 플래그를 사용하십시오.

  • -N: 원격 명령을 실행하지 않습니다(포트 포워딩 목적으로만 사용됨).
  • -f: ssh에 명령 실행 직전에 백그라운드로 이동하도록 요청합니다.

예제 (백그라운드 로컬 터널):

ssh -Nf -L 80:internal.web.site:80 [email protected]

키 기반 인증 사용

특히 자동화되거나 장기간 실행되는 터널의 경우 항상 암호 대신 SSH 키를 사용하십시오. 이는 암호 프롬프트와 관련된 시간 초과 문제를 방지하며 본질적으로 더 안전합니다.

터널 수명 제어

터널을 사용하는 애플리케이션이 자주 트래픽을 보내지 않으면 비활성 또는 네트워크 문제로 인해 연결이 끊어질 수 있습니다. 이를 방지하려면 클라이언트가 주기적인 "keep alive" 메시지를 보내도록 구성하십시오.

# 연결을 유지하기 위해 60초마다 널 패킷을 보냅니다
ssh -o ServerAliveInterval=60 -L 9999:host:port user@server

보안 고려 사항

  1. 최소 권한 원칙: 필요한 포트만 포워딩하십시오. 광범위하게 열린 터널을 만들지 마십시오.
  2. sshd_config 감사: 원격 포워딩을 사용하는 경우 GatewayPorts yes를 설정하면 내부 서비스가 공개적으로 노출되므로 주의하십시오. SSH 서버를 보호하기 위한 적절한 방화벽 규칙이 있는지 확인하십시오.
  3. 터널 사용자: 가능하다면 터널링을 위해 특별히 고도로 제한된 사용자 계정을 SSH 서버에 생성하고 셸 액세스(/sbin/nologin)를 제한하십시오.

차이점 요약

로컬 포워딩과 원격 포워딩의 근본적인 차이점은 수신 대기 포트의 위치와 SSH 서버에 대한 트래픽 흐름 방향에 있습니다.

기능 로컬 포워딩 (-L) 원격 포워딩 (-R)
수신 대기 포트 클라이언트 머신(로컬) SSH 서버(원격)
트래픽 목표 서버 뒤에 있는 서비스 액세스. 로컬 서비스를 서버를 통해 노출.
시작 클라이언트가 자체 로컬 포트에 연결합니다. 원격 호스트가 서버의 포트에 연결합니다.
방향 (서버 기준) 트래픽이 서버에서 대상 호스트로 흐릅니다. 트래픽이 서버에서 시작 클라이언트로 다시 흐릅니다.

SSH 포트 포워딩은 복잡한 네트워크 환경을 안전하게 탐색하기 위한 강력하고 암호화되며 매우 유연한 방법을 제공합니다. -L-R 플래그를 숙달함으로써 관리자와 개발자는 필요한 네트워크 연결을 달성하는 동시에 민감한 트래픽을 보호할 수 있습니다.