WSL2 포트포워딩 & 방화벽 가이드
WSL2에서 서비스를 실행했는데 같은 네트워크의 다른 PC에서 접속이 안 되는 문제를 해결하는 포트포워딩 및 방화벽 설정 가이드입니다.
빠른 시작
5분 안에 외부에서 WSL2 서비스 접근 가능하게 만들기
# 0. PowerShell 정책 설정 (최초 1회)
Set-ExecutionPolicy RemoteSigned -Scope CurrentUser
# 1. 관리자 PowerShell 열기: Win + X -> Windows PowerShell (관리자)
# 2. 스크립트 폴더로 이동
cd C:\scripts
# 3. 방화벽 규칙 추가 (최초 1회)
.\wsl2-firewall.ps1
# 4. 포트포워딩 설정 (재부팅할 때마다)
.\wsl2-port-forward.ps1
# 5. 상태 확인
.\wsl2-port-status.ps1
목차
| 파트 | 내용 | 대상 |
|---|---|---|
| Part 1 | 왜 필요한가? WSL2 네트워크 구조 | 처음 접하는 분 |
| Part 2 | 스크립트 사용법 | 바로 적용하고 싶은 분 |
| Part 3 | 트러블슈팅 | 문제가 생겼을 때 |
| Part 4 | 명령어 모음 | 수동 설정/참고용 |
Part 1. 배경 이해
문제 상황
WSL2에서 서비스를 실행했는데, 같은 네트워크의 다른 PC에서 접속이 안 됩니다.
[내 PC: 192.168.0.100]
└── WSL2 (Ubuntu)
└── MariaDB :3306 실행 중
[동료 PC] ────X────> 192.168.0.100:3306 (접속 실패!)
원인: WSL2의 가상 네트워크
WSL2는 Hyper-V 가상 네트워크를 사용합니다.
- Windows와 WSL2는 서로 다른 IP 대역
- 외부에서
192.168.0.100:3306으로 접속해도 WSL2까지 도달하지 않음 - WSL2 IP는 재부팅할 때마다 변경됨!
해결 방법
| 단계 | 설명 | 실행 주기 |
|---|---|---|
| 방화벽 | 포트를 열어줌 | 최초 1회 |
| 포트포워딩 | Windows -> WSL2 연결 | 재부팅마다 |
WSL1 vs WSL2 비교
| 항목 | WSL1 | WSL2 |
|---|---|---|
| 네트워크 | Windows와 동일 IP | 별도 가상 네트워크 |
| 외부 접근 | 바로 가능 | 포트포워딩 필요 |
| IP 주소 | 없음 (공유) | 172.x.x.x (동적) |
| 성능 | 낮음 | 높음 (실제 Linux 커널) |
Part 2. 설정 방법
사전 준비
1. WSL2 배포판 확인
wsl -l -v
NAME STATE VERSION
* Ubuntu-24.04 Running 2
Ubuntu-22.04 Stopped 2
*= 기본 배포판- VERSION이
2인지 확인
2. WSL2 IP 확인
# 기본 배포판
wsl hostname -I
# 특정 배포판 지정 (여러 개 설치 시)
wsl -d Ubuntu-24.04 hostname -I
스크립트 파일 구조
C:\scripts\
├── wsl2-ports.conf # 포트 설정 파일
├── wsl2-firewall.ps1 # 방화벽 규칙 (최초 1회)
├── wsl2-firewall-status.ps1 # 방화벽 상태 조회
├── wsl2-port-forward.ps1 # 포트포워딩 (재부팅마다)
├── wsl2-port-status.ps1 # 포트포워딩 상태 조회
└── wsl2-port-clear.ps1 # 포트포워딩 삭제
Step 1. 설정 파일 편집
wsl2-ports.conf 파일을 열어 필요한 포트를 설정합니다.
# 형식: Windows포트,WSL포트,서비스명,설명
# SSH (외부 4022 -> WSL2 22)
4022,22,ssh,SSH via port 4022
# MariaDB (동일 포트)
3306,3306,MariaDB,MariaDB Database Server
# 주석은 무시됨
#5678,5678,n8n,n8n Workflow
포트 매핑 전략:
| 상황 | Windows 포트 | WSL2 포트 | 이유 |
|---|---|---|---|
| SSH | 4022 | 22 | Windows OpenSSH와 충돌 방지 |
| MariaDB | 3306 | 3306 | 동일 포트 사용 |
| 테스트용 | 13306 | 3306 | 다른 포트로 접속 |
Step 2. 방화벽 규칙 추가 (최초 1회)
# 관리자 PowerShell에서 실행
.\wsl2-firewall.ps1
출력 예시:
WSL2 방화벽 규칙 추가 (2개)...
+ WSL2-ssh-4022 (TCP 4022 -> WSL:22)
+ WSL2-MariaDB-3306 (TCP 3306 -> WSL:3306)
완료!
옵션:
# 규칙 제거
.\wsl2-firewall.ps1 -Remove
# 다른 설정 파일 사용
.\wsl2-firewall.ps1 -ConfigFile "D:\my-ports.conf"
Step 3. 포트포워딩 설정 (재부팅마다)
# 관리자 PowerShell에서 실행
.\wsl2-port-forward.ps1
출력 예시:
========================================
WSL2 포트포워딩 설정 시작
========================================
설정 파일 로드: C:\scripts\wsl2-ports.conf
로드된 포트 수: 2개
WSL2 IP: 172.23.0.149
+ ssh (Win:4022 -> WSL:22) -> 172.23.0.149:22
+ MariaDB (Win:3306 -> WSL:3306) -> 172.23.0.149:3306
========================================
설정 완료: 성공 2개, 실패 0개
========================================
Step 4. 상태 확인
# 포트포워딩 상태
.\wsl2-port-status.ps1
# 방화벽 상태
.\wsl2-firewall-status.ps1
Step 5. 불필요한 규칙 삭제
# 특정 포트만 삭제
.\wsl2-port-clear.ps1 -Ports 22,3306
# 전체 삭제
.\wsl2-port-clear.ps1 -All
요약: 일상적인 사용 흐름
- Windows 재부팅
- 관리자 PowerShell 열기
cd C:\scripts.\wsl2-port-forward.ps1- 외부에서 접속 가능 (예:
ssh user@192.168.0.100 -p 4022)
Part 3. 문제 해결
Q1. 스크립트 실행이 안 됨
증상:
이 시스템에서 스크립트를 실행할 수 없습니다.
해결:
Set-ExecutionPolicy RemoteSigned -Scope CurrentUser
Q2. 관리자 권한 오류
증상:
관리자 권한이 있는 Windows PowerShell에서 실행해야 합니다.
해결:
Win + X-> Windows PowerShell (관리자)- 또는 시작 메뉴에서 “PowerShell” 검색 후 “관리자 권한으로 실행”
Q3. WSL2 IP를 가져올 수 없음
증상:
WSL2 IP를 확인할 수 없습니다.
해결:
# 1. WSL 상태 확인
wsl -l -v
# 2. WSL이 Stopped면 시작
wsl -d Ubuntu-24.04
# 3. 다시 실행
.\wsl2-port-forward.ps1
Q4. 포트포워딩 했는데 외부 접속 안 됨
체크리스트:
| 확인 항목 | 명령어 |
|---|---|
| 방화벽 규칙 | .\wsl2-firewall-status.ps1 |
| 포트포워딩 | .\wsl2-port-status.ps1 |
| WSL2 서비스 | sudo netstat -tlnp |
흔한 원인: 서비스가 localhost에만 바인딩됨
# WSL2에서 확인
sudo netstat -tlnp | grep 3306
# 잘못된 경우: 127.0.0.1:3306 (localhost만 접근 가능)
# 올바른 경우: 0.0.0.0:3306 (외부 접근 가능)
MariaDB 설정 변경 예시:
sudo nano /etc/mysql/mariadb.conf.d/50-server.cnf
# bind-address = 127.0.0.1 -> bind-address = 0.0.0.0
sudo systemctl restart mariadb
Part 4. 레퍼런스
포트포워딩 명령어 (netsh)
# 조회
netsh interface portproxy show v4tov4
# 추가
netsh interface portproxy add v4tov4 `
listenport=3306 listenaddress=0.0.0.0 `
connectport=3306 connectaddress=172.23.0.149
# 삭제
netsh interface portproxy delete v4tov4 `
listenport=3306 listenaddress=0.0.0.0
# 전체 초기화
netsh interface portproxy reset
방화벽 명령어 (PowerShell)
# 조회
Get-NetFirewallRule -DisplayName "WSL2-*" | Select DisplayName, Enabled
# 추가
New-NetFirewallRule -DisplayName "WSL2-Test-8080" `
-Direction Inbound -Action Allow `
-Protocol TCP -LocalPort 8080
# 삭제
Remove-NetFirewallRule -DisplayName "WSL2-Test-8080"
WSL 명령어
# 배포판 목록
wsl -l -v
# IP 확인
wsl hostname -I # 기본 배포판
wsl -d Ubuntu-24.04 hostname -I # 특정 배포판
# 기본 배포판 설정
wsl --set-default Ubuntu-24.04
# 시작/종료
wsl -d Ubuntu-24.04 # 시작
wsl --shutdown # 전체 종료
wsl -t Ubuntu-24.04 # 특정 배포판 종료
스크립트 파라미터 요약
| 스크립트 | 파라미터 | 설명 |
|---|---|---|
| 공통 | -ConfigFile |
설정 파일 경로 (기본: C:\scripts\wsl2-ports.conf) |
wsl2-firewall.ps1 |
-Remove |
규칙 제거 |
wsl2-port-forward.ps1 |
-WslDistro |
WSL 배포판 이름 |
wsl2-port-clear.ps1 |
-Ports |
삭제할 포트 목록 (예: 22,3306) |
wsl2-port-clear.ps1 |
-All |
전체 삭제 |
자동 실행 설정 (선택)
재부팅 후 자동으로 포트포워딩을 설정하려면 작업 스케줄러를 사용합니다.
Win + R->taskschd.msc- 작업 만들기
- 트리거: “시작할 때”
- 동작:
powershell.exe - 인수:
-ExecutionPolicy Bypass -File C:\scripts\wsl2-port-forward.ps1 - “가장 높은 수준의 권한으로 실행” 체크
이 문서는 WSL2 네트워크 설정 삽질의 결과물입니다.