linux

외부 접속을 위한 WSL2 SSH

jhinux 2025. 11. 17. 11:41

📄 외부 접속을 위한 WSL2 SSH 포트 포워딩 자동화 매뉴얼

1. 개요

이 매뉴얼은 윈도우 재부팅 시 WSL2의 내부 IP 주소가 변경되어도, 윈도우 호스트(PC)로 들어오는 SSH(2218 포트) 요청을 WSL2로 자동 연결(포트 포워딩)하는 방법을 설명합니다.

  • 문제점: WSL2는 재부팅 시 내부 IP가 유동적으로 변경됩니다.
  • 해결책: PowerShell 스크립트와 윈도우 작업 스케줄러를 사용하여, 윈도우 로그인 시 다음 작업을 자동화합니다.
    1. WSL2 내의 SSH 서버를 실행 (systemctl 사용)
    2. WSL2의 변경된 IP 주소를 감지
    3. netsh 포트 포워딩 규칙을 새 IP로 자동 업데이트

2. 사전 준비 사항

  1. WSL2 설치: systemd를 지원하는 배포판 (예: Ubuntu 22.04 이상)
  2. WSL2 내 SSH 서버 설치:
    # WSL2 터미널에서 실행
    sudo apt update
    sudo apt install openssh-server
  3. 윈도우 관리자 권한: netsh작업 스케줄러 설정에 필요합니다.

3. 단계별 설정 방법

1단계: WSL2 SSH 서버 설정 (최초 1회)

WSL2가 2218번 포트로 SSH 연결을 수신하도록 설정합니다.

  1. WSL2 터미널에서 sshd_config 파일을 엽니다.

    sudo nano /etc/ssh/sshd_config
  2. 아래 내용을 찾아 수정하거나 추가합니다.

    # 기본 22번 포트를 2218로 변경
    Port 2218
    
    # (주석 해제) 모든 IP에서 수신 허용
    ListenAddress 0.0.0.0
    
    # (선택) 비밀번호 로그인 허용
    PasswordAuthentication yes
  3. 설정 저장 후 SSH 서버를 테스트합니다.

    # systemd로 SSH 서비스 활성화 (부팅 시 자동 시작 - WSL 내부 기준)
    sudo systemctl enable ssh
    
    # 테스트 시작
    sudo systemctl start ssh
    
    # 2218 포트가 열렸는지 확인
    ss -tlpn | grep 2218

    (결과에 0.0.0.0:2218 또는 *:2218이 표시되어야 합니다.)

2단계: 윈도우 방화벽 인바운드 규칙 추가 (최초 1회)

외부에서 윈도우 PC의 2218번 포트에 접근할 수 있도록 윈도우 방화벽을 엽니다.

  1. PowerShell'관리자 권한'으로 실행합니다.

  2. 아래 명령어를 입력하여 방화벽 규칙을 추가합니다.

    New-NetFirewallRule -DisplayName "WSL2 SSH (Port 2218)" -Direction Inbound -Protocol TCP -LocalPort 2218 -Action Allow

    (이 작업은 한 번만 수행하면 IP가 바뀌어도 유지됩니다.)

3단계: 자동화 스크립트 작성 (PowerShell)

윈도우 로그인 시 실행될 PowerShell 스크립트를 만듭니다.

  1. 메모장을 열어 아래 코드를 복사하여 붙여넣습니다.

    # --- 스크립트 시작 ---
    
    # 1. WSL2 내부의 SSH 서버를 시작합니다. (systemctl 사용)
    Write-Host "Starting WSL2 SSH server via systemctl..."
    wsl -u root -- systemctl start ssh
    
    # 2. WSL2의 현재 내부 IP 주소를 가져옵니다.
    Write-Host "Getting current WSL2 IP address..."
    $wsl_ip = (wsl hostname -I).Split(' ')[0].Trim()
    
    # 3. 포트 및 주소 변수 설정 (포트를 변경했다면 여기를 수정)
    $listen_port = 2218
    $listen_address = "0.0.0.0"
    
    # 4. IP 주소를 성공적으로 가져왔는지 확인
    if ($wsl_ip) {
        Write-Host "Found WSL2 IP: $wsl_ip"
        Write-Host "Configuring port forwarding..."
    
        # 5. (중요) 이전에 설정된 규칙을 삭제합니다.
        netsh interface portproxy delete v4tov4 listenaddress=$listen_address listenport=$listen_port | Out-Null
    
        # 6. 새 IP로 포트 포워딩 규칙을 추가합니다.
        netsh interface portproxy add v4tov4 listenaddress=$listen_address listenport=$listen_port connectaddress=$wsl_ip connectport=$listen_port
    
        Write-Host "Port forwarding complete: $listen_address`:$listen_port -> $wsl_ip`:$listen_port"
    } else {
        Write-Host "Error: Could not find WSL2 IP address. Port forwarding not set."
    }
    
    # --- 스크립트 끝 ---
  2. 이 파일을 .ps1 확장자로 저장합니다. (예: C:\Scripts\wsl_ssh_forward.ps1)

    팁: 저장 시 '파일 형식'을 '모든 파일'로 변경하고 파일 이름에 .ps1을 붙여야 합니다.

4단계: 윈도우 작업 스케줄러 등록

윈도우 로그인 시 위 스크립트가 '관리자 권한'으로 자동 실행되도록 설정합니다.

  1. 시작 메뉴에서 작업 스케줄러를 검색하여 실행합니다.
  2. 오른쪽 '작업' 패널에서 [작업 만들기...]를 클릭합니다.
  3. [일반] 탭:
    • 이름: WSL2 SSH 자동 포트포워딩 (식별하기 쉬운 이름)
    • ☑️ 가장 높은 수준의 권한으로 실행 (필수 체크!)
    • 다음을 위해 구성: Windows 10 또는 Windows 11
  4. [트리거] 탭:
    • [새로 만들기...] 클릭
    • 작업 시작: 로그온할 때 선택
    • [확인] 클릭
  5. [동작] 탭:
    • [새로 만들기...] 클릭
    • 동작: 프로그램 시작
    • 프로그램/스크립트: powershell.exe
    • 인수 추가 (옵션): (3단계에서 저장한 파일 경로를 정확히 입력)
        -ExecutionPolicy Bypass -File "C:\Scripts\wsl_ssh_forward.ps1"
  6. [조건] 탭:
    • (노트북 사용자) '전원' 섹션에서 컴퓨터가 AC 전원에 연결된 경우에만 작업 시작 체크 해제
  7. [확인]을 눌러 작업을 저장합니다. (필요시 관리자 암호 입력)

4. 테스트 및 접속

  1. 윈도우 PC를 재부팅하고 로그인합니다.

  2. 스크립트가 정상 실행되었는지 확인합니다. (PowerShell(관리자) 실행)

    netsh interface portproxy show all
    • 수신 주소0.0.0.0:2218
    • 연결 주소새로 할당된 WSL2 IP (예: 172.31.x.x:2218)로 설정되었는지 확인합니다.
  3. 외부(같은 네트워크)의 다른 PC에서 접속을 테스트합니다.

    • [WSL사용자명]: WSL2의 사용자 ID
    • [윈도우_호스트_IP]: 10.10.40.146 (Windows의 ipconfig로 확인)
    ssh [WSL사용자명]@[윈도우_호스트_IP] -p 2218

5. 중요 참고 사항 (공유기 설정)

  • 현재 설정은 내부망(Local Network)에서만 유효합니다. (예: 같은 사무실, 같은 집 공유기)
  • 10.10.40.146 IP는 사설 IP이므로, 카페, 학교 등 완전히 다른 인터넷망에서 접속하려면 공유기(라우터)의 포트 포워딩 설정이 추가로 필요합니다.
  • 공유기 설정 (예시):
    • 외부 포트: 2218
    • 내부 IP: 10.10.40.146 (윈도우 PC IP)
    • 내부 포트: 2218

6. 설정 제거 방법 (되돌리기)

  1. 작업 스케줄러: 작업 스케줄러 실행 > 왼쪽 '작업 스케줄러 라이브러리' 클릭 > WSL2 SSH 자동 포트포워딩 작업 우클릭 > 삭제
  2. 방화벽 규칙: PowerShell(관리자) 실행
    Remove-NetFirewallRule -DisplayName "WSL2 SSH (Port 2218)"
  3. Netsh 규칙: PowerShell(관리자) 실행
    netsh interface portproxy delete v4tov4 listenaddress=0.0.0.0 listenport=2218
  4. 스크립트 파일: C:\Scripts\wsl_ssh_forward.ps1 파일 수동 삭제