SSH 문제해결

Compute Engine 인스턴스가 SSH 연결을 거부하는 이유에는 여러 가지가 있습니다. SSH 연결 문제의 몇 가지 공통적인 원인이 아래에 나와 있습니다.

  • 인스턴스에 OS 로그인이 사용 설정되었습니다. 메타데이터 기반 SSH 키와 OS 로그인을 사용하여 인스턴스에 연결할 수 없습니다. OS 로그인은 승인된 키 파일에 SSH 키를 저장하지 않으므로 OS 로그인이 사용 설정되면 메타데이터 기반 SSH 키를 사용한 연결은 사용 중지됩니다.
  • OS 로그인이 사용 설정되지 않았습니다. OS 로그인이 사용 설정되지 않은 경우 Google은 메타데이터의 SSH 키를 기반으로 신규 사용자 계정의 승인된 키 파일을 관리합니다. 특정 조건에서 Compute Engine 인스턴스는 사용자 계정의 일부로 구성된 SSH 키를 사용하는 SSH 연결을 더 이상 허용하지 않습니다.
    • 모든 공개 이미지에는 SSH 비밀번호 로그인이 사용 중지되어 있습니다.
    • 계정 데몬은 게스트에 파일을 저장하여 Google에서 관리하는 사용자 계정의 상태를 보존합니다.
    • 메타데이터에서 사용자 계정의 모든 SSH 키를 삭제하면 Google 관리 사용자 계정의 승인된 키 파일이 삭제됩니다.
    • 계정 데몬은 Google에서 관리하지 않는 사용자 계정을 수정하지 않습니다.
  • 인스턴스에 전체 디스크가 있습니다. 디스크 공간을 확인하고 필요에 따라 정리합니다.
  • sshd 데몬이 올바르게 구성되지 않았습니다. 사용 중인 운영체제의 사용자 가이드를 검토하여 ssh_d가 올바르게 설정되었는지 확인합니다.

이 주제에서는 가장 일반적인 SSH 문제를 해결하는 방법을 설명합니다.

요구사항

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

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

연결 테스트

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

방화벽 규칙 확인

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

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

gcloud compute firewall-rules list

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

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

프로젝트의 default-allow-ssh 방화벽 규칙과 관련된 모든 데이터를 보려면 gcloud compute firewall-rules describe 명령어를 사용합니다.

gcloud compute firewall-rules describe default-allow-ssh --project

네트워크 연결 테스트

네트워크 연결이 작동하는지 확인하려면 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. 인스턴스의 네트워크 연결을 테스트합니다.

    external-ip를 인스턴스의 외부 IP로 대체해서 nmap 명령어를 실행하여 인스턴스에 대한 네트워크 연결을 테스트합니다.

    nmap external-ip
    

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

    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 요청으로 another-username을 지정하여 gcloud 도구를 사용하여 다른 사용자로 로그인을 시도하세요. gcloud 도구는 프로젝트의 메타데이터를 업데이트하여 신규 사용자를 추가하고 SSH 액세스를 허용합니다.

gcloud compute ssh another-username@$PROB_INSTANCE

직렬 콘솔의 문제 디버그

직렬 콘솔의 로그에서 연결 오류를 검토하는 것이 좋습니다. 브라우저를 사용하여 로컬 워크스테이션에서 직렬 콘솔에 액세스할 수 있습니다.

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

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

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

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

디스크를 검사하고 문제를 해결하려면 다음 안내를 따르세요.

  1. 디스크 스냅샷을 만들어 부팅 디스크를 백업합니다.
  2. 이 스냅샷에서 일반 영구 디스크를 만듭니다.
  3. 임시 인스턴스를 만듭니다.
  4. 일반 영구 디스크를 새로운 임시 인스턴스에 연결하고 마운트합니다.

이 절차에서는 SSH 연결만 허용하는 격리된 네트워크를 만듭니다. 이 설정은 복제된 인스턴스가 프로덕션 서비스에 방해가 되는 결과가 발생하지 않도록 합니다.

  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-names 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