SSH란?
SSH는 Secure Shell의 약자이다.
네트워크를 통해 다른 컴퓨터에 안전하게 접속해서 terminal 명령을 실행할 때 사용한다.
예를 들어 내 노트북에서 Ubuntu desktop이나 Ubuntu server에 접속하려면 다음처럼 사용할 수 있다.
ssh username@192.168.0.10
여기서 역할은 다음과 같다.
| 역할 | 의미 |
|---|---|
| SSH client | 접속을 시도하는 컴퓨터 |
| SSH server | 접속을 받아주는 컴퓨터 |
즉 내 노트북에서 서버에 접속한다면 노트북은 client이고, 접속 대상 Ubuntu 컴퓨터는 server이다.
전체 흐름
Ubuntu 기준으로 SSH 접속을 설정하는 흐름은 다음과 같다.
접속 대상 컴퓨터에 openssh-server 설치
SSH service 실행 확인
접속 대상 컴퓨터의 IP 주소 확인
client에서 ssh username@ip-address 실행
필요하면 SSH key 인증 설정
자주 접속하면 ~/.ssh/config 작성
같은 공유기나 같은 내부 네트워크에 있는 컴퓨터끼리 접속하는 경우가 가장 단순하다. 외부 인터넷에서 집이나 연구실 컴퓨터로 접속하려면 port forwarding, VPN, cloud 보안 그룹 같은 추가 설정이 필요하다.
SSH server 설치
접속을 받을 Ubuntu 컴퓨터에서 openssh-server를 설치한다.
sudo apt update
sudo apt install openssh-server
설치 후 SSH service 상태를 확인한다.
sudo systemctl status ssh
실행 중이면 다음과 비슷하게 보인다.
Active: active (running)
만약 실행 중이 아니라면 다음 명령어로 실행한다.
sudo systemctl start ssh
부팅할 때 자동으로 SSH server가 켜지게 하려면 enable한다.
sudo systemctl enable ssh
IP 주소 확인
접속 대상 Ubuntu 컴퓨터의 IP 주소를 확인한다.
ip addr
출력이 길다면 다음 명령어가 더 보기 편하다.
hostname -I
예를 들어 다음처럼 출력될 수 있다.
192.168.0.10
이 IP 주소를 client에서 사용한다.
ssh username@192.168.0.10
여기서 username은 접속 대상 Ubuntu 컴퓨터의 사용자 이름이다.
현재 Ubuntu 사용자 이름은 다음 명령어로 확인할 수 있다.
whoami
SSH 접속하기
client 컴퓨터에서 다음 명령어를 실행한다.
ssh username@192.168.0.10
처음 접속하면 다음과 비슷한 메시지가 나온다.
Are you sure you want to continue connecting (yes/no/[fingerprint])?
접속하려는 IP가 맞다면 yes를 입력한다.
그다음 접속 대상 Ubuntu 계정의 password를 입력하면 login된다.
접속에 성공하면 prompt가 접속 대상 컴퓨터 기준으로 바뀐다.
username@ubuntu-server:~$
접속을 종료하려면 다음 명령어를 입력한다.
exit
방화벽 확인
Ubuntu에서 ufw 방화벽을 사용 중이라면 SSH port를 허용해야 한다.
sudo ufw status
SSH를 허용한다.
sudo ufw allow ssh
또는 port 번호를 직접 허용할 수도 있다.
sudo ufw allow 22/tcp
방화벽을 활성화하지 않은 상태라면 다음 명령어가 필요할 수 있다.
sudo ufw enable
단, 원격 서버에서 작업 중이라면 방화벽을 켜기 전에 SSH 허용 규칙이 먼저 들어가 있는지 반드시 확인해야 한다. 그렇지 않으면 현재 접속이 끊긴 뒤 다시 접속하지 못할 수 있다.
SSH key 생성
password 대신 SSH key로 접속하면 더 편하고 안전하다.
client 컴퓨터에서 key를 생성한다.
ssh-keygen -t ed25519 -C "your_email@example.com"
기본 경로를 사용하면 다음 위치에 key가 생성된다.
~/.ssh/id_ed25519
~/.ssh/id_ed25519.pub
두 파일의 역할은 다르다.
| 파일 | 역할 |
|---|---|
id_ed25519 | private key, 절대 공유하면 안 됨 |
id_ed25519.pub | public key, server에 등록해도 됨 |
private key는 내 컴퓨터에만 있어야 한다. public key만 접속 대상 서버에 등록한다.
public key 등록
가장 간단한 방법은 ssh-copy-id를 사용하는 것이다.
ssh-copy-id username@192.168.0.10
이 명령어는 client의 public key를 server의 다음 파일에 추가한다.
~/.ssh/authorized_keys
이후 다시 접속한다.
ssh username@192.168.0.10
정상적으로 설정되었다면 password 없이 SSH key로 접속된다.
ssh-copy-id가 없을 때
ssh-copy-id를 사용할 수 없다면 public key를 직접 복사할 수 있다.
client에서 public key 내용을 확인한다.
cat ~/.ssh/id_ed25519.pub
출력된 한 줄을 server의 ~/.ssh/authorized_keys에 추가한다.
server에서 다음 명령어를 실행한다.
mkdir -p ~/.ssh
nano ~/.ssh/authorized_keys
public key를 붙여넣고 저장한다.
권한도 맞춰준다.
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
권한이 너무 열려 있으면 SSH가 key 파일을 무시할 수 있다.
SSH config 작성
매번 IP 주소와 사용자 이름을 입력하기 귀찮다면 client의 ~/.ssh/config를 작성한다.
nano ~/.ssh/config
예를 들어 다음처럼 작성한다.
Host myserver
HostName 192.168.0.10
User username
IdentityFile ~/.ssh/id_ed25519
이제 다음처럼 짧게 접속할 수 있다.
ssh myserver
여러 서버를 사용한다면 config에 여러 entry를 추가하면 된다.
Host lab-pc
HostName 192.168.0.20
User brace
IdentityFile ~/.ssh/id_ed25519
Host aws-server
HostName 13.125.10.20
User ubuntu
IdentityFile ~/.ssh/aws-key.pem
SSH port 변경
기본 SSH port는 22이다.
필요하다면 server에서 port를 변경할 수 있다.
설정 파일을 연다.
sudo nano /etc/ssh/sshd_config
다음 줄을 찾거나 추가한다.
Port 2222
설정을 확인한다.
sudo sshd -t
문제가 없다면 SSH service를 재시작한다.
sudo systemctl restart ssh
방화벽도 새 port를 허용해야 한다.
sudo ufw allow 2222/tcp
client에서는 -p option으로 port를 지정한다.
ssh -p 2222 username@192.168.0.10
~/.ssh/config에서는 다음처럼 쓴다.
Host myserver
HostName 192.168.0.10
User username
Port 2222
원격 서버에서 port를 바꿀 때는 기존 SSH session을 끊지 말고, 새 terminal에서 새 port 접속이 되는지 먼저 확인하는 것이 좋다.
외부 네트워크에서 접속하기
같은 공유기 안에서는 내부 IP로 접속할 수 있다.
ssh username@192.168.0.10
하지만 외부 네트워크에서 집이나 연구실 컴퓨터로 접속하려면 추가 설정이 필요하다.
대표적인 방법은 다음과 같다.
| 방법 | 설명 |
|---|---|
| port forwarding | 공유기에서 외부 port를 내부 컴퓨터의 SSH port로 전달 |
| VPN | 같은 내부 네트워크처럼 접속 |
| cloud server | public IP가 있는 서버에 직접 접속 |
| Tailscale 같은 mesh VPN | 복잡한 공유기 설정 없이 사설 네트워크 구성 |
공유기 port forwarding을 사용할 때는 보안에 주의해야 한다. 가능하면 password login을 끄고 SSH key 인증을 사용하는 것이 좋다.
password login 비활성화
SSH key 접속이 정상적으로 되는 것을 확인한 뒤 password login을 끌 수 있다.
server에서 설정 파일을 연다.
sudo nano /etc/ssh/sshd_config
다음 값을 설정한다.
PasswordAuthentication no
PubkeyAuthentication yes
설정을 확인한다.
sudo sshd -t
SSH service를 재시작한다.
sudo systemctl restart ssh
주의할 점은 SSH key 접속이 확실히 되는 상태에서만 password login을 꺼야 한다는 것이다. 잘못 설정하면 서버에 다시 접속하지 못할 수 있다.
자주 발생하는 문제
Connection refused
다음 error는 SSH server가 실행 중이 아니거나 port가 열려 있지 않을 때 발생한다.
ssh: connect to host 192.168.0.10 port 22: Connection refused
server에서 SSH service를 확인한다.
sudo systemctl status ssh
필요하면 실행한다.
sudo systemctl start ssh
Connection timed out
다음 error는 네트워크 연결이 되지 않을 때 자주 발생한다.
ssh: connect to host 192.168.0.10 port 22: Connection timed out
확인할 것은 다음과 같다.
IP 주소가 맞는가?
같은 네트워크에 있는가?
방화벽에서 SSH port를 허용했는가?
공유기 port forwarding이 필요한 상황인가?
Permission denied
다음 error는 사용자 이름, password, SSH key 중 하나가 맞지 않을 때 발생한다.
Permission denied (publickey,password).
먼저 사용자 이름을 확인한다.
whoami
그리고 client에서 verbose mode로 접속해본다.
ssh -v username@192.168.0.10
어떤 key를 시도하는지, 어떤 단계에서 실패하는지 확인할 수 있다.
WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED
접속 대상 컴퓨터를 재설치했거나 같은 IP에 다른 컴퓨터가 연결되면 다음 경고가 나올 수 있다.
WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!
접속 대상이 정말 내가 아는 컴퓨터가 맞는지 먼저 확인해야 한다. 확실하다면 client에서 기존 host key를 제거한다.
ssh-keygen -R 192.168.0.10
그다음 다시 접속한다.
ssh username@192.168.0.10
정리
Ubuntu에서 SSH 접속을 설정하려면 접속 대상 컴퓨터에 SSH server를 설치해야 한다.
핵심 명령어는 다음과 같다.
sudo apt install openssh-server
sudo systemctl status ssh
hostname -I
ssh username@ip-address
자주 접속한다면 SSH key와 config를 함께 설정하는 것이 좋다.
ssh-keygen -t ed25519
ssh-copy-id username@ip-address
nano ~/.ssh/config
외부 네트워크에서 접속할 때는 port forwarding보다 VPN이나 mesh VPN을 쓰는 방식이 더 관리하기 쉬운 경우가 많다. 어떤 방식이든 password login을 그대로 열어두는 것보다 SSH key 인증을 사용하는 편이 안전하다.