WSL(Windows Subsystem for Linux)에서 SSH 서버(sshd)를 띄우는 방법을 정리한다. 예전에 이 주제로 떠돌던 안내 상당수는 WSL1 시절 것이라, WSL2 기준으로 보면 손볼 대목이 있다. 특히 UsePrivilegeSeparation no를 sshd_config에 넣으라는 지시는 오늘날 아무 효과가 없다 — 이유는 아래에 있다.

sshd_config에서 손볼 것

먼저 openssh-server를 설치한다.

sudo apt-get install openssh-server

그다음 /etc/ssh/sshd_config를 열어 필요한 항목을 수정한다.

sudo nano /etc/ssh/sshd_config
  • PermitRootLogin no — root 계정으로 직접 로그인하는 경로를 막는다. 필요하면 일반 계정으로 접속한 뒤 sudo를 쓰는 편이 안전하다.
  • AllowUsers 사용자명 — 접속 가능한 계정을 명시적으로 제한한다. 지정하지 않으면 시스템의 모든 계정이 SSH 로그인 대상이 된다.
  • PasswordAuthentication no — 키 기반 인증을 이미 설정했다면 비밀번호 로그인 자체를 꺼서 무차별 대입 공격 표면을 없앤다. 아직 키를 등록하지 않았다면 yes로 둔 채 접속을 먼저 확인하고, 그다음 키 인증으로 넘어가는 순서를 권한다.

설정을 바꾼 뒤에는 서비스를 재시작한다.

sudo service ssh restart

UsePrivilegeSeparation은 이제 쓰지 않는다

옛 WSL SSH 안내에는 십중팔구 UsePrivilegeSeparation no를 sshd_config에 추가하라는 줄이 남아 있다. 이 옵션은 OpenSSH 7.5(2017-03-20)에서 폐기(deprecated)됐다. 릴리스 노트는 이 옵션을 없애 권한 분리를 강제하도록 만들었다고 밝힌다 — sshd는 이제 항상 UsePrivilegeSeparation sandbox가 켜진 것처럼 동작하고, sshd_config에 이 지시어가 남아 있어도 무시된다(경고만 뜬다). 즉 이 줄을 넣고 안 넣고는 동작에 아무 차이가 없다. 오래된 글을 참고하고 있다면 이 줄은 그냥 지워도 된다.

WSL2에서 달라진 것

WSL2는 자체 IP를 가진 경량 VM으로 동작해서 WSL1과 네트워킹 그림이 다르다.

  • 기본(NAT) 모드 — Windows에서 WSL2 안의 sshd로 접속할 때는 localhost가 그대로 통한다(.wslconfiglocalhostForwarding이 기본값 true). 반대로 같은 LAN의 다른 기기에서 WSL2로 직접 붙으려면 포트 포워딩이 필요하다. WSL2가 자체 가상 이더넷 어댑터를 갖고 있어서, LAN 쪽에서 보면 WSL1처럼 호스트와 같은 주소로 보이지 않기 때문이다.

  • 미러링(mirrored) 모드 — Windows 11 22H2 이상에서 .wslconfignetworkingMode=mirrored를 설정하면 네트워킹 아키텍처가 통째로 바뀐다. 이 모드에서는 Windows와 WSL2가 서로 localhost(127.0.0.1)로 통신할 수 있고, LAN에서 WSL2로 직접 접속하는 것도 가능해진다.

  • systemd — Ubuntu는 기본적으로 systemd를 쓰는 배포판이라 WSL도 최신 버전에서는 이를 지원한다. /etc/wsl.conf에 아래처럼 적고 wsl.exe --shutdown 후 다시 켜면 systemd가 올라온다.

    [boot]
    systemd=true
    

    systemd가 켜져 있으면 sshd를 systemctl enable --now ssh로 등록해 WSL을 켤 때마다 자동으로 띄울 수 있다. 켜져 있지 않다면 매번 service ssh restart처럼 수동으로 올려야 한다.

참고