SSH 문제해결

상황에 따라 Compute Engine 인스턴스가 더 이상 SSH 연결을 허용하지 않을 수 있습니다. 여기에는 여러 가지 이유가 있습니다. SSH 연결 문제의 몇 가지 공통적인 원인이 아래에 나와 있습니다.

  • 인스턴스에 전체 디스크가 있습니다. 디스크 공간을 확인하고 필요에 따라 정리합니다.
  • sshd 데몬이 올바르게 구성되지 않았습니다. 사용 중인 운영체제의 사용자 가이드를 검토하여 ssh_d가 올바르게 설정되었는지 확인합니다.
  • 인스턴스에 OS 로그인이 사용 설정되었습니다. SSH 키와 OS 로그인을 사용하여 인스턴스에 연결할 수 없습니다. OS 로그인이 사용 설정되면 메타데이터 기반 SSH 키를 사용한 연결은 사용 중지됩니다.

이 주제에서는 가장 일반적인 SSH 문제를 해결하는 데 유용한 여러 팁과 접근 방법을 설명합니다.

요구사항

로컬 워크스테이션에서 대부분의 문제해결 단계를 실행할 수 있습니다. VM 인스턴스 문제해결에 로컬 Linux 또는 Windows 워크스테이션을 사용하려면 먼저 워크스테이션을 준비해야 합니다.

워크스테이션을 준비하려면 다음 단계를 따르세요.

  • gcloud 명령줄 도구를 설치하거나 최신 버전으로 업데이트합니다.
  • 사용 중인 운영체제에 대한 nmap 네트워크 탐색 및 보안 감사 도구를 설치합니다. 이 도구는 VM 인스턴스의 네트워크 연결을 테스트하는 데 사용하기도 합니다.
  • 환경 변수를 설정합니다.

환경 변수 설정

인스턴스 이름, 영향을 받는 인스턴스의 영구 부팅 디스크 이름 등 이 문제해결 가이드에서 자주 사용되는 매개변수의 환경 변수를 설정할 수 있습니다.

로컬 워크스테이션에 환경 변수를 설정하세요.

Linux 또는 macOS

Linux 또는 macOS 워크스테이션에서는 export 명령어를 사용하세요.

export PROB_INSTANCE='[INSTANCE_NAME]'
export BOOT_DISK='[BOOT_DISK_NAME]'

각 항목의 의미는 다음과 같습니다.

  • [INSTANCE_NAME]은 문제해결이 필요한 인스턴스의 이름입니다.
  • [BOOT_DISK_NAME]은 문제해결이 필요한 인스턴스의 영구 부팅 디스크의 이름입니다.

예를 들어 인스턴스 이름이 instance1이고 부팅 디스크 이름이 disk1이면 다음 명령어를 실행합니다.

export PROB_INSTANCE='instance1'
export BOOT_DISK='disk1'

Windows

Windows OS에서는 set 명령어를 사용하세요.

set PROB_INSTANCE='[INSTANCE_NAME]'
set BOOT_DISK='[BOOT_DISK_NAME]'

각 항목의 의미는 다음과 같습니다.

  • [INSTANCE_NAME]은 문제해결이 필요한 인스턴스의 이름입니다.
  • [BOOT_DISK_NAME]은 문제해결이 필요한 인스턴스의 영구 부팅 디스크의 이름입니다.

예를 들어 인스턴스 이름이 instance1이고 부팅 디스크 이름이 disk1이면 다음 명령어를 실행합니다.

set PROB_INSTANCE='instance1'
set BOOT_DISK='disk1'

연결 테스트

방화벽, 네트워크 연결 또는 사용자 계정과 관련된 연결 문제로 인해 SSH를 통한 VM 인스턴스 연결이 불가능할 수 있습니다. 어떤 연결 문제가 있는지 확인하려면 이 섹션의 단계를 따르세요.

방화벽 규칙 확인

Compute Engine은 각 프로젝트에 SSH 트래픽을 허용하는 방화벽 규칙 기본 세트를 제공합니다. SSH 연결을 허용하는 기본 방화벽 규칙이 제거될 경우 인스턴스에 액세스할 수 없습니다. gcloud compute 명령줄 도구로 방화벽 목록을 확인하고 default-allow-ssh 규칙이 있는지 확인합니다.

로컬 워크스테이션에서 다음 명령어를 실행하세요.

gcloud compute firewall-rules list

방화벽 규칙이 없으면 다시 추가합니다.

gcloud compute firewall-rules create default-allow-ssh --allow tcp:22

네트워크 연결 테스트

nmap 도구를 사용하여 포트 22의 인스턴스에 연결한 후 네트워크 연결이 제대로 작동하는지 확인합니다. 연결 후 22/tcp open ssh가 표시되면 네트워크 연결이 작동하는 것이므로 방화벽 문제를 배제할 수 있습니다.

  1. gcloud 도구를 사용하여 인스턴스의 외부 natIP를 가져옵니다.

    gcloud compute instances describe $PROB_INSTANCE --format='get(networkInterfaces[0].accessConfigs[0].natIP)'
    198.51.100.1
    
  2. 인스턴스의 네트워크 연결을 테스트합니다.

    nmap 명령어를 실행하여 인스턴스의 네트워크 연결을 테스트할 수 있습니다.

    nmap [EXTERNAL_IP]
    

    여기서 [EXTERNAL_IP]는 인스턴스의 외부 IP입니다.

    예를 들어 인스턴스의 외부 IP가 198.51.100.1이면 다음 명령어를 실행합니다.

    user@local:~$  nmap 198.51.100.1
    
    Starting Nmap 7.70 ( https://nmap.org ) at 2019-03-18 16:04 Greenwich Standard Time
    Nmap scan report for 229.30.196.35.bc.googleusercontent.com (198.51.100.1)
    Host is up (0.0061s latency).
    Not shown: 998 filtered ports
    PORT     STATE  SERVICE
    22/tcp   open   ssh
    Nmap done: 1 IP address (1 host up) scanned in 6.22 seconds
    

다른 사용자로 연결

로그인이 안 되는 문제는 사용자 계정에 국한된 문제일 수 있습니다. 예를 들어 인스턴스에 있는 ~/.ssh/authorized_keys 파일에 대한 권한이 사용자에게 올바르게 설정되지 않았을 수 있습니다.

SSH 요청에 다른 사용자 이름을 지정하여 gcloud 도구를 사용해 다른 사용자로 로그인을 시도하세요. gcloud 도구는 프로젝트의 메타데이터를 업데이트하여 새 사용자를 추가하고 SSH 액세스를 허용합니다.

user@local:~$ gcloud compute ssh [USER]@$PROB_INSTANCE

여기서 [USER]는 로그인할 새로운 사용자 이름입니다.

직렬 콘솔의 문제 디버그

경우에 따라 직렬 콘솔에서 로그를 검토하여 연결 오류를 찾을 수 있습니다. 브라우저를 사용하여 로컬 워크스테이션에서 직렬 콘솔에 액세스하세요.

인스턴스의 직렬 콘솔에 대한 읽기-쓰기 액세스를 사용 설정하면 콘솔에 로그인하여 인스턴스 문제를 해결할 수 있습니다. 이 방법은 SSH로 로그인할 수 없거나 인스턴스에 네트워크 연결이 없는 경우 특히 유용합니다. 직렬 콘솔은 두 경우 모두에서 액세스 가능한 상태로 유지됩니다.

대화형 액세스 사용 설정 방법 및 인스턴스의 직렬 콘솔 연결 방법에 대해 알아보려면 직렬 콘솔과 상호작용을 참조하세요.

VM 인스턴스를 종료하지 않은 상태로 검사

연결할 수 없는 인스턴스에서 계속해서 올바른 프로덕션 트래픽을 제공하는 경우가 있습니다. 이 경우에는 인스턴스를 중단하지 않은 상태에서 디스크를 검사해야 합니다.

인스턴스를 검사하려면 부팅 디스크의 스냅샷을 만들고, 스냅샷에서 새 디스크를 만든 다음 임시 인스턴스를 만든 후, 새 영구 디스크를 임시 인스턴스에 마운트하여 디스크 문제를 해결해야 합니다.

  1. 복제된 인스턴스를 호스팅하는 새 VPC 네트워크를 만듭니다.

    gcloud compute networks create debug-network
    
  2. SSH를 통한 네트워크 연결을 허용하는 방화벽 규칙을 추가합니다.

    gcloud compute firewall-rules create debug-network-allow-ssh --allow tcp:22
    
  3. 부팅 디스크의 스냅샷을 만듭니다.

    gcloud compute disks snapshot $BOOT_DISK --snapshot-name debug-disk-snapshot
    
  4. 방금 만든 스냅샷으로 새 디스크를 만듭니다.

    gcloud compute disks create example-disk-debugging --source-snapshot debug-disk-snapshot
    
  5. 외부 IP 주소 없이 새 디버깅 인스턴스를 만듭니다

    gcloud compute instances create debugger --network debug-network --no-address
    
  6. 디버깅 디스크를 인스턴스에 연결합니다.

    gcloud compute instances attach-disk debugger --disk example-disk-debugging
    
  7. 안내에 따라 외부 IP 주소 없이 인스턴스에 연결합니다.

  8. 디버거 인스턴스에 로그인한 후 인스턴스 문제를 해결합니다. 예를 들어 다음과 같이 인스턴스 로그를 살펴볼 수 있습니다.

    $ sudo su -
    
    $ mkdir /mnt/$PROB_INSTANCE
    
    $ mount /dev/disk/by-id/scsi-0Google_PersistentDisk_example-disk-debugging /mnt/$PROB_INSTANCE
    
    $ cd /mnt/$PROB_INSTANCE/var/log
    
    # Identify the issue preventing ssh from working
    $ ls
    

시작 스크립트 사용

위의 방법을 사용해도 문제가 해결되지 않으면 시작 스크립트를 만들어 인스턴스 시작 직후 정보를 수집할 수 있습니다. 시작 스크립트 실행에 대한 안내를 따릅니다.

이후 메타데이터가 적용되기 전에 gcloud compute instances reset을 사용하여 인스턴스를 재설정해야 합니다. 또는 진단 시작 스크립트를 실행하여 인스턴스를 다시 만들 수도 있습니다.

  1. --keep-disks 플래그로 gcloud compute instances delete를 실행합니다.

    gcloud compute instances delete $PROB_INSTANCE --keep-disks boot
    
  2. 동일한 디스크의 새 인스턴스를 추가하고 시작 스크립트를 지정합니다.

    gcloud compute instances create new-instance --disk name=$BOOT_DISK,boot=yes --startup-script-url URL
    

compute-ssh-diagnostic 스크립트를 시작점으로 사용하여 가장 일반적인 문제에 대한 진단 정보를 수집할 수 있습니다.

새 인스턴스에서 디스크 사용

이 문서의 다른 단계가 효과가 없거나 영구 부팅 디스크에서 데이터를 복구해야 하는 경우에는 부팅 디스크를 분리한 다음 이 디스크를 새 인스턴스의 보조 디스크로 연결할 수 있습니다.

gcloud compute instances delete $PROB_INSTANCE --keep-disks=boot
gcloud compute instances create new-instance --disk name=$BOOT_DISK,boot=yes,auto-delete=no
gcloud compute ssh new-instance
이 페이지가 도움이 되었나요? 평가를 부탁드립니다.

다음에 대한 의견 보내기...

Compute Engine 문서