WSL2에서 SFTP 서버를 구성하는 방법을 단계별로 안내합니다. 선행 조건으로 WSL2 포트포워딩 가이드 완료를 권장합니다.

빠른 시작 - 5분 안에 SFTP 서버 구성하기

# WSL2 Ubuntu에서 실행

# 1. SSH 서버 설치
sudo apt update && sudo apt install -y openssh-server

# 2. SSH 서비스 시작
sudo service ssh start

# 3. 자동 시작 설정 (wsl.conf)
sudo tee -a /etc/wsl.conf << 'EOF'
[boot]
systemd=true
EOF

# 4. WSL 재시작 (Windows PowerShell에서)
# wsl --shutdown

# 5. WSL 재시작 후 systemd로 자동 시작 활성화
sudo systemctl enable ssh
# Windows에서 연결 테스트
sftp -P 4022 사용자명@localhost

기존 포트포워딩(4022->22)이 설정되어 있다면 추가 네트워크 설정 불필요


목차

Part 내용 대상
Part 1 SFTP란? SSH와의 관계 처음 접하는 분
Part 2 OpenSSH 설치 및 구성 바로 적용하고 싶은 분
Part 3 Windows 재시작 시 자동 시작 재부팅 후에도 사용하고 싶은 분
Part 4 보안 강화 (chroot, 전용 사용자) 보안이 중요한 분
Part 5 문제 해결 문제가 생겼을 때
Part 6 명령어 모음 빠른 참조

Part 1. SFTP란?

1.1 SFTP vs FTP vs SCP 비교

항목 SFTP FTP SCP
보안 SSH 암호화 평문 전송 SSH 암호화
포트 22 (SSH와 동일) 21 + 데이터 포트 22
방화벽 단일 포트 복잡 (패시브/액티브) 단일 포트
기능 디렉토리 탐색, 이어받기 풀 기능 복사만
권장 권장 비권장 단순 복사용

1.2 SFTP는 SSH의 서브시스템

SFTP는 독립된 프로토콜이 아니라 SSH의 서브시스템으로 동작합니다:

  • SSH 서버(sshd)가 실행 중이면 SFTP도 사용 가능
  • 별도의 FTP 서버 설치 불필요
  • SSH와 동일한 인증 방식 사용 (비밀번호, SSH 키)

1.3 기존 포트포워딩과의 관계

이미 SSH 포트포워딩이 설정되어 있다면:

  • 외부 PC -> Windows 4022 -> WSL2 22 (SSH/SFTP)
  • 접속 주소: sftp://user@192.168.0.xxx:4022

wsl2-ports.conf4022,22,ssh 설정이 있다면 추가 포트포워딩 불필요


Part 2. OpenSSH 설치 및 구성

2.1 사전 확인

# WSL2 배포판 확인
cat /etc/os-release | grep PRETTY_NAME
# 출력 예: PRETTY_NAME="Ubuntu 24.04 LTS"

# SSH 서버 설치 여부 확인
which sshd
# 설치됨: /usr/sbin/sshd
# 미설치: 출력 없음

2.2 OpenSSH 서버 설치

# 패키지 업데이트 및 설치
sudo apt update
sudo apt install -y openssh-server

2.3 SSH 서비스 시작

# 서비스 시작
sudo service ssh start

# 상태 확인
sudo service ssh status
# 출력: * sshd is running

2.4 SFTP 서브시스템 확인

기본적으로 Ubuntu의 OpenSSH는 SFTP가 활성화되어 있습니다:

# SFTP 설정 확인
grep -i "^Subsystem.*sftp" /etc/ssh/sshd_config
# 출력: Subsystem sftp /usr/lib/openssh/sftp-server

2.5 주요 sshd_config 설정

설정 기본값 설명
Port 22 SSH 포트 (변경 비권장)
PermitRootLogin prohibit-password root 로그인 정책
PasswordAuthentication yes 비밀번호 인증 허용
PubkeyAuthentication yes SSH 키 인증 허용
Subsystem sftp /usr/lib/openssh/sftp-server SFTP 서브시스템

2.6 연결 테스트

명령줄에서 테스트

# WSL2 내부에서 로컬 테스트
sftp localhost
# 비밀번호 입력 후 sftp> 프롬프트 표시되면 성공

# Windows에서 테스트 (포트포워딩 설정된 경우)
sftp -P 4022 사용자명@localhost

FileZilla/WinSCP 설정

항목
프로토콜 SFTP
호스트 localhost (또는 Windows IP)
포트 4022 (포트포워딩 설정 기준)
사용자 WSL2 사용자명
비밀번호 WSL2 사용자 비밀번호

Part 3. 자동 시작 설정

Windows 재시작 또는 WSL 종료 후에도 SSH 서비스가 자동으로 시작되도록 설정합니다.

3.1 방법 비교

방법 장점 단점 권장
systemd 활성화 표준 Linux 방식, 안정적 WSL 0.67.6+ 필요 권장
wsl.conf [boot] command 간단한 설정 단일 명령어만 가능 보통
Windows Task Scheduler WSL 버전 무관 Windows 설정 필요 보통

3.2 방법 1: systemd 활성화 (권장)

WSL2 버전 0.67.6 이상에서는 systemd를 활성화할 수 있습니다.

WSL 버전 확인

# Windows PowerShell에서
wsl --version
# 출력 예: WSL 버전: 2.0.9.0

systemd 활성화

# /etc/wsl.conf 편집
sudo nano /etc/wsl.conf

다음 내용 추가:

[boot]
systemd=true

WSL 재시작

# Windows PowerShell에서 (관리자 권한 불필요)
wsl --shutdown

WSL 터미널을 다시 열면 systemd가 활성화됩니다.

systemd 활성화 확인

# PID 1 프로세스 확인
ps --no-headers -o comm 1
# 출력: systemd (활성화됨)
# 출력: init (비활성화)

SSH 자동 시작 설정

# SSH 서비스 자동 시작 활성화
sudo systemctl enable ssh

# 상태 확인
sudo systemctl status ssh

이제 Windows 재시작 후에도 WSL을 시작하면 SSH가 자동으로 실행됩니다.

3.3 방법 2: wsl.conf [boot] command

systemd를 사용하지 않는 경우의 대안:

sudo nano /etc/wsl.conf
[boot]
command = service ssh start

command는 단일 명령어만 지원합니다. 여러 서비스가 필요하면 스크립트 파일을 만들어 실행하세요.

3.4 방법 3: Windows Task Scheduler

WSL 버전이 낮거나 wsl.conf가 동작하지 않는 경우:

작업 스케줄러 설정

  1. Win + R -> taskschd.msc 실행
  2. 작업 만들기 클릭

일반 탭

  • 이름: WSL SSH Start
  • 보안 옵션: “사용자가 로그온할 때만 실행”

트리거 탭

  • 새로 만들기 -> 로그온할 때

동작 탭

  • 새로 만들기
  • 프로그램/스크립트: wsl
  • 인수 추가: -d Ubuntu-24.04 -u root service ssh start

PowerShell로 작업 생성

# 관리자 PowerShell에서 실행
$action = New-ScheduledTaskAction -Execute "wsl" `
    -Argument "-d Ubuntu-24.04 -u root service ssh start"
$trigger = New-ScheduledTaskTrigger -AtLogOn
$settings = New-ScheduledTaskSettingsSet -AllowStartIfOnBatteries

Register-ScheduledTask -TaskName "WSL SSH Start" `
    -Action $action -Trigger $trigger -Settings $settings

Part 4. 보안 강화 (선택)

일반적인 개발 용도로는 기본 설정으로 충분합니다. 외부 접속이 필요하거나 보안이 중요한 경우 추가 설정을 고려합니다.

4.1 SFTP 전용 사용자 생성

SSH 쉘 접근 없이 SFTP만 허용하는 사용자:

# 사용자 생성 (쉘 없음)
sudo adduser sftpuser --shell /usr/sbin/nologin

# SFTP 전용 그룹 생성
sudo groupadd sftponly

# 사용자를 그룹에 추가
sudo usermod -aG sftponly sftpuser

4.2 Chroot Jail 설정

사용자를 특정 디렉토리에 격리:

sudo nano /etc/ssh/sshd_config

파일 끝에 추가:

# SFTP 전용 사용자 설정
Match Group sftponly
    ChrootDirectory /home/%u
    ForceCommand internal-sftp
    AllowTcpForwarding no
    X11Forwarding no

디렉토리 권한 설정 (중요)

Chroot 디렉토리는 root 소유여야 합니다:

# 홈 디렉토리 소유권 변경
sudo chown root:root /home/sftpuser
sudo chmod 755 /home/sftpuser

# 쓰기 가능한 하위 디렉토리 생성
sudo mkdir /home/sftpuser/uploads
sudo chown sftpuser:sftpuser /home/sftpuser/uploads

Chroot 디렉토리 권한이 잘못되면 “broken pipe” 또는 연결 실패 발생

4.3 SSH 키 인증 설정

비밀번호 대신 SSH 키 사용:

Windows에서 키 생성

# Windows PowerShell에서
ssh-keygen -t ed25519 -C "sftp-key"
# 기본 경로: C:\Users\사용자\.ssh\id_ed25519

공개키를 WSL2로 복사

# Windows에서 (포트포워딩 설정 기준)
type $env:USERPROFILE\.ssh\id_ed25519.pub | ssh -p 4022 사용자명@localhost "cat >> ~/.ssh/authorized_keys"

Part 5. 문제 해결

Q1. SSH 서비스가 시작되지 않음

증상

System has not been booted with systemd as init system (PID 1).

원인

systemd가 활성화되지 않은 상태에서 systemctl 명령 사용

해결

# 방법 1: service 명령 사용
sudo service ssh start

# 방법 2: systemd 활성화 (Part 3.2 참조)

Q2. SFTP 연결 거부

체크리스트

확인 항목 명령어 정상 출력
SSH 서비스 상태 sudo service ssh status sshd is running
포트 리스닝 `ss -tlnp grep 22`
포트포워딩 wsl2-port-status.ps1 (Windows) 4022 -> 172.x.x.x:22
방화벽 wsl2-firewall-status.ps1 (Windows) 4022 허용됨

Q3. Permission denied

원인 1: 비밀번호 오류

# WSL2에서 비밀번호 재설정
sudo passwd 사용자명

원인 2: Chroot 디렉토리 권한 문제

# 디렉토리 소유권 확인
ls -la /home/sftpuser
# 출력: drwxr-xr-x root root /home/sftpuser (올바름)
# 출력: drwxr-xr-x sftpuser sftpuser (잘못됨)

# 수정
sudo chown root:root /home/sftpuser

원인 3: SSH 키 권한 문제

# 권한 확인 및 수정
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
chmod 600 ~/.ssh/id_*

Q4. 연결이 갑자기 끊김

원인

  • WSL2 IP 변경 (재부팅 시)
  • WSL이 유휴 상태로 종료됨

해결

# Windows에서 WSL 상태 확인
wsl --list --running

# 포트포워딩 재설정
.\wsl2-port-forward.ps1

Q5. “broken pipe” 에러

원인

Chroot 설정의 디렉토리 권한 문제

해결

# Chroot 디렉토리가 root 소유인지 확인
ls -la /home/ | grep sftpuser

# root:root로 변경
sudo chown root:root /home/sftpuser
sudo chmod 755 /home/sftpuser

Part 6. 레퍼런스

SSH 서비스 관리

# service 명령 (systemd 비활성화 시)
sudo service ssh start
sudo service ssh stop
sudo service ssh restart
sudo service ssh status

# systemctl 명령 (systemd 활성화 시)
sudo systemctl start ssh
sudo systemctl stop ssh
sudo systemctl restart ssh
sudo systemctl status ssh
sudo systemctl enable ssh    # 자동 시작 활성화
sudo systemctl disable ssh   # 자동 시작 비활성화

SFTP 클라이언트 명령어

# 접속
sftp -P 4022 user@host

# 기본 명령어
sftp> pwd              # 원격 현재 디렉토리
sftp> lpwd             # 로컬 현재 디렉토리
sftp> ls               # 원격 파일 목록
sftp> lls              # 로컬 파일 목록
sftp> cd dir           # 원격 디렉토리 이동
sftp> lcd dir          # 로컬 디렉토리 이동
sftp> get file         # 다운로드
sftp> put file         # 업로드
sftp> get -r dir       # 디렉토리 다운로드
sftp> put -r dir       # 디렉토리 업로드
sftp> mkdir dir        # 디렉토리 생성
sftp> rm file          # 파일 삭제
sftp> rmdir dir        # 디렉토리 삭제
sftp> exit             # 종료

설정 파일 경로

파일 용도
/etc/ssh/sshd_config SSH 서버 설정
/etc/wsl.conf WSL 설정 (자동 시작)
~/.ssh/authorized_keys SSH 공개키
~/.ssh/config SSH 클라이언트 설정
/var/log/auth.log 인증 로그

이 문서는 WSL2 포트포워딩 시스템의 일부로 작성되었습니다.