우분투(Ubuntu) Linux 서버를 구축하고 원격 관리나 업무를 위해 SSH(Secure Shell) 접속을 시도할 때 가장 자주 마주치는 대표적인 네트워크 오류 중 하나가 바로 ssh: connect to host <IP주소> port 22: Connection refused 메시지입니다.
이 에러는 단순히 네트워크가 연결되지 않는 것(Connection timed out)과 달리, 서버 장비까지 패킷은 도달했으나 서버의 OS 또는 서비스 레이어에서 접속 요청을 명시적으로 거부했음을 의미합니다.
본 가이드에서는 Ubuntu 환경에서 SSH Connection Refused 오류가 발생하는 4가지 주요 원인을 분석하고, 1,000자 이상의 단순 정보 나열이 아닌 실제 개발자와 서버 관리자가 적용할 수 있는 단계별 해결 명령어와 검증 방법을 정리해 드립니다.
1. SSH Connection Refused 오류가 발생하는 4가지 원인
이 오류가 발생하는 원인은 크게 4가지 범주로 나뉩니다.
- OpenSSH Server 패키지 미설치: Ubuntu OS 설치 시 기본 데스크톱이나 최소 설치(Minimal) 버전을 선택한 경우, SSH 서버 프로그램 자체가 설치되어 있지 않을 수 있습니다.
- SSH 데몬(sshd) 서비스 미실행: 서버에 패키지는 설치되어 있으나 서비스 프로세스가 중지(Inactive/Dead) 상태에 있는 경우입니다.
- SSH 수신 포트 번호 불일치: 서버의 SSH 기본 포트(22번)가 보안상의 이유로 다른 포트(예: 2022, 2222 등)로 변경되었으나, 클라이언트에서 기본 22번으로 접속을 시도하는 경우입니다.
- 방화벽(UFW 및 클라우드 보안 그룹) 차단: Linux 자체 방화벽(UFW) 또는 AWS/GCP/NCP 등의 클라우드 인바운드 보안 그룹에서 포트를 차단하고 있는 경우입니다.
2. 단계별 진단 및 문제 해결 방법
서버 콘솔(가상머신 관리창 또는 클라우드 웹 콘솔)에 직접 접근하여 아래의 4단계를 순서대로 실행하면서 원인을 파악하고 해결합니다.
[1단계] OpenSSH Server 패키지 설치 여부 확인
가장 먼저 서버 내부에 OpenSSH Server 패키지가 정상적으로 설치되어 있는지 검증합니다.
터미널에 아래 명령어를 입력하여 설치 목록을 확인합니다.
Bash
dpkg -l | grep openssh-server
만약 아무런 출력 결과가 나오지 않는다면 패키지가 설치되지 않은 상태입니다. 아래 명령어로 우분투 패키지 리스트를 업데이트하고 OpenSSH Server를 설치합니다.
Bash
sudo apt update
sudo apt install -y openssh-server
[2단계] SSH 서비스(sshd) 상태 확인 및 활성화
패키지가 설치되어 있더라도 서비스 데몬이 꺼져 있다면 접속이 거부됩니다. systemctl 명령어를 사용해 SSH 서비스의 현재 동작 상태를 확인합니다.
Bash
sudo systemctl status ssh
출력 결과에서 Active: active (running) 문구가 보이지 않고 inactive (dead) 상태라면 아래 명령어로 서비스를 시작하고, 시스템 부팅 시 자동으로 실행되도록 설정합니다.
Bash
# SSH 서비스 실행
sudo systemctl start ssh
# 부팅 시 자동 실행 등록
sudo systemctl enable ssh
설정 변경 후에는 서비스가 정상 구동되는지 다시 한 번 sudo systemctl status ssh로 확인합니다.
[3단계] SSH 수신 포트 및 Listen 상태 점검
SSH 데몬이 실제로 22번 포트(또는 설정된 커스텀 포트)에서 패킷을 대기(Listen)하고 있는지 네트워크 소켓 상태를 확인해야 합니다.
Bash
sudo ss -tlpn | grep sshd
만약 ss 명령어가 지원되지 않는 환경이라면 netstat 명령어를 활용합니다.
Bash
sudo netstat -tulpn | grep sshd
출력 결과에 LISTEN 0 128 *:22 와 같이 22번 포트가 오픈되어 있어야 합니다. 만약 포트 번호가 다르다면 SSH 설정 파일인 /etc/ssh/sshd_config를 확인해야 합니다.
Bash
# SSH 설정 파일 편집
sudo nano /etc/ssh/sshd_config
파일 내부에서 Port 22 주석이 해제되어 있는지 확인하고, 포트 번호를 변경한 경우 접속 클라이언트(PuTTY, MobaXterm, Terminal)에서도 동일한 포트 번호를 지정하여 접속해야 합니다. 설정 수정 후에는 반드시 서비스를 재시작합니다.
Bash
sudo systemctl restart ssh
[4단계] 방화벽(UFW 및 클라우드 보안 그룹) 포트 개방
서버 내부 서비스는 정상이지만 방화벽이 외부 접속을 막고 있는 경우가 많습니다.
1) Ubuntu UFW 방화벽 설정
Ubuntu의 기본 방화벽인 UFW 상태를 점검합니다.
Bash
# UFW 상태 확인
sudo ufw status
Status가 active 상태라면 22번 포트(TCP)에 대한 접근을 허용하는 규칙을 추가합니다.
Bash
# 22번 포트 허용
sudo ufw allow 22/tcp
# 방화벽 규칙 리로드
sudo ufw reload
2) 클라우드 인프라 보안 그룹(Security Group) 확인
AWS EC2, Google Cloud Platform(GCP), Naver Cloud Platform(NCP) 등의 인프라를 사용하는 경우, OS 내부 UFW와 별개로 클라우드 콘솔의 인바운드 규칙(Inbound Rules)을 점검해야 합니다.
- 프로토콜: TCP
- 포트 범위: 22 (또는 변경한 포트)
- 소스(Source): 접속할 내 IP 주소 (또는 전체 허용
0.0.0.0/0)
3. SSH 보안 강화를 위한 필수 권장 설정
오류를 해결하여 서버 접속에 성공했다면, 외부 무작위 대입 공격(Brute Force Attack)으로부터 서버를 보호하기 위해 다음 3가지 필수 보안 설정을 적용하는 것을 강력히 권장합니다.
- 기본 포트(22) 변경:
/etc/ssh/sshd_config파일에서Port항목을1024~65535사이의 미사용 포트로 변경합니다. - Root 계정 원격 접속 차단:
PermitRootLogin no로 변경하여 최고 관리자 계정으로의 직접 접속을 막고 일반 계정을 거치도록 합니다. - SSH 키 기반 인증 사용: 비밀번호 로그인(
PasswordAuthentication no) 방식을 비활성화하고 SSH Key Pair 방식을 도입합니다.
4. 요약 및 핵심 체크리스트
| 점검 순서 | 확인 항목 | 실행 명령어 |
| 1단계 | OpenSSH 패키지 설치 | sudo apt install openssh-server |
| 2단계 | SSH 서비스 활성화 | sudo systemctl start ssh |
| 3단계 | 포트 Listen 상태 점검 | sudo ss -tlpn | grep sshd |
| 4단계 | UFW 방화벽 허용 | sudo ufw allow 22/tcp |
위의 4단계 체크리스트를 순서대로 이행하면 Ubuntu SSH Connection Refused 오류의 99% 이상을 신속하게 원인 규명하고 해결할 수 있습니다.