- 1 1. Introduction
- 2 2. Basic SSH Configuration
- 3 결론
- 4 3. SSH 보안 강화
- 5 결론
- 6 4. 고급 SSH 구성
- 7 결론
- 8 5. SSH 문제 해결
- 9 결론
- 10 6. FAQ (자주 묻는 질문)
- 11 결론
1. Introduction
Ubuntu에서 SSH를 설정하는 것은 원격 서버를 관리하는 데 필수적입니다. SSH(Secure Shell)는 보안이 강화된 암호화 통신을 제공하는 프로토콜로, 사용자가 원격으로 서버에 접속하고 명령을 실행하며 파일을 전송할 수 있게 합니다.
이 문서는 Ubuntu에서 SSH를 설정하는 방법을 기본 설치 단계부터 고급 보안 조치까지 설명합니다.
1.1 Why Configure SSH on Ubuntu?
1.1.1 What Is SSH?
SSH(Secure Shell)는 네트워크를 통해 보안 통신을 가능하게 하는 프로토콜입니다. 원격 서버에 로그인하고, 파일을 전송하며, 터널링(포트 포워딩)을 수행할 때 일반적으로 사용됩니다. 기존의 Telnet이나 FTP와 달리 SSH는 모든 통신을 암호화하여 강력한 보안을 제공합니다.
1.1.2 When SSH Is Needed on Ubuntu
Ubuntu를 원격으로 관리할 때 SSH가 사용되는 일반적인 시나리오는 다음과 같습니다:
- 클라우드 서버 관리 : AWS, GCP, Vultr 등에서 운영되는 Linux 서버는 보통 SSH를 통해 접근합니다.
- LAN 환경에서의 원격 작업 : 내부 서버나 개발 머신에 원격으로 접근합니다.
- IoT 디바이스 관리 : Raspberry Pi와 같은 임베디드 시스템을 원격으로 제어합니다.
Ubuntu에서는 기본적으로 SSH 서버가 비활성화되어 있으므로, SSH 접근을 가능하게 하려면 수동으로 설치하고 설정해야 합니다.
2. Basic SSH Configuration
Ubuntu에서 SSH를 사용하려면 SSH 서버(OpenSSH)를 설치하고 올바르게 설정해야 합니다. 이 섹션에서는 SSH 설치, 기본 설정 조정, 방화벽 구성 및 서버 연결 방법을 설명합니다.
2.1 Installing and Starting OpenSSH
2.1.1 What Is OpenSSH?
OpenSSH(Open Secure Shell)는 SSH 프로토콜의 오픈 소스 구현체입니다. 원격 연결, 보안 파일 전송(SCP 및 SFTP), 포트 포워딩을 지원합니다.
2.1.2 Installing OpenSSH
Ubuntu에는 기본적으로 SSH 서버가 포함되어 있지 않으므로, 아래 명령을 사용해 설치합니다.
sudo apt update && sudo apt install -y openssh-server
이 명령은 패키지 목록을 업데이트하고 OpenSSH 서버를 설치합니다.
2.1.3 Starting SSH and Enabling Auto-Start
설치가 끝난 후 SSH 서버를 시작하고 자동 시작을 활성화합니다.
sudo systemctl enable --now ssh
enable 옵션은 OS 부팅 시 SSH가 자동으로 시작되도록 보장합니다.
2.1.4 Checking SSH Status
SSH가 실행 중인지 확인합니다.
systemctl status ssh
출력에 active (running) 이 표시되면 SSH가 정상적으로 동작하고 있는 것입니다:
● ssh.service - OpenBSD Secure Shell server
Loaded: loaded (/lib/systemd/system/ssh.service; enabled; vendor preset: enabled)
Active: active (running) since Fri 2025-02-28 12:00:00 UTC; 5min ago
만약 inactive (dead) 혹은 failed 로 표시되면 수동으로 SSH를 시작합니다:
sudo systemctl start ssh
2.2 Configuring the Firewall (UFW)
Ubuntu에는 ufw(Uncomplicated Firewall)라는 간단한 방화벽이 포함되어 있습니다. 여기서는 SSH 연결을 허용하도록 설정합니다.
2.2.1 Checking UFW Status
sudo ufw status
예시 출력 (inactive):
Status: inactive
예시 출력 (active):
Status: active
To Action From
-- ------ ----
22/tcp ALLOW Anywhere
2.2.2 Allowing SSH
sudo ufw allow ssh
또는 명시적으로:
sudo ufw allow 22/tcp
2.2.3 Enabling UFW
sudo ufw enable
2.2.4 Verifying UFW Rules
sudo ufw status verbose
예시:
Status: active
To Action From
-- ------ ----
22/tcp ALLOW Anywhere
22/tcp (v6) ALLOW Anywhere (v6)
2.3 Basic SSH Connection Methods
SSH가 실행 중이면 클라이언트 머신에서 연결합니다.
2.3.1 Connecting from Linux/macOS
ssh username@server-ip-address
예시:
ssh user@192.168.1.100
첫 연결 시 보안 경고가 표시될 수 있습니다:
The authenticity of host '192.168.1.100 (192.168.1.100)' can't be established.
ECDSA key fingerprint is SHA256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.
Are you sure you want to continue connecting (yes/no)?
Type yes to proceed.
2.3.2 Windows에서 연결하기
You can use PowerShell or PuTTY.
PowerShell 사용 (Windows 10+에 SSH 포함):
ssh username@server-ip-address
PuTTY 사용:
- 공식 사이트에서 PuTTY를 다운로드합니다.(the official site)
- PuTTY를 열고
Host Name (or IP address)에 서버 IP를 입력합니다. SSH를 연결 유형으로 선택합니다.- Open을 클릭하고 로그인합니다.
결론
This section covered the basics of setting up SSH on Ubuntu:
- OpenSSH 설치 및 시작 방법
- UFW로 SSH 연결 허용 방법
- Linux/macOS 및 Windows에서 연결하는 방법
3. SSH 보안 강화
SSH는 강력하지만 기본 설정 그대로 두면 보안 위험이 증가합니다. 공격자는 종종 무차별 로그인 시도나 포트 스캔을 수행합니다. SSH 보안을 강화하는 것이 필수적입니다.
3.1 루트 로그인 비활성화
루트 로그인은 시스템 전체 제어 권한을 제공하며 공격자의 주요 표적입니다. 이를 비활성화하면 보안이 향상됩니다.
3.1.1 단계
- SSH 설정 파일을 편집합니다:
sudo nano /etc/ssh/sshd_config
- 다음과 같이 해당 줄을 변경합니다:
PermitRootLogin no
- SSH를 재시작합니다:
sudo systemctl restart ssh
- 변경 사항을 확인합니다:
sudo grep PermitRootLogin /etc/ssh/sshd_config
If the output is PermitRootLogin no, the setting is applied.
3.2 비밀번호 인증 비활성화 및 키 인증 사용
공개 키 인증은 비밀번호보다 안전하며 무차별 공격 위험을 감소시킵니다.
3.2.1 SSH 키 생성
ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_rsa
This generates two files:
- id_rsa (개인 키) — 로컬에 보관하고 절대 공유하지 마세요
- id_rsa.pub (공개 키) — 서버에 업로드합니다
3.2.2 공개 키 업로드
ssh-copy-id username@server-ip-address
3.2.3 비밀번호 인증 비활성화
sudo nano /etc/ssh/sshd_config
Edit:
PasswordAuthentication no
Restart SSH:
sudo systemctl restart ssh
3.3 특정 사용자에게만 SSH 접근 허용
SSH 보안을 강화하기 위해 특정 사용자만 로그인하도록 접근을 제한할 수 있습니다.
3.3.1 설정 단계
/etc/ssh/sshd_configSSH 설정 파일을 엽니다:sudo nano /etc/ssh/sshd_config
- SSH 접근을 허용할 사용자를 추가합니다:
AllowUsers username1 username2
- 설정을 적용하려면 SSH를 재시작합니다:
sudo systemctl restart ssh
3.4 SSH 포트 변경
22 포트는 공격자에게 자주 노출되므로 기본 포트를 변경하면 보안을 향상시킬 수 있습니다.
3.4.1 설정 단계
- SSH 설정 파일을 엽니다:
sudo nano /etc/ssh/sshd_config
- 예를 들어 포트 설정을 변경합니다:
Port 2200
- SSH를 재시작합니다:
sudo systemctl restart ssh
3.4.2 방화벽 설정 업데이트
포트를 변경했다면 UFW를 업데이트합니다:
sudo ufw allow 2200/tcp
새 규칙을 확인합니다:
sudo ufw status
3.5 Fail2Ban으로 무차별 공격 방지
Fail2Ban은 로그인 실패 시도를 감지하고 지정된 시간 동안 공격 IP를 차단합니다.
3.5.1 Fail2Ban 설치
sudo apt install fail2ban -y
3.5.2 설정 파일 생성
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
파일을 엽니다:
sudo nano /etc/fail2ban/jail.local
설정을 수정합니다:
[sshd]
enabled = true
port = 2200
maxretry = 3
findtime = 600
bantime = 3600
3.5.3 Fail2Ban 재시작
sudo systemctl restart fail2ban
3.5.4 차단 목록 확인
sudo fail2ban-client status sshd
결론
This section explained methods for enhancing SSH security:
- 루트 로그인 비활성화
- 비밀번호 인증 비활성화 및 키 인증 활성화
- 특정 사용자에게 SSH 접근 제한
- SSH 포트 변경
- Fail2Ban을 사용해 무단 시도 차단
이러한 설정을 적용하면 안전한 SSH 환경을 구축할 수 있습니다.

4. 고급 SSH 구성
기본 SSH 구성 및 보안 강화가 완료되면, 유연성과 보안을 향상시키는 고급 기능으로 넘어갈 수 있습니다. 이 섹션에서는 ssh.socket 관리(Ubuntu 22.10+), SSH 터널, 다중 포트 리스닝 및 IP 기반 접근 제어에 대해 다룹니다.
4.1 Ubuntu 22.10+에서 ssh.socket 사용
Ubuntu 22.10+에서는 SSH가 ssh.service 대신 ssh.socket에 의해 관리될 수 있습니다. 이 소켓 기반 활성화는 필요할 때만 SSH를 시작하여 시스템 자원을 절약합니다.
4.1.1 ssh.socket 상태 확인
sudo systemctl status ssh.socket
예시 출력 (활성화됨):
● ssh.socket - OpenSSH Server Socket
Loaded: loaded (/lib/systemd/system/ssh.socket; enabled; vendor preset: enabled)
Active: active (listening) since Fri 2025-02-28 12:00:00 UTC
4.1.2 ssh.socket 활성화 또는 비활성화
소켓 활성화:
sudo systemctl enable --now ssh.socket
클래식 ssh.service 로 전환:
sudo systemctl disable --now ssh.socket
sudo systemctl enable --now ssh.service
4.2 SSH 터널링 (포트 포워딩)
SSH 터널링은 로컬과 원격 시스템 간에 안전한 통신 채널을 구축합니다.
4.2.1 로컬 포트 포워딩
원격 데이터베이스나 내부 서비스에 안전하게 연결할 때 유용합니다.
예시: 포트 3306에서 원격 MySQL 서버에 접근
ssh -L 3306:localhost:3306 username@server-ip-address
4.2.2 역방향 포트 포워딩
원격 서버를 통해 로컬 서비스를 노출합니다.
예시: 원격 포트 8080에 로컬 웹 서버 게시
ssh -R 8080:localhost:80 username@server-ip-address
4.2.3 동적 포트 포워딩 (SOCKS 프록시)
SSH를 SOCKS 프록시로 사용하여 익명 브라우징을 합니다.
ssh -D 1080 username@server-ip-address
4.3 다중 포트 리스닝
SSH는 다양한 네트워크 환경에 대한 유연성을 위해 하나 이상의 포트를 리스닝할 수 있습니다.
4.3.1 구성 단계
/etc/ssh/sshd_config파일을 편집합니다:sudo nano /etc/ssh/sshd_config
- 여러 개의
Port라인을 추가합니다:Port 22 Port 2200
- SSH를 재시작합니다:
sudo systemctl restart ssh
- UFW를 사용해 새 포트를 허용합니다:
sudo ufw allow 2200/tcp
4.4 특정 IP 주소에서만 SSH 허용
IP 주소별 SSH 접근 제한은 강력한 보안 제어를 제공합니다.
4.4.1 /etc/hosts.allow 구성
sudo nano /etc/hosts.allow
허용된 IP 주소를 추가합니다:
sshd: 192.168.1.100
4.4.2 /etc/hosts.deny 구성
sudo nano /etc/hosts.deny
그 외 모든 접근을 차단합니다:
sshd: ALL
결론
이 섹션에서는 고급 SSH 구성 주제를 다루었습니다:
- Ubuntu 22.10+에서
ssh.socket관리 - SSH 터널 사용 (포트 포워딩)
- 다중 SSH 포트 리스닝
- 특정 IP 주소에 대한 SSH 접근 제한
이러한 구성을 적용하면 보안과 사용성을 모두 향상시킬 수 있습니다.
5. SSH 문제 해결
구성이 올바르더라도 SSH 연결이 가끔 실패할 수 있습니다. 이 섹션에서는 일반적인 SSH 문제와 해결책을 설명합니다.
5.1 SSH 연결이 안 될 때
SSH가 Connection refused를 반환하거나 시간 초과가 발생하면, 서비스 문제, 포트 설정 오류, 방화벽 제한 등이 원인일 수 있습니다.
5.1.1 SSH 서비스가 실행 중이 아님
sudo systemctl status ssh
해결책:
inactive또는failed상태라면 SSH를 재시작합니다:sudo systemctl restart ssh
- 자동 시작을 활성화합니다:
sudo systemctl enable ssh
5.1.2 SSH 포트가 열려 있지 않음
ssh -p 2200 username@server-ip-address
열린 포트를 확인합니다:
sudo netstat -tulnp | grep ssh
또는:
ss -tulnp | grep ssh
5.1.3 방화벽 (UFW) 로 SSH 차단
sudo ufw status
SSH 허용:
sudo ufw allow 22/tcp
사용자 정의 포트를 사용하는 경우:
sudo ufw allow 2200/tcp
5.2 인증 오류
5.2.1 잘못된 사용자 이름 또는 비밀번호
ssh username@server-ip-address
5.2.2 공개 키가 올바르게 설치되지 않음
cat ~/.ssh/authorized_keys
id_rsa.pub와 일치하는지 확인하십시오.
5.2.3 .ssh 디렉터리 권한 오류
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
또한 다음을 확인하십시오:
chmod 755 /home/username
5.3 불안정한 SSH 연결 또는 예기치 않은 끊김
5.3.1 ClientAliveInterval 조정
ClientAliveInterval 60
ClientAliveCountMax 3
sudo systemctl restart ssh
5.3.2 로컬 클라이언트 설정 조정
Host *
ServerAliveInterval 60
ServerAliveCountMax 3
5.4 SSH 로그 보기
5.4.1 실시간 로그 보기
sudo journalctl -u ssh -f
5.4.2 과거 로그 보기
sudo cat /var/log/auth.log | grep ssh
sudo grep "Failed password" /var/log/auth.log
결론
이 섹션에서는 일반적인 SSH 문제와 해결 방법을 설명했습니다:
- SSH 서비스가 실행 중인지 확인
- 열린 포트를 확인
- 방화벽 설정을 확인
- 올바른 키 인증을 보장
- 시간 초과 및 끊김 문제 해결
- SSH 로그 분석
대부분의 SSH 문제는 잘못된 구성이나 네트워크 제약에서 비롯됩니다. 이러한 문제 해결 단계를 사용하여 효율적으로 문제를 해결하십시오.
6. FAQ (자주 묻는 질문)
이 섹션에서는 SSH 사용 및 구성과 관련된 일반적인 질문에 답변합니다.
6.1 SSH 시간 초과 문제를 어떻게 해결하나요?
6.1.1 서버 측 설정
ClientAliveInterval 60
ClientAliveCountMax 3
sudo systemctl restart ssh
6.1.2 클라이언트 측 설정
Host *
ServerAliveInterval 60
ServerAliveCountMax 3
6.2 SSH 비밀번호를 잊어버렸을 때 어떻게 해야 하나요?
6.2.1 물리적 접근이 가능한 경우
- 단일 사용자 모드로 부팅 (GRUB에서
recovery mode선택) - 비밀번호 재설정:
passwd username
- 시스템 재부팅
6.2.2 물리적 접근이 불가능한 경우 (클라우드 VPS)
- 호스팅 서비스에서 제공하는 VPS 콘솔 사용
- 공개 키 인증 사용
6.3 Windows에서 SSH를 어떻게 사용하나요?
6.3.1 PowerShell 사용
ssh username@server-ip-address
6.3.2 PuTTY 사용
- PuTTY 다운로드 및 설치
Host Name에 서버 IP 주소 입력- 연결 유형을
SSH로 선택 - 사용자 이름과 비밀번호로 로그인
6.4 Ubuntu WSL에서 SSH를 어떻게 구성하나요?
6.4.1 SSH 서버 설치
sudo apt update && sudo apt install openssh-server
6.4.2 SSH 설정 수정
PasswordAuthentication yes
SSH를 수동으로 시작 (WSL은 systemd를 사용하지 않음):
sudo service ssh start
6.5 추가 보안 모범 사례
6.5.1 Fail2Ban 사용
sudo apt install fail2ban -y
[sshd]
enabled = true
port = 22
maxretry = 3
findtime = 600
bantime = 3600
sudo systemctl restart fail2ban
6.5.2 SSH 포트 변경
Port 2200
sudo ufw allow 2200/tcp
6.6 실시간으로 SSH 로그를 모니터링하려면?
sudo journalctl -u ssh -f
sudo cat /var/log/auth.log | grep ssh
6.7 SSH를 더 편리하게 사용하는 팁
6.7.1 간단한 로그인용 .ssh/config 사용
Host myserver
HostName 192.168.1.100
User user
Port 2200
IdentityFile ~/.ssh/id_rsa
그런 다음 다음으로 연결:
ssh myserver
6.7.2 ssh-agent 사용
eval $(ssh-agent -s)
ssh-add ~/.ssh/id_rsa
결론
이 섹션에서는 SSH와 관련된 자주 묻는 질문을 요약했습니다.
- SSH 타임아웃 문제 해결 방법
- 잊어버린 비밀번호 복구 방법
- Windows 및 WSL에서 SSH 사용 방법
- 보안 모범 사례
- SSH 로그 확인 방법
.ssh/config를 사용해 SSH를 더 편리하게 만드는 팁
이러한 기술을 적용하면 안전하고 효율적인 SSH 환경을 구축하고 원격 서버를 원활하게 관리할 수 있습니다.



