Skip to main content

SSH 포트 변경 후 접속 불가 복구

본 문서는 Linux 인스턴스에서 SSH 포트 변경 후 발생할 수 있는 접속 불가 문제를 복구하는 방법을 안내합니다.


SSH 포트 변경 후 접속 불가

SELinux가 적용된 Rocky Linux, CentOS, Alma Linux 환경에서 SSH 포트를 변경하면, 새로 지정한 포트와 기본 포트(22번) 모두 접속 불가 상태가 될 수 있습니다.

오류 메시지 예시
ssh: connect to host 172.16.3.232 port xx: Connection refused

이는 SSH 데몬이 정상적으로 실행 중임에도 불구하고, 변경한 포트로의 접속이 차단되거나 리스닝하지 않는 경우 발생합니다.

특히, SELinux 정책에 따라 새로운 포트에 대한 허용 설정이 되어 있지 않은 경우에 문제가 발생할 수 있으며, 사용자 스크립트를 통해 다시 22번 포트로 원복하거나 해당 포트를 SELinux에 등록해주는 방식으로 해결할 수 있습니다.

▶️ 해결 방법

info

이 가이드는 OpenAPI를 기반으로 설명하며, 동일한 작업은 카카오클라우드 콘솔에서도 수행할 수 있습니다. OpenAPI 사용을 위해서는 먼저 OpenAPI 시작하기 문서의 사전 준비 절차를 완료하세요.

SSH 포트 변경으로 접속 불가 문제가 발생했을 경우, OpenAPI 기반으로 다음 절차를 수행합니다.

Step 1. 기존 인스턴스 정보 확인

Get instance OpenAPI를 사용하여 인스턴스 ID, 루트 볼륨 ID, 인스턴스 유형, 보안 그룹, 키페어 등을 확인합니다.

Request
Get instance Request Syntax
curl -X GET 'https://bcs.kr-central-2.kakaocloud.com/api/v1/instances/${INSTANCE_ID}' \
-H 'Accept: application/json' \
-H 'X-Auth-Token: ${API_TOKEN}'
변수설명
INSTANCE_ID🖌기존 인스턴스 ID
API_TOKEN🖌API 인증 토큰
Response로 가져올 정보
정보Response Body 항목
인스턴스 ID instance.id
루트 볼륨 IDinstance_attached_volume.is_root=true인 볼륨의 instance.attached_volumes.id 값 확인
루트 볼륨 크기instance_attached_volume.is_root=true인 볼륨의 instance.attached_volumes.size 값 확인
인스턴스 유형 IDinstance.flavor.id
보안그룹 이름instance.security_groups.name
키페어 이름instance.key_name
가용 영역instance.availability_zone

Step 2. 인스턴스 이미지 생성

Create image OpenAPI를 사용하여 문제가 발생한 인스턴스의 루트 볼륨으로부터 이미지를 생성합니다.

이미지 생성 시 주의 사항

실행 중인 인스턴스에서 이미지를 생성하면, 메모리에 저장된 데이터가 볼륨에 완전히 기록되지 않아 일부 데이터의 일관성이 손상될 수 있습니다.
따라서 이미지 생성 전 인스턴스를 정지하는 것을 권장합니다.

Request
Create image Request Syntax
curl -X POST 'https://volume.kr-central-2.kakaocloud.com/api/v1/volumes/${ROOT_VOLUME_ID}/image' \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-H 'X-Auth-Token: ${API_TOKEN}' \
-d '{
"image": {
"name": "${IMAGE_NAME}",
"description": "${IMAGE_DESC}"
}
}'
변수설명
ROOT_VOLUME_ID🖌1번에서 조회된 루트 볼륨 ID
API_TOKEN🖌API 인증 토큰
IMAGE_NAME🖌이미지 이름
IMAGE_DESC🖌이미지 설명
Response로 가져올 정보
정보Response Body 항목
이미지 IDimage.id

Step 3. 포트 설정 사용자 스크립트 작성

이미지를 기반으로 신규 인스턴스를 생성할 때, 사용자 스크립트(user_data) 를 포함해 SSH 포트 문제를 해결합니다. 사용자 스크립트는 인스턴스 최초 부팅 시 실행되며, Base64 형식으로 입력해야 합니다. (최대 16KB)

두 가지 방법 중 하나를 선택해 적용할 수 있습니다.

방법 1: SSH 포트 설정 초기화
  1. 아래 스크립트 파일(restore-port-conf.sh)을 로컬 환경에 작성하여 저장합니다.

    restore-port-conf.sh
    #!/bin/bash

    CONFIG_FILE="/etc/ssh/sshd_config"
    BACKUP_FILE="/etc/ssh/sshd_config.bak"

    # 백업 생성
    sudo cp "$CONFIG_FILE" "$BACKUP_FILE"

    # 모든 Port 설정 라인을 주석 처리 (주석이 없는 것만 대상)
    sudo sed -i '/^[[:space:]]*Port[[:space:]]\+[0-9]\{1,5\}[[:space:]]*$/s/^/#/' "$CONFIG_FILE"

    echo "모든 Port 설정 항목이 주석 처리되었습니다. 백업: $BACKUP_FILE"
  2. 작성한 파일을 Base64 형식으로 인코딩하여 출력되는 값을 메모합니다.

    base64 < restore-port-conf.sh | tr -d '\n'

    # IyEvYmluL2Jhc2gKCkNPTkZJR19GSUxFP... 로 출력되는 값 메모 필요
방법 2: SELinux에 새 포트 등록
  1. 아래 스크립트 파일(register-port-conf.sh)을 로컬 환경에 작성하여 저장합니다.

    register-port-conf.sh
    #!/bin/bash

    # 사용할 SSH 포트 번호 (ex. 2222)
    NEW_PORT=2222

    # 1. SELinux에 SSH 포트 추가
    echo "[1/2] SELinux 포트 등록 중..."
    sudo semanage port -a -t ssh_port_t -p tcp "$NEW_PORT" 2>/dev/null \
    || echo "※ 이미 등록된 포트일 수 있습니다. 무시하고 계속 진행합니다."

    # 2. SSH 서비스 재시작
    echo "[2/2] sshd 서비스 재시작 중..."
    sudo systemctl restart sshd

    echo "✅ SSH 포트 $NEW_PORT 등록 및 sshd 재시작 완료"

  2. 작성한 파일을 Base64 형식으로 인코딩하여 출력되는 값을 메모합니다.

    base64 < register-port-conf.sh | tr -d '\n'

    # IyEvYmluL2Jhc2gKCkNPTkZJR19GSUxFP... 로 출력되는 값 메모 필요

Step 4. 이미지 기반 신규 인스턴스 생성

생성한 이미지와 사용자 스크립트를 이용해 신규 인스턴스를 생성합니다. 인스턴스 생성은 Create instance OpenAPI를 사용합니다.

Request
Create instance Request Syntax
curl -X POST 'https://bcs.kr-central-2.kakaocloud.com/api/v1/instances' \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-H 'X-Auth-Token: ${API_TOKEN}' \
-d '{
"instance": {
"name": "${INSTANCE_ID}",
"description": "${INSTANCE_DESC}",
"count": 1,
"image_id": "${IMAGE_ID}",
"flavor_id": "${FLAVOR_ID}",
"availability_zone": "${AZ}",
"subnets": [
{
"id": "${SUBNET_ID}"
}
],
"volumes": [
{
"is_delete_on_termination": true,
"size": ${VOLUME_SIZE},
"source_type": "image",
"uuid": "${IMAGE_ID}",
"type_id": "${VOLUME_TYPE_ID}"
}
],
"key_name": "${KEY_NAME}",
"security_groups": [
{
"name": "${SG_NAME}"
}
],
"user_data": "${BASE_64}"
}
}'
변수설명
API_TOKEN🖌API 인증 토큰
INSTANCE_ID🖌신규 인스턴스 이름
INSTANCE_DESC🖌인스턴스 설명
IMAGE_ID🖌2번에서 생성한 이미지 ID
FLAVOR_ID🖌인스턴스 유형 ID
AZ🖌인스턴스를 생성할 가용영역
SUBNET_ID🖌서브넷 ID
VOLUME_SIZE🖌볼륨 사이즈, 기존 인스턴스의 루트 볼륨 사이즈와 동일하게 설정
VOLUME_TYPE_ID🖌볼륨 타입 ID
KEY_NAME🖌키페어 이름
SG_NAME🖌보안그룹 이름
BASE_64🖌작성한 스크립트의 BASE 64 형식 값
참고

Step 5. 신규 인스턴스의 SSH 접속 확인

신규 인스턴스 부팅 완료 후, SSH 접속을 시도해 정상 여부를 확인합니다.

SSH 접속 확인
# 기본 22번 포트 접속 (복구 후 정상 동작해야 하는 방식)
ssh -i ${pem-key-file} ${username}@${server-ip}

# 사용자 정의 포트 접속 (임시 확인용)
ssh -i ${pem-key-file} ${username}@${server-ip} -p ${port-number}