SSH 터널링 또는 SSH 포트 전달은 서비스 포트를 릴레이할 수 있는 클라이언트와 서버 시스템 간에 암호화된 SSH 연결을 생성하는 방법입니다.
SSH 전달은 VNC 또는 FTP와 같이 암호화되지 않은 프로토콜을 사용하거나, 지역 제한 콘텐츠에 액세스하거나, 중간 방화벽을 바이패스하는 서비스의 네트워크 데이터를 전송하는 데 유용합니다. 기본적으로 TCP 포트를 포워딩하고 보안 SSH 연결을 통해 트래픽을 터널링할 수 있습니다.
SSH 포트 전달에는 세 가지 유형이 있습니다.
로컬 포트 전달. - 클라이언트 호스트에서 SSH 서버 호스트로 연결을 전달한 다음 대상 호스트 포트로 전달합니다.
원격 포트 전달. - 서버 호스트에서 클라이언트 호스트로 포트를 전달한 다음 대상 호스트 포트로 전달합니다.
동적 포트 전달 - 포트 범위 간 통신을 허용하는 SOCKS 프록시 서버를 작성합니다.
로컬, 원격 및 동적 암호화된 SSH 터널을 설정하는 방법에 대해 설명합니다.
로컬 포트 포워딩
로컬 포트 전달을 사용하면 로컬(ssh 클라이언트) 시스템의 포트를 원격(ssh 서버) 시스템의 포트로 전달한 다음 대상 시스템의 포트로 전달할 수 있습니다.
이 전달 유형에서 SSH 클라이언트는 지정된 포트에서 수신한 후 해당 포트에 대한 모든 연결을 원격 SSH 서버의 지정된 포트로 터널링한 다음 대상 시스템의 포트에 연결합니다. 대상 시스템은 원격 SSH 서버 또는 다른 시스템일 수 있습니다.
로컬 포트 전달은 대부분 데이터베이스 또는 VNC 서버와 같은 내부 네트워크의 원격 서비스에 연결하는 데 사용됩니다.
Linux, macOS 및 기타 Unix 시스템에서 로컬 포트 전달을 만들려면 -L 옵션을 ssh 클라이언트로 전달합니다.
ssh -L [LOCAL_IP:]LOCAL_PORT:DESTINATION:DESTINATION_PORT [USER@]SSH_SERVER
[LOCAL_IP:]LOCAL_PORT - 로컬 시스템 IP 주소 및 포트 번호입니다. LOCAL_IP가 생략되었습니다. 로컬 호스트에서 ssh 클라이언트 바인딩됩니다.
DESTINATION:DESTINATION_PORT - 대상 시스템의 IP 또는 호스트 이름과 포트입니다.
[USER@]SERVER_IP - 원격 SSH 사용자 및 서버 IP 주소입니다.
1024보다 큰 포트 번호를 LOCAL_PORT로 사용할 수 있습니다. 1024보다 작은 포트 번호는 권한이 있는 포트이며 루트에서만 사용할 수 있습니다. SSH 서버가 22가 아닌 다른 포트에서 수신 중인 경우(기본값) -p [PORT_NUMBER] 옵션을 사용합니다.
대상 호스트 이름은 SSH 서버에서 확인할 수 있어야 합니다.
내부(개인) 네트워크의 machine db001.host에서 실행되는 MySQL 데이터베이스 서버가 machine pub001에서 액세스할 수 있는 포트 3306에 있다고 가정합니다.로컬 시스템 MySQL 클라이언트를 사용하여 데이터베이스 서버에 연결하려고 합니다. 다음 명령을 사용하여 연결을 전달할 수 있습니다.
ssh -L 3336:db001.host:3306 user@pub001.host
명령을 실행하면 원격 SSH 사용자 암호를 입력하라는 메시지가 표시됩니다. 입력하면 원격 서버에 로그인되고 SSH 터널이 설정됩니다. SSH 키 기반 인증을 설정하고 암호를 입력하지 않고 서버에 연결하는 것도 좋습니다.
이제 로컬 컴퓨터 데이터베이스 클라이언트를 127.0.0.1:3336으로 지정하면 연결이 db001.host:3306로 전달되고 pub001.host를 통해 MySQL 서버를 설치할 수 있습니다. 중간 서버 역할을 하는 호스트 시스템입니다.
단일 ssh 명령으로 여러 포트를 여러 대상에 전달할 수 있습니다. 예를 들어, 컴퓨터 db002에서 다른 MySQL 데이터베이스 서버가 실행되고 있습니다.로컬 클라이언트에서 두 서버에 모두 연결하려는 경우 다음을 실행합니다.
ssh -L 3336:db001.host:3306 3337:db002.host:3306 user@pub001.host
두 번째 서버에 연결하려면 127.0.0.1:3337을 사용합니다.
대상 호스트가 SSH 서버와 동일한 경우 대상 호스트 IP 또는 호스트 이름을 지정하는 대신 localhost를 사용할 수 있습니다.
동일한 서버에서 실행되는 VNC를 통해 원격 시스템에 연결해야 하며 외부에서 액세스할 수 없습니다. 사용하는 명령은 다음과 같습니다.
ssh -L 5901:127.0.0.1:5901 -N -f user@remote.host
-f 옵션은 ssh 명령을 백그라운드에서 실행하고 -N 명령을 실행하지 않도록 합니다. VNC와 SSH 서버가 동일한 호스트에서 실행 중이므로 localhost를 사용합니다.
터널링을 설정하는 데 문제가 있는 경우, 원격 SSH 서버 구성을 확인하고 AllowTcpForwarding이 아니요로 설정되어 있지 않은지 확인하십시오. 기본적으로 전달이 허용됩니다.
원격 포트 포워딩
원격 포트 전달은 로컬 포트 전달의 반대입니다. 원격(ssh 서버) 시스템의 포트를 로컬(ssh 클라이언트) 시스템의 포트에 전달하고 대상 시스템의 포트에 전달할 수 있습니다.
이 전달 유형에서 SSH 서버는 지정된 포트에서 수신한 후 해당 포트에 대한 모든 연결을 로컬 SSH 클라이언트의 지정된 포트로 터널링한 다음 대상 시스템의 포트에 연결합니다. 대상 시스템은 로컬 또는 다른 시스템일 수 있습니다.
원격 포트 전달을 생성하는 Linux, macOS 및 기타 Unix 시스템에서 -R 옵션을 ssh 클라이언트로 전달합니다.
ssh -R [REMOTE:]REMOTE_PORT:DESTINATION:DESTINATION_PORT [USER@]SSH_SERVER
사용되는 옵션은 다음과 같습니다.
[REMOTE:]REMOTE_PORT - 원격 SSH 서버의 IP 및 포트 번호입니다. REMOTE가 비어 있으면 원격 SSH 서버가 모든 인터페이스에서 바인딩됩니다.
DESTINATION:DESTINATION_PORT - 대상 시스템의 IP 또는 호스트 이름과 포트입니다.
[USER@]SERVER_IP - 원격 SSH 사용자 및 서버 IP 주소입니다.
원격 포트 포워딩은 대부분 외부로부터 내부 서비스에 대한 액세스를 제공하는 데 사용됩니다.
로컬 컴퓨터에서 웹 응용 프로그램을 개발하고 있으며 동료 개발자에게 미리 보기를 표시하려고 합니다. 공용 IP가 없으므로 다른 개발자가 인터넷을 통해 응용프로그램에 액세스할 수 없습니다.
원격 SSH 서버에 액세스할 수 있는 경우 다음과 같이 원격 포트 전달을 설정할 수 있습니다.
ssh -R 8080:127.0.0.1:3000 -N -f user@remote.host
위의 명령을 실행하면 ssh 서버가 포트 8080에서 수신되고 이 포트의 모든 트래픽이 포트 3000에서 로컬 시스템으로 터널링됩니다.
이제 동료 개발자가 브라우저에 _ssh_server_ip:8080을 입력하고 응용 프로그램을 미리 볼 수 있습니다.
원격 포트 전달을 설정하는 데 문제가 있는 경우 원격 SSH 서버 구성에서 GatewayPorts가 yes로 설정되어 있는지 확인하십시오.
동적 포트 전달
동적 포트 전달을 사용하면 로컬(ssh 클라이언트) 시스템에서 SOCKS 프록시 서버 역할을 하는 소켓을 만들 수 있습니다. 클라이언트가 이 포트에 연결하면 연결이 원격(ssh 서버) 시스템으로 전달되고, 원격(ssh 서버) 시스템이 대상 시스템의 동적 포트로 전달됩니다.
이렇게 하면 SOCKS 프록시를 사용하는 모든 응용 프로그램이 SSH 서버에 연결되고 서버가 모든 트래픽을 실제 대상으로 전달합니다.
Linux, macOS 및 기타 Unix 시스템에서 동적 포트 전달(SOCKS)을 작성하기 위해 -D 옵션을 ssh 클라이언트로 전달합니다.
ssh -D [LOCAL_IP:]LOCAL_PORT [USER@]SSH_SERVER
사용되는 옵션은 다음과 같습니다.
[LOCAL_IP:]LOCAL_PORT - 로컬 시스템 IP 주소 및 포트 번호입니다. LOCAL_IP가 누락되었을 때, localhost에서 ssh 클라이언트를 바인딩합니다.
[USER@]SERVER_IP - 원격 SSH 사용자 및 서버 IP 주소입니다.
동적 포트 전달의 일반적인 예는 SSH 서버를 통해 웹 브라우저 트래픽을 터널링하는 것입니다.
다음 명령은 포트 9090에 SOCKS 터널을 만듭니다.
ssh -D 9090 -N -f user@remote.host
터널링이 설정되면 터널링을 사용하도록 응용 프로그램을 구성할 수 있습니다. 이 문서에서는 SOCKS 프록시를 사용하도록 Firefox 및 Google Chrome 브라우저를 구성하는 방법에 대해 설명합니다.
트래픽의 터널링을 원하는 각 응용 프로그램에 대해 포트 전달을 별도로 구성해야 합니다.
Windows에서 SSH 터널링을 설정
윈도우즈 사용자는 PuTTY SSH 클라이언트를 사용하여 SSH 터널을 생성할 수 있습니다. PuTTY를 다운로드할 수 있습니다.
Putty를 시작하고 Host name(또는 IP 주소) 필드에 SSH 서버 IP 주소를 입력합니다.
연결 메뉴에서 SSH를 확장하고 터널을 선택합니다. 로컬 라디오 버튼을 선택하여 로컬, 원격은 원격, 동적 포트 전달은 Dynamic을 설정합니다.
로컬 전달을 설정할 때 소스 포트 필드에 로컬 전달 포트를 입력하고 대상에 대상 호스트 및 IP를 입력합니다(예: localhost:5901).
원격 포트 전달의 경우 Source Port(소스 포트) 필드에 원격 SSH 서버 전달 포트를 입력하고 Destination(대상)에 대상 호스트 및 IP를 입력합니다(예: localhost:3000).
동적 전달을 설정하는 경우 [소스 포트] 필드에 로컬 SOCKS 포트만 입력합니다.
아래 이미지와 같이 Add(추가) 버튼을 클릭합니다.
세션 페이지로 돌아가 설정을 저장하여 매번 입력할 필요가 없습니다. [저장된 세션] 필드에 세션 이름을 입력하고 [저장] 단추를 클릭합니다.
저장된 세션을 선택하고 열기 버튼을 클릭하여 원격 서버에 로그인합니다.
사용자 이름과 암호를 묻는 새 창이 나타납니다. 사용자 이름과 암호를 입력하면 서버에 로그인되고 SSH 터널이 시작됩니다.
공용 키 인증을 설정하면 암호를 입력하지 않고도 서버에 연결할 수 있습니다.
지금까지 SSH 터널을 설정하고 보안 SSH 연결을 통해 트래픽을 전달하는 방법을 살펴보았습니다. SSH 구성 파일에서 SSH 터널을 정의하거나 SSH 터널을 설정할 Bash 별칭을 만들 수 있습니다.
'SW > 리눅스' 카테고리의 다른 글
Linux : Hostname 변경, 설정 방법, 예제, 명령어 (0) | 2021.11.25 |
---|---|
Linux : IP Address 조회, 얻는 방법, 예제, 명령어 (0) | 2021.11.24 |
Linux : Du 명령어, 예제, 사용 방법 (0) | 2021.11.22 |
Linux : Directory 삭제 ,제거 방법, 예제, 명령어 (0) | 2021.11.21 |
Linux : Cp 명령어, 예제, 사용 방법 (파일 복사) (0) | 2021.11.20 |