LainyZine: 프로그래머 가이드 🐣

[Windows 10] OpenSSH 서버 실행하고 SSH로 접속하는 방법

Linux 서버는 원격에서 SSH 프로토콜로 사용하는 게 일반적입니다. Windows 10은 주로 데스크탑으로 사용하지만, OpenSSH 서버를 실행해서 원격에서 커맨드라인으로 접속할 수 있습니다. 윈도에서 명령 프롬프트를 주로 사용할 때는 커맨드라인에서 할 수 있는 일이 매우 제한적이었습니다만, 현재는 PowerShell은 물론 WSL도 사용할 수 있기 때문에 활용 범위가 넓어졌습니다.

이 글에서는 Windows 10을 기준으로 OpenSSH 서버를 활성화하는 방법에 대해서 알아봅니다. 또한 SSH 비밀키로 로그인할 수 있도록 설정하는 방법과 기본 셸을 변경하는 방법도 소개합니다.

Windows 10에서 OpenSSH 서버 활성화하는 방법

Windows 10에서 OpenSSH 서버를 활성화하려면 다음 명령어를 실행해야합니다. 관리자 모드로 PowerShell을 실행하거나 Windows Terminal에서 PowerShell 탭을 열어 다음 명령어를 실행합니다.

$ Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0
Add-WindowsCapability 명령어를 실행중인 화면

몇 분 정도 시간이 걸립니다. OpenSSH 기능을 활성화하는 것은 이 명령어 하나면 됩니다. 간단하네요. 🥳

Path          :
Online        : True
RestartNeeded : False

명령어가 완료되면 위와 같이 출력됩니다. 하지만 아직 할 일이 몇가지 더 남아있습니다.

이제 다음 명령어로 sshd 서비스를 실행해줍니다.

$ Start-Service sshd

부팅 시점에 자동으로 서비스를 실행하고자 한다면 Set-Service로 sshd를 등록해줍니다.

$ Set-Service -Name sshd -StartupType 'Automatic'

다음으로 방화벽 설정을 확인해봅니다. 이 정책은 Windows 머신 자체에서 TCP 22번 포트(SSH 기본 포트)로 외부 접속을 허용하는 규칙을 담고 있습니다.

$ Get-NetFirewallRule -Name OpenSSH-Server-In-TCP
Name                  : OpenSSH-Server-In-TCP
DisplayName           : OpenSSH SSH Server (sshd)
Description           : Inbound rule for OpenSSH SSH Server (sshd)
DisplayGroup          : OpenSSH Server
Group                 : OpenSSH Server
Enabled               : True
Profile               : Any
Platform              : {}
Direction             : Inbound
Action                : Allow
EdgeTraversalPolicy   : Block
LooseSourceMapping    : False
LocalOnlyMapping      : False
Owner                 :
PrimaryStatus         : OK
Status                : 저장소에서 규칙을 구문 분석했습니다. (65536)
EnforcementStatus     : NotApplicable
PolicyStoreSource     : PersistentStore
PolicyStoreSourceType : Local

Enabled 속성이 ture이면 정상입니다. OpenSSH-Server-In-TCP 이름으로 검색이 되지 않는다면 *ssh*로 변경해서 실행해봅니다. 만약 위와 같은 결과가 나오지 않는다면 New-NetFirewallRule 명령어로 직접 방화벽 규칙을 생성할 수 있습니다.

$ New-NetFirewallRule -Name sshd -DisplayName 'OpenSSH-Server-In-TCP' -Enabled True -Direction Inbound -Protocol TCP -Action Allow -LocalPort 22

localhost로 OpenSSH 서버 접속 테스트

OpenSSH 서버가 정상 동작하고 있는지 간단히 확인해보도록 하겠습니다. 앞서 OpenSSH를 설치한 같은 컴퓨터에서, PowerShell로 이어서 진행합니다. 먼저 ssh 클라이언트가 있는지 확인해봅니다.

$ ssh
usage: ssh [-46AaCfGgKkMNnqsTtVvXxYy] ...

ssh를 인자 없이 실행했을 때 usage가 나오면 SSH 클라이언트를 사용할 수 있습니다. 명령어가 없다고 실패하는 경우 다음 명령어를 입력해서 SSH Client도 활성화해줍니다.

Add-WindowsCapability -Online -Name OpenSSH.Client~~~~0.0.1.0

활성화 후에 다시 ssh 명령어가 있는지 확인해봅니다.

다음으로 현재 사용자를 확인하기 위해 whoami를 실행합니다. 여기서 \ 문자 뒤의 이름이 SSH 접속에 사용되는 사용자 이름입니다.

$ whoami
desktop-dk189n6\lainy

이 예제에서 SSH 접속에 사용하는 사용자 이름은 lainy가 됩니다.

다음 명령어로 현재 서버의 SSH에 접속해보겠습니다. 그 전에 SSH로 접속이 잘 되었는지 확인하기 위해 dir env:*ssh* 이 명령어를 로컬에서 실행해봅니다.

$ dir env:*ssh*

아무것도 뜨지 않으면 정상입니다.

SSH로 다른 서버에 접속할 때는 다음과 같이 ssh 명령어를 사용합니다.

$ ssh [USERNAME]@[HOST] [COMMAND]

[USERNAME]는 앞서 확인한 현재 시스템의 사용자로 치환합니다. [HOST]는 현재 시스템에 접속하려고 하므로 localhost로 치환합니다. localhost는 네트워크에서 현재 컴퓨터를 의미하는 특별한 단어입니다. 원격에서 실행할 명령어를 [COMMAND]를 지정할 수 있습니다만, 생략하면 SSH 서버에 셋업된 셸이 실행됩니다. 여기서는 dir env:*ssh*를 실행하겠습니다.

그럼 실제로 ssh를 실행해보겠습니다.

$ ssh lainy@localhost dir env:*ssh*
lainy@localhost 's password:

패스워드를 물어봅니다. 이 때 패스워드는 현재 로그인한 계정의 패스워드입니다. Microsoft 계정과 연동되어있다면, 해당 계정의 패스워드를 입력해줍니다.

$ ssh lainy@localhost  dir env:*ssh*
lainy@localhost's password:
Name                           Value
----                           -----
SSH_CONNECTION                 ::1 52088 ::1 22
SSH_CLIENT                     ::1 52088 22

로컬에서 그냥 실행했을 때는 아무것도 나오지 않았는데, SSH로 연결돼있는 상태에서는 SSH_CONNECTIONSSH_CLIENT 정보가 출력되는 것을 확인할 수 있습니다. 이걸로 현재 컴퓨터에서 SSH 서버가 잘 활성화되어있는 것을 확인할수 있습니다.

윈도우 컴퓨터에 접속하기 위한 IP 확인하는 방법

홈 네트워크에서 SSH 서버에 접속하고자 하는 경우 네트워크 장비나 SSH 서버가 설치된 컴퓨터에서 ipconfig로 IP를 확인해볼 수 있습니다.

보통 여러가지가 출력되기 때문에 상황에 따라 확인이 필요합니다만 ‘이더넷 어댑터 Ethernet’ 항목을 확인해봅니다. 여기서 192.168로 시작하는 IPv4 주소를 기록해둡니다. (일반적으로 홈 네트워크에서는 192.168로 시작하는 주소를 사용하지만, 환경마다 다르기 필요하다면 공유기 설정이나 네트워크 관리자의 확인이 필요합니다.)

$ ipconfig
...
이더넷 어댑터 Ethernet:

   연결별 DNS 접미사. . . . : localdomain
   IPv4 주소 . . . . . . . . . : 192.168.1.48
   서브넷 마스크 . . . . . . . : 255.255.255.0
   기본 게이트웨이 . . . . . . : 192.168.1.1
...

홈 네트워크 상의 다른 컴퓨터에서 해당 IP 주소로 SSH 접속을 해봅니다.

$ ssh lainy@192.168.1.48 dir env:*ssh*
lainy@localhost's password:
Name                           Value
----                           -----
SSH_CONNECTION                 192.x.x.x 53154 192.x.x.x 22
SSH_CLIENT                     192.x.x.x 53154 22

위와 같이 출력되면 접속에 성공한 것입니다. 😎 접속이 안 될 경우 방화벽이나 네트워크 설정 등 너무 다양한 원인이 있을 수 있습니다. 네트워크 장비 쪽에서 OpenSSH 서버와 클라이언트 서버가 정상 연결되어있는지, 방화벽은 적절하게 열려있는지 등 확인이 필요합니다.

(네트워크 이슈를 다루는 것은 이 글의 범위를 넘어서는 주제라서 적절한 키워드로 검색해보는 것을 추천드립니다. 기회가 된다면 다른 글에서 네트워크 트러블 슈팅 방법에 대해서 소개해보겠습니다. 🥲)

또한 여기서는 홈 네트워크에서 접속을 하는 경우를 가정했습니다만, 홈 네트워크 바깥의 인터넷 망에서 윈도우 OpenSSH 서버에 접속하고 싶다면 추가 설정이 필요합니다. 홈 네트워크 상에 VPN 서버를 구축하거나, 네트워크 장비의 포트 포워딩 기능을 윈도우 서버를 외부망에 노출시켜야합니다. 이는 보안적으로 매우 위험하며 정확히 어떤 잠재적 위험이 있는지 이해하지 못 한다면 설정하지 않는 것을 권장합니다.

팁: 기본 셸을 파워셸로 변경하는 방법

OpenSSH 서버를 처음 설치하고 접속하면 cmd로 접속이 됩니다. SSH 접속 시 실행되는 기본 셸을 변경할 수 있습니다. 예를 들어 파워셸을 사용하고 싶다면 아래 명령어를 실행해줍니다.

$ New-ItemProperty -Path "HKLM:\SOFTWARE\OpenSSH" -Name DefaultShell -Value "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" -PropertyType String -Force

이제 ssh로 접속해보면 파워셸이 실행되는 것을 확인할 수 있습니다.

$ ssh lainy@localhost
Windows PowerShell
Copyright (C) Microsoft Corporation. All rights reserved.

새로운 크로스 플랫폼 PowerShell 사용 https://aka.ms/pscore6

PS C:\Users\lainy>

WSL2가 설치되어있는 경우 bash 셸을 기본 셸로 사용하고 싶다면 아래 명령어를 실행해줍니다.

$ New-ItemProperty -Path "HKLM:\SOFTWARE\OpenSSH" -Name DefaultShell -Value "C:\Windows\System32\bash.exe" -PropertyType String -Force

팁: SSH 키로 로그인을 활성화하는 방법

SSH를 사용할 때마다 매번 비밀번호를 입력하는 것은 번거롭습니다. SSH를 사용할 때는 비밀번호보다도 SSH 키 인증 방식을 주로 사용합니다. 먼저 C:\ProgramData\ssh\sshd_config 파일의 내용을 수정해야합니다. 이 파일을 에디터에서 직접 열거나, Invoke-Item 명령어로 에디터를 실행해줍니다.

$ Invoke-Item C:\ProgramData\ssh\sshd_config

아래 두 옵션이 활성화되어있는지 확인합니다. 해당 줄의 첫 글자가 #로 시작한다면 코멘트되어있는 것이므로 삭제해줍니다. 혹시 관련 옵션이 없다면 맨 아래에 추가해줍니다.

PubkeyAuthentication    yes
AuthorizedKeysFile      .ssh/authorized_keys

설정 파일을 저장하고 아래 명령어를 실행해 sshd 서버를 재실행해줍니다.

restart-service -name sshd -force

이제 $HOME/.ssh/authorized_keys 파일에 공개 키를 등록하면, SSH에 접속할 때 해당 공개 키에 대응하는 개인 키로 로그인할 수 있습니다.

팁: SSH 서버 포트를 변경하는 방법

OpenSSH 서버는 기본적으로 22번 포트를 사용합니다. 다른 포트를 사용하고 싶다면 sshd_config 파일에 Port 설정을 변경하고 sshd 서비스를 재실행해야합니다. 자세한 포트 변경 방법은 다음 글에서 다룹니다.

팁: 윈도우 자동 업데이트로 인한 재시작을 방지하는 방법

Windows 10에는 자동 업데이트 기능이 기본적으로 활성화되어있습니다. 윈도우 자동 업데이트는 업데이트 및 필요에 따라서 시스템을 자동으로 재시작합니다. OpenSSH 등 서버로 윈도우 머신을 활용하는 경우 연결이 끊겨버리는 등의 문제가 발생합니다.

윈도우 자동 업데이트는 ‘업데이트 확인’ 설정에서 최대 35일까지 일시 중지할 수 있습니다. 영구적으로 중지하려는 경우 추가적인 설정이 필요합니다. 이에 대해서는 다음 글에서 자세히 소개합니다.

추천 문서

LainyZine은 쿠팡 파트너스 활동에 따른 수수료를 제공받습니다.