SSH 터널링을 사용하여 제한된 서버에 액세스하고 안전하게 탐색하는 방법

게시 됨: 2022-01-29

SSH 클라이언트는 다른 컴퓨터 앞에 앉아 있는 것처럼 터미널 명령을 실행할 수 있는 Secure Shell 서버에 연결합니다. 그러나 SSH 클라이언트를 사용하면 로컬 시스템과 원격 SSH 서버 간의 포트를 "터널"할 수도 있습니다.

SSH 터널링에는 세 가지 유형이 있으며 모두 다른 용도로 사용됩니다. 각각은 SSH 서버를 사용하여 한 네트워크 포트에서 다른 네트워크 포트로 트래픽을 리디렉션합니다. 트래픽은 암호화된 SSH 연결을 통해 전송되므로 전송 중에 모니터링하거나 수정할 수 없습니다.

Linux, macOS 및 기타 UNIX 계열 운영 체제에 포함된 ssh 명령을 사용하여 이 작업을 수행할 수 있으며 ssh 구성 파일을 만들어 설정을 저장할 수 있습니다. 내장 ssh 명령이 포함되지 않은 Windows에서는 무료 도구 PuTTY를 사용하여 SSH 서버에 연결하는 것이 좋습니다. SSH 터널링도 지원합니다.

로컬 포트 ​​포워딩: 로컬 시스템에서 원격 리소스에 액세스할 수 있도록 설정

"로컬 포트 ​​포워딩"을 사용하면 인터넷에 노출되지 않은 로컬 네트워크 리소스에 액세스할 수 있습니다. 예를 들어 집에서 사무실에 있는 데이터베이스 서버에 액세스하려고 한다고 가정해 보겠습니다. 보안상의 이유로 해당 데이터베이스 서버는 로컬 사무실 네트워크의 연결만 허용하도록 구성되어 있습니다. 그러나 사무실에서 SSH 서버에 액세스할 수 있고 해당 SSH 서버가 사무실 네트워크 외부에서 연결을 허용하는 경우 집에서 해당 SSH 서버에 연결하고 사무실에 있는 것처럼 데이터베이스 서버에 액세스할 수 있습니다. 다양한 네트워크 리소스를 보호하는 것보다 공격으로부터 단일 SSH 서버를 보호하는 것이 더 쉽기 때문에 종종 그렇습니다.

이렇게 하려면 SSH 서버와 SSH 연결을 설정하고 클라이언트에게 로컬 PC의 특정 포트(예: 포트 1234)의 트래픽을 사무실 네트워크의 데이터베이스 서버 주소 및 해당 포트로 전달하도록 지시합니다. 따라서 현재 PC인 "localhost"의 포트 1234에서 데이터베이스 서버에 액세스하려고 하면 해당 트래픽이 SSH 연결을 통해 자동으로 "터널링"되어 데이터베이스 서버로 전송됩니다. SSH 서버는 중간에 위치하여 트래픽을 앞뒤로 전달합니다. 명령줄이나 그래픽 도구를 사용하여 로컬 PC에서 실행 중인 것처럼 데이터베이스 서버에 액세스할 수 있습니다.

광고

로컬 포워딩을 사용하려면 SSH 서버에 정상적으로 연결하되 -L 인수도 제공합니다. 구문은 다음과 같습니다.

 ssh -L local_port:remote_address:remote_port 사용자 이름@server.com

예를 들어 사무실의 데이터베이스 서버가 사무실 네트워크의 192.168.1.111에 있다고 가정해 보겠습니다. ssh.youroffice.com 에서 사무실의 SSH 서버에 액세스할 수 있으며 SSH 서버의 사용자 계정은 bob 입니다. 이 경우 명령은 다음과 같습니다.

 ssh -L 8888:192.168.1.111:1234 [email protected]

해당 명령을 실행한 후 localhost의 포트 8888에서 데이터베이스 서버에 액세스할 수 있습니다. 따라서 데이터베이스 서버가 웹 액세스를 제공하는 경우 http://localhost:8888을 웹 브라우저에 연결하여 액세스할 수 있습니다. 데이터베이스의 네트워크 주소가 필요한 명령줄 도구가 있는 경우 localhost:8888을 가리킵니다. PC에서 포트 8888로 전송되는 모든 트래픽은 사무실 네트워크에서 192.168.1.111:1234로 터널링됩니다.

SSH 서버 자체와 동일한 시스템에서 실행되는 서버 응용 프로그램에 연결하려는 경우 조금 더 혼란스럽습니다. 예를 들어 사무실 컴퓨터의 포트 22에서 실행되는 SSH 서버가 있지만 동일한 주소의 동일한 시스템에서 포트 1234에서 실행되는 데이터베이스 서버도 있다고 가정해 보겠습니다. 집에서 데이터베이스 서버에 액세스하고 싶지만 시스템은 포트 22에서만 SSH 연결을 허용하고 방화벽은 다른 외부 연결을 허용하지 않습니다.

이 경우 다음과 같은 명령을 실행할 수 있습니다.

 ssh -L 8888:localhost:1234 [email protected]

현재 PC의 포트 8888에서 데이터베이스 서버에 액세스하려고 하면 트래픽이 SSH 연결을 통해 전송됩니다. SSH 서버를 실행하는 시스템에 도착하면 SSH 서버는 SSH 서버 자체를 실행하는 동일한 PC인 "localhost"의 포트 1234로 이를 보냅니다. 따라서 위 명령에서 "localhost"는 원격 서버의 관점에서 "localhost"를 의미합니다.

광고

Windows의 PuTTY 애플리케이션에서 이 작업을 수행하려면 연결 > SSH > 터널을 선택합니다. "로컬"옵션을 선택하십시오. "소스 포트"에 로컬 포트를 입력합니다. "Destination"에는 remote_address:remote_port 형식으로 대상 주소와 포트를 입력합니다.

예를 들어 위와 동일한 SSH 터널을 설정하려면 소스 포트로 8888 을 입력하고 대상 포트로 localhost:1234 를 입력합니다. 이후에 "추가"를 클릭한 다음 "열기"를 클릭하여 SSH 연결을 엽니다. 물론 연결하기 전에 기본 "세션" 화면에서 SSH 서버 자체의 주소와 포트를 입력해야 합니다.

관련: SSH 에이전트 전달이란 무엇이며 어떻게 사용합니까?

원격 포트 전달: 원격 시스템에서 로컬 리소스에 액세스할 수 있도록 설정

"원격 포트 포워딩"은 로컬 포워딩의 반대이며 자주 사용되지 않습니다. SSH 서버에서 사용 가능한 로컬 PC의 리소스를 만들 수 있습니다. 예를 들어, 앞에 앉아 있는 로컬 PC에서 웹 서버를 실행하고 있다고 가정해 보겠습니다. 그러나 PC는 서버 소프트웨어로 들어오는 트래픽을 허용하지 않는 방화벽 뒤에 있습니다.

원격 SSH 서버에 액세스할 수 있다고 가정하면 해당 SSH 서버에 연결하고 원격 포트 전달을 사용할 수 있습니다. SSH 클라이언트는 SSH 서버의 특정 포트(예: 포트 1234)를 현재 PC 또는 로컬 네트워크의 특정 주소 및 포트로 전달하도록 서버에 지시합니다. 누군가 SSH 서버의 포트 1234에 액세스하면 해당 트래픽은 SSH 연결을 통해 자동으로 "터널링"됩니다. SSH 서버에 액세스할 수 있는 모든 사용자는 PC에서 실행되는 웹 서버에 액세스할 수 있습니다. 이것은 방화벽을 통해 터널링하는 효과적인 방법입니다.

원격 전달을 사용하려면 -R 인수와 함께 ssh 명령을 사용하십시오. 구문은 로컬 전달과 거의 동일합니다.

 ssh -R remote_port:local_address:local_port 사용자 이름@server.com

원격 SSH 서버의 포트 8888에서 사용할 수 있는 로컬 PC의 포트 1234에서 수신 대기하는 서버 응용 프로그램을 만들고 싶다고 가정해 보겠습니다. SSH 서버의 주소는 ssh.youroffice.com 이고 SSH 서버의 사용자 이름은 bob 입니다. 다음 명령을 실행합니다.

 ssh -R 8888:localhost:1234 [email protected]
광고

그런 다음 누군가 포트 8888에서 SSH 서버에 연결할 수 있으며 해당 연결은 연결을 설정한 로컬 PC의 포트 1234에서 실행되는 서버 응용 프로그램으로 터널링됩니다.

Windows의 PuTTY에서 이 작업을 수행하려면 연결 > SSH > 터널을 선택합니다. "원격"옵션을 선택하십시오. "소스 포트"에 원격 포트를 입력합니다. "Destination"에 대해 local_address:local_port 형식으로 대상 주소와 포트를 입력합니다.

예를 들어 위의 예를 설정하려면 소스 포트로 8888 을 입력하고 대상 포트로 localhost:1234 를 입력합니다. 이후에 "추가"를 클릭한 다음 "열기"를 클릭하여 SSH 연결을 엽니다. 물론 연결하기 전에 기본 "세션" 화면에서 SSH 서버 자체의 주소와 포트를 입력해야 합니다.

그런 다음 사람들은 SSH 서버의 포트 8888에 연결할 수 있으며 트래픽은 로컬 시스템의 포트 1234로 터널링됩니다.

기본적으로 원격 SSH 서버는 동일한 호스트의 연결만 수신 대기합니다. 즉, SSH 서버 자체와 동일한 시스템에 있는 사람만 연결할 수 있습니다. 이것은 보안상의 이유입니다. 이 동작을 무시하려면 원격 SSH 서버의 sshd_config에서 "GatewayPorts" 옵션을 활성화해야 합니다.

관련: Windows 및 Linux에서 SSH 구성 파일을 관리하는 방법

동적 포트 포워딩: SSH 서버를 프록시로 사용

관련: VPN과 프록시의 차이점은 무엇입니까?

프록시 또는 VPN과 유사하게 작동하는 "동적 포트 전달"도 있습니다. SSH 클라이언트는 사용할 애플리케이션을 구성할 수 있는 SOCKS 프록시를 생성합니다. 프록시를 통해 전송된 모든 트래픽은 SSH 서버를 통해 전송됩니다. 이는 로컬 포워딩과 유사합니다. PC의 특정 포트로 전송된 로컬 트래픽을 SSH 연결을 통해 원격 위치로 전송합니다.

관련: 암호화된 웹 사이트에 액세스할 때도 공용 Wi-Fi 네트워크를 사용하는 것이 위험한 이유

예를 들어 공용 Wi-Fi 네트워크를 사용하고 있다고 가정해 보겠습니다. 스누핑되지 않고 안전하게 탐색하고 싶습니다. 집에서 SSH 서버에 액세스할 수 있는 경우 해당 서버에 연결하여 동적 포트 포워딩을 사용할 수 있습니다. SSH 클라이언트는 PC에 SOCKS 프록시를 생성합니다. 해당 프록시로 전송된 모든 트래픽은 SSH 서버 연결을 통해 전송됩니다. 공용 Wi-Fi 네트워크를 모니터링하는 누구도 사용자의 탐색을 모니터링하거나 사용자가 액세스할 수 있는 웹사이트를 검열할 수 없습니다. 방문하는 웹 사이트의 관점에서 보면 집에서 PC 앞에 앉아 있는 것과 같습니다. 이것은 또한 이 트릭을 사용하여 미국 외부에 있는 동안 미국 전용 웹사이트에 액세스할 수 있음을 의미합니다. 물론 미국의 SSH 서버에 액세스할 수 있다고 가정합니다.

광고

다른 예로 홈 네트워크에 있는 미디어 서버 응용 프로그램에 액세스하려고 할 수 있습니다. 보안상의 이유로 SSH 서버만 인터넷에 노출될 수 있습니다. 인터넷에서 미디어 서버 응용 프로그램으로 들어오는 연결을 허용하지 않습니다. 동적 포트 포워딩을 설정하고 SOCKS 프록시를 사용하도록 웹 브라우저를 구성한 다음 집에서 SSH 시스템 앞에 앉아 있는 것처럼 웹 브라우저를 통해 홈 네트워크에서 실행되는 서버에 액세스할 수 있습니다. 예를 들어 미디어 서버가 홈 네트워크의 포트 192.168.1.123에 있는 경우 SOCKS 프록시를 사용하는 모든 응용 프로그램에 주소 192.168.1.123 을 연결하면 홈 네트워크에 있는 것처럼 미디어 서버에 액세스할 수 있습니다. .

동적 전달을 사용하려면 다음과 같이 -D 인수와 함께 ssh 명령을 실행하십시오.

 ssh -D local_port 사용자 이름@server.com

예를 들어, ssh.yourhome.com 에서 SSH 서버에 액세스할 수 있고 SSH 서버의 사용자 이름이 bob 이라고 가정해 보겠습니다. 동적 전달을 사용하여 현재 PC의 포트 8888에서 SOCKS 프록시를 열려고 합니다. 다음 명령을 실행합니다.

 ssh -D 8888 [email protected]

그런 다음 로컬 IP 주소(127.0.01)와 포트 8888을 사용하도록 웹 브라우저나 다른 애플리케이션을 구성할 수 있습니다. 해당 애플리케이션의 모든 트래픽은 터널을 통해 리디렉션됩니다.

Windows의 PuTTY에서 이 작업을 수행하려면 연결 > SSH > 터널을 선택합니다. "동적"옵션을 선택하십시오. "소스 포트"에 로컬 포트를 입력합니다.

광고

예를 들어 포트 8888에서 SOCKS 프록시를 생성하려면 소스 포트로 8888 을 입력합니다. 이후에 "추가"를 클릭한 다음 "열기"를 클릭하여 SSH 연결을 엽니다. 물론 연결하기 전에 기본 "세션" 화면에서 SSH 서버 자체의 주소와 포트를 입력해야 합니다.

그런 다음 로컬 PC의 SOCKS 프록시(즉, 로컬 PC를 가리키는 IP 주소 127.0.0.1)에 액세스하도록 애플리케이션을 구성하고 올바른 포트를 지정할 수 있습니다.

관련: Firefox에서 프록시 서버를 구성하는 방법

예를 들어 SOCKS 프록시를 사용하도록 Firefox를 구성할 수 있습니다. 이것은 Firefox가 자체 프록시 설정을 가질 수 있고 시스템 전체의 프록시 설정을 사용할 필요가 없기 때문에 특히 유용합니다. Firefox는 SSH 터널을 통해 트래픽을 보내고 다른 응용 프로그램은 인터넷 연결을 정상적으로 사용합니다.

Firefox에서 이 작업을 수행할 때 "수동 프록시 구성"을 선택하고 SOCKS 호스트 상자에 "127.0.0.1"을 입력한 다음 "포트" 상자에 동적 포트를 입력합니다. HTTP 프록시, SSL 프록시 및 FTP 프록시 상자를 비워 둡니다.

SSH 세션 연결이 열려 있는 동안 터널은 활성 상태로 유지되고 열려 있습니다. SSH 세션을 종료하고 서버와의 연결을 끊으면 터널도 닫힙니다. 적절한 명령(또는 PuTTY의 적절한 옵션)으로 다시 연결하여 터널을 다시 열면 됩니다.

관련: 개발자 및 열광자를 위한 최고의 Linux 노트북