
openssh-server
Linux에서 원격 접속과 파일 전송을 가능하게 하는 표준 SSH 서버 소프트웨어
sshd 데몬을 통해 다음을 지원함:
- 외부 클라이언트의 로그인,
- 원격 명령 실행,
- scp,
- sftp 연결
이 패키지를 설치하면 하나의 서버로 다음이 가능해짐:
- 보안 shell (ssh, Secure SHell),
- 파일 전송 (sftp, Secure FTP),
- 개발 도구(VS Code Remote, Git, 자동화 스크립트) 지원
Ubuntu 시스템을 최신 버전으로 업그레이드.
$ sudo apt update
$ sudo apt upgrade
$ sudo apt autoremove
openssh-server 를 설치 및 상태 확인
opoenssh-server가 있는지 확인
$ sudo systemctl status ssh
결과가 다음과 같을 경우 설치되지 않은 상태임:

다음으로도 설치 유무는 확인 가능함:
$ sudo apt list --installed openssh-server
현재 설치가 되지 않은 상태이니 설치를 수행.
$ sudo apt install openssh-server
이후 apt를 통해 설치를 확인하면 다음과 같은 출력을 확인 가능함:

설치 후에는 systemctl 을 통해 ssh 서버의 상태 확인이 가능함.
sudo systemctl status ssh
결과는 다음과 같음:

- 위 스샷에서 첫번째 줄은 ssh의 상태 확인을 위한 명령어 를 보여줌.
- 세번째 줄은 현재 ssh.service (ssh데몬)이 시스템 시작시 사용가능하지 않도록 되어 있음을 의미함
(preset은 Ubuntu에서 권장하는 상태) - 네번째 줄에서 Active: inactive (dead) 가 현재 ssh 서버가 동작하지 않음을 의미.
현재 ssh서버가 inactive이지만 시작을 특별히 시키지 않아도 ssh.socket에 의해 trigger가 가능(시작이 가능)한 상태임.
이는 systemctl이 관리하는 22번 포트로 ssh접속 요청이 들어오면 자동으로 ssh서버가 활성화되어 ssh연결이 가능함을 의미.
다음과 같이 22번 포트가 listen상태임을 확인 가능함:

ssh 클라이언트로 접속이 이루어지면, 22번 포트를 systemctl 이 아닌 sshd (=ssh서버 데몬) 프로세스가 사용한다.

Ubuntu 를 재시작할 경우,
ssh.service는 inactive이나
ssh.socket에 연결이 들어오면 active가 되므로
ssh 접속이 되는 상태라고 생각하면 됨.
openssh-server 가 설치된 장비가 domain name을 가지지 않은 경우가 대부분이니,
ip address 로 접속해본다.
우선 현재 ssh서버 장비의 ip address를 다음의 명령어로 확인한다.
$ ip addr

- 1번은 자기자신에 연결하는 loopback 이고, 2번의 eth0부분이 현 장비의 이더넷 인터페이스 정보를 보여준다.
- inet 172.20.81.142/20 이 부분에서 현 장비의 ip address가 172.20.81.142 임을 확인할 수 있음.
ssh서버에 접속해 보기
다른 장비에서 해당 서버로 접속하면 최초 접속이므로 다음과 같이 메시지가 뜬다.

yes 를 입력하고 엔터를 치면, 현재 계정 me 로 ssh서버에 접속을 시도하고 암호를 물어본다.

ssh서버가 동작하는 장비에서 me에 대한 암호를 넣어주면 연결이 됨.

- 접속된 화면에서 큰 문제가 없으나, 아래에 locale을 en_US.UTF-8로 못 바꿔준다는 에러가 있음.
- 이는 en_US.UTF-8 로케일이 생성이 안되어 있기 때문임
- WSL의 Ubuntu는 C.UTF-8 이 기본이고 en_US.UTF-8이 생성이 안된 상태임.
놔두어도 이 실습에선 큰 문제 없으나 다음으로 간단히 해결하면 됨.
# locales 설치
$ sudo apt install locales
# en_US.UTF-8 로케일 생성
$ sudo locale-gen en_US.UTF-8
위의 처리를 해두면 이후 ssh접속시 해당 warning이 사라진다.

Windows11에도 ssh client는 설치되어 있으며 다음과 같이 접속이 가능함.

보다 자세한 ssh 사용법은 다음을 참고할 것
2025.08.05 - [utils] - ssh (Secure SHell) 사용 방법
ssh (Secure SHell) 사용 방법
SSH 는 Secure SHell의 약자로 암호화된 보안 연결을 통해 원격 서버에 안전하게 접속하고 명령을 실행할 수 있게 해주는 네트워크 프로토콜을 가리킴. (이를 사용하는 클라이언트 및 앱을 가리키기
ds31x.tistory.com
최소한의 ssh 서버 설정 변경
서비스 포트 변경
보안을 위해 기본 SSH 서비스 포트인 22번을 그대로 사용하는 것은 권장되지 않음.
- 대부분의 무차별 대입 공격(bot, 스캐너, 크롤러)은 22번 포트를 기본 대상으로 삼기 때문임.
- 포트를 변경하는 것만으로도 불필요한 공격 트래픽을 크게 줄일 수 있음.
SSH 서버는 일반적으로 /etc/ssh/sshd_config 파일에서 설정을 함:
vi /etc/ssh/sshd_config
# nano /etc/ssh/sshd_config
Port 를 찾아서 2222와 같은 임의의 포트로 변경할 것.

- 처음에는 주석 처리 되어 있으므로 주석을 해제하고 포트 값을 변경할 것.
- 변경후 systemctl 에서 처리가 필요함.
- systemd 관련 설정을 바꾼 건 아니라서, systemctl restart ssh 만 해주면 되지만,
- 주석대로 해주는게 편하다.
$ sudo systemctl daemon-reload
$ sudo systemctl restart ssh.socket
$ sudo systemctl restart ssh.service
이후엔 다음과 같이 변경된 포트를 명시적으로 지정해서 접속해야 한다.

Root Login 차단
그리고 ssh를 통한 root 로그인은 기본으로 막아야 한다.
역시 /etc/ssh/sshd_config 파일에서 설정을 함:
PermitRootLogin 으로 시작하는 줄을 찾아서 다음과 같이 변경.
#PermitRootLogin prohibit-password # 이 주석을 풀면 key를 통한 root 로그인은 허용
PermitRootLogin no # root 로그인 원천 봉쇄.

Public Key기반 인증 (개인 테스트 장비에선 생략해도 됨)
서비스 되는 장비에선 패스워드 로그인은 매우 위험하므로 절대 해서는 안된다.
때문에 key 기반 인증이 권장된다. 패스워드 로그인 자체를 막고 key 인증만 허용하는 것이 좋다.
key생성등은 다음을 참고
역시 /etc/ssh/sshd_config 파일에서 설정을 함:
PubkeyAuthentication 과 PassowrdAuthentication 으로 시작하는 줄들을 찾아 다음과 같이 설정.
PubkeyAuthentication yes
PasswordAuthentication no

이후 접속을 허용할 유저의 공개키를 서버의 ~/.ssh/authorized_keys 에 한줄로 붙여넣는다.
해당 파일이 없으면 만들고, 해당파일의 권한을 다음과 같이 변경한다.
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
방화벽 설정 (초보자는 생략해도 됨)
일반적으로 외부에서 접근할 수 있게 하려면 방화벽에서 ssh서비스 포트를 열어줘야 한다.
여기서 방화벽까지 다 설명하기는 어렵기 때문에 Ubuntu 기준으로 간단히 2222번 포트를 열고 닫는 명령어 소개만 한다.
추가적으로 WSL의 경우엔 연습용으로 사용되는 경우가 많고, 외부에 포트를 공개하지는 않으므로 이를 확인해보는 것만 설명한다.
Ubuntu에서 방화벽 열기
가장 많이 사용되는 것이 ufw 임 (없으면 sudo apt install ufw 로 설치 가능)
ufw(Uncomplicated Firewall)는
Ubuntu·Debian 계열 Linux에서
iptables/nftables를 쉽게 관리하도록 만든 방화벽 관리 도구로,
몇 개의 명령만으로 포트 허용·차단 정책을 설정할 수 있게 해주는 유틸리티임
설치 후 기본 설정은 incoming, outgoint는 alllow 상태로 모든 접속이 허용되는 상태임 (단, routed는 disabled)
설치 후 방화벽을 활성화시키고 비활성화시키는 명령어는 다음과 같음:
$ sudo ufw enable # 켜기
$ sudo ufw disable # 끄기
systemctl을 통한 데몬으로 제어도 가능함:
$ sudo systemctl status ufw.service # 상태 확인
$ sudo systemctl is-enabled ufw.service # 부팅시 자동시작 여부 확인
$ sudo systemctl enable ufw.service # 부팅시 자동시작 켜기
$ sudo systemctl disable ufw.service # 부팅시 자동시작 끄기
$ sudo systemctl stop ufw.service # 즉시 시작
$ sudo systemctl start ufw.service # 즉시 중지
ssh서버로 동작시킬 때, 흔히 incoming은 deny 상태로 만들고 서비스 포트(이 문서에선 2222)만 허용하는 형태를 취함.
다음의 명령어로 이를 설정함:
$ sudo ufw default deny incoming
$ sudo ufw allow 2222/tcp
확인은 다음을 통해 가능함:
$ sudo ufw status verbose

허용한 룰(2222/tcp 로 들어오는 것을 허용한 것)을 제거하려면,
다음으로 현재 룰들에 번호를 매기고
$ sudo ufw status numbered

이후 하나씩 지운다 (주의할 점은 한번에 하나의 룰만 지울 수 있고, 지우고 나면 번호가 다시 매겨지니 다시 확인하고 지워야 함)

WSL의 경우:
WSL 로 Ubuntu를 설치하면 기본적으로 방화벽이 없으며, Host OS인 Windows에서 실제적인 방화벽을 제어하는게 일반적임.
기본적으로 WSL의 distro가 설치된 VM 들은 Windows의 방화벽에 의해 외부에서 접속할 수 없음.
Windows PowerShell을 관리자 권한으로 실행하고 현재 2222번 포트에 대한 상태를 보면 다음과 같음
❯ netstat -ano | findstr 2222
TCP 127.0.0.1:2222 0.0.0.0:0 LISTENING 44128
TCP 172.20.80.1:57252 172.20.81.142:2222 ESTABLISHED 39072
TCP [::1]:2222 [::]:0 LISTENING 44128
- a : all, 모든 소켓을 표시하라는 옵션으로 listen중 포트, 연결된 세션, 로컬 및 원격 주소 모두 포함하여 출력.
- n : numeric, 해석하지 말고 숫자로 표시하라는 애기임 (localhost 는 127.0.01로, http는 80 으로 표시됨)
- 이걸 사용하지 않으면 처리에 시간이 너무 오래 걸림. 반드시 사용할 것.
- o : owing process, 해당 포트를 점유하고 있는 프로세스의 PID를 표시
해석은 다음과 같음
TCP 127.0.0.1:2222 0.0.0.0:0 LISTENING 44128
- TCP = TCP 프로토콜을 사용 (ssh는 TCP기반임)
- 127.0.0.1:2222 = localhost의 2222번 포트 로서 이 컴퓨터 안에서만 2222 포트가 사용가능함을 의미.
- 만일 이 컬럼이 0.0.0.0:2222 였다면 모든 컴퓨터에서 2222포트로 접속 가능함을 의미함.
- 0.0.0.0:0 = 상대방 주소로 0.0.0.0:0 은 아직 아무도 연결하지 않음을 의미
- LISTENING = 연결을 기다리는 중임.
- 44128 = 해당 포트를 연 프로세스 ID
현재 44128의 프로세스가 뭔지는 다음으로 확인 가능함:

TCP 172.20.80.1:57252 172.20.81.142:2222 ESTABLISHED 39072
- TCP = TCP 프로토콜을 사용 (ssh는 TCP기반임)
- 172.20.80.1:57252 = Windows 쪽 WSL 게이트웨이 IP로 windows가 WSL 의 VM에 접속시 사용하는 내부 주소임.
- 172.20.81.142:2222 = 상대방 주소로 WSL의 ssh서버가 동작하는 VM의 IP 의 2222번 포트 가 상대방임을 의미.
- ESTABLISHED = 연결이 이루어져서 SSH세션이 현재 열려있다는 뜻임.
- 39072= 현재 ssh서버에 붙은 Windows 프로세스의 PID임.
현재 39072 프로세스는 ssh.exe임

마지막 줄은 결과 첫번째 줄의 IPv6 버전임:
- 127.0.0.1 = 자기 PC
- [::1] = IPv6 localhost
같이 보면 좋은 자료들
2026.01.05 - [개발환경] - 아웃바운드 터널을 이용한 SSH 접속: Colab과 cloudflared 사례
아웃바운드 터널을 이용한 SSH 접속: Colab과 cloudflared 사례
inboudn and outboundinbound 연결외부에서 내부로 들어오는 네트워크 연결예: 외부 PC가 대상 장비의 22번 포트(SSH)로 접속Outbound 연결내부에서 외부로 나가는 네트워크 연결예: 대상 장비가 외부 웹사이
ds31x.tistory.com
2025.07.21 - [utils/git and github] - SSH Agent 사용법
SSH Agent 사용법
SSH Agent는 사용자 로그인 session(세션) 동안 ssh 키에 대한 암호를 유지하여 사용자가 한번만 암호를 입력하게 해줌.macOS SSH Agent 특징macOS는 SSH Agent가 기본적으로 launchd를 통해 자동 실행 됨Keychain과
ds31x.tistory.com
OpenSSH
OpenSSH 10.2 released October 10, 2025 OpenSSH is the premier connectivity tool for remote login with the SSH protocol. It encrypts all traffic to eliminate eavesdropping, connection hijacking, and other attacks. In addition, OpenSSH provides a large suite
www.openssh.org
'Linux' 카테고리의 다른 글
| sftp - Secure FTP (0) | 2026.01.10 |
|---|---|
| nvim에서 다른 app과 clipboard 같이 쓰기 (Linux의 xclip이용). (0) | 2026.01.09 |
| Linux 커널 관점에서 이해하는 Session, Process Group, Process, Thread와 Job Control의 실제 동작 (0) | 2026.01.09 |
| [zsh] zsh-vi-mode 설치 및 사용법 (0) | 2026.01.06 |
| WSL 배포판(distro) 백업 및 복원하기: export, import (1) | 2026.01.05 |