linux
외부 접속을 위한 WSL2 SSH
jhinux
2025. 11. 17. 11:41
📄 외부 접속을 위한 WSL2 SSH 포트 포워딩 자동화 매뉴얼
1. 개요
이 매뉴얼은 윈도우 재부팅 시 WSL2의 내부 IP 주소가 변경되어도, 윈도우 호스트(PC)로 들어오는 SSH(2218 포트) 요청을 WSL2로 자동 연결(포트 포워딩)하는 방법을 설명합니다.
- 문제점: WSL2는 재부팅 시 내부 IP가 유동적으로 변경됩니다.
- 해결책: PowerShell 스크립트와 윈도우 작업 스케줄러를 사용하여, 윈도우 로그인 시 다음 작업을 자동화합니다.
- WSL2 내의 SSH 서버를 실행 (
systemctl사용) - WSL2의 변경된 IP 주소를 감지
netsh포트 포워딩 규칙을 새 IP로 자동 업데이트
- WSL2 내의 SSH 서버를 실행 (
2. 사전 준비 사항
- WSL2 설치:
systemd를 지원하는 배포판 (예: Ubuntu 22.04 이상) - WSL2 내 SSH 서버 설치:
# WSL2 터미널에서 실행 sudo apt update sudo apt install openssh-server - 윈도우 관리자 권한:
netsh및작업 스케줄러설정에 필요합니다.
3. 단계별 설정 방법
1단계: WSL2 SSH 서버 설정 (최초 1회)
WSL2가 2218번 포트로 SSH 연결을 수신하도록 설정합니다.
WSL2 터미널에서
sshd_config파일을 엽니다.sudo nano /etc/ssh/sshd_config아래 내용을 찾아 수정하거나 추가합니다.
# 기본 22번 포트를 2218로 변경 Port 2218 # (주석 해제) 모든 IP에서 수신 허용 ListenAddress 0.0.0.0 # (선택) 비밀번호 로그인 허용 PasswordAuthentication yes설정 저장 후 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번 포트에 접근할 수 있도록 윈도우 방화벽을 엽니다.
PowerShell을 '관리자 권한'으로 실행합니다.
아래 명령어를 입력하여 방화벽 규칙을 추가합니다.
New-NetFirewallRule -DisplayName "WSL2 SSH (Port 2218)" -Direction Inbound -Protocol TCP -LocalPort 2218 -Action Allow(이 작업은 한 번만 수행하면 IP가 바뀌어도 유지됩니다.)
3단계: 자동화 스크립트 작성 (PowerShell)
윈도우 로그인 시 실행될 PowerShell 스크립트를 만듭니다.
메모장을 열어 아래 코드를 복사하여 붙여넣습니다.# --- 스크립트 시작 --- # 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." } # --- 스크립트 끝 ---이 파일을
.ps1확장자로 저장합니다. (예:C:\Scripts\wsl_ssh_forward.ps1)팁: 저장 시 '파일 형식'을 '모든 파일'로 변경하고 파일 이름에
.ps1을 붙여야 합니다.
4단계: 윈도우 작업 스케줄러 등록
윈도우 로그인 시 위 스크립트가 '관리자 권한'으로 자동 실행되도록 설정합니다.
- 시작 메뉴에서
작업 스케줄러를 검색하여 실행합니다. - 오른쪽 '작업' 패널에서 [작업 만들기...]를 클릭합니다.
- [일반] 탭:
- 이름:
WSL2 SSH 자동 포트포워딩(식별하기 쉬운 이름) - ☑️
가장 높은 수준의 권한으로 실행(필수 체크!) - 다음을 위해 구성:
Windows 10또는Windows 11
- 이름:
- [트리거] 탭:
- [새로 만들기...] 클릭
- 작업 시작:
로그온할 때선택 - [확인] 클릭
- [동작] 탭:
- [새로 만들기...] 클릭
- 동작:
프로그램 시작 - 프로그램/스크립트:
powershell.exe - 인수 추가 (옵션): (3단계에서 저장한 파일 경로를 정확히 입력)
-ExecutionPolicy Bypass -File "C:\Scripts\wsl_ssh_forward.ps1"
- [조건] 탭:
- (노트북 사용자) '전원' 섹션에서
컴퓨터가 AC 전원에 연결된 경우에만 작업 시작체크 해제
- (노트북 사용자) '전원' 섹션에서
- [확인]을 눌러 작업을 저장합니다. (필요시 관리자 암호 입력)
4. 테스트 및 접속
윈도우 PC를 재부팅하고 로그인합니다.
스크립트가 정상 실행되었는지 확인합니다. (PowerShell(관리자) 실행)
netsh interface portproxy show all수신 주소가0.0.0.0:2218연결 주소가 새로 할당된 WSL2 IP (예:172.31.x.x:2218)로 설정되었는지 확인합니다.
외부(같은 네트워크)의 다른 PC에서 접속을 테스트합니다.
[WSL사용자명]: WSL2의 사용자 ID[윈도우_호스트_IP]:10.10.40.146(Windows의ipconfig로 확인)
ssh [WSL사용자명]@[윈도우_호스트_IP] -p 2218
5. 중요 참고 사항 (공유기 설정)
- 현재 설정은 내부망(Local Network)에서만 유효합니다. (예: 같은 사무실, 같은 집 공유기)
10.10.40.146IP는 사설 IP이므로, 카페, 학교 등 완전히 다른 인터넷망에서 접속하려면 공유기(라우터)의 포트 포워딩 설정이 추가로 필요합니다.- 공유기 설정 (예시):
- 외부 포트:
2218 - 내부 IP:
10.10.40.146(윈도우 PC IP) - 내부 포트:
2218
- 외부 포트:
6. 설정 제거 방법 (되돌리기)
- 작업 스케줄러:
작업 스케줄러실행 > 왼쪽 '작업 스케줄러 라이브러리' 클릭 >WSL2 SSH 자동 포트포워딩작업 우클릭 > 삭제 - 방화벽 규칙: PowerShell(관리자) 실행
Remove-NetFirewallRule -DisplayName "WSL2 SSH (Port 2218)" - Netsh 규칙: PowerShell(관리자) 실행
netsh interface portproxy delete v4tov4 listenaddress=0.0.0.0 listenport=2218 - 스크립트 파일:
C:\Scripts\wsl_ssh_forward.ps1파일 수동 삭제