wsl2 부터 symantec PC 보안 솔루션에 의해서 외부 네트워크가 차단되는 문제가 있다. 다음 링크에서 resolution 을 제공해주기는 하지만,
https://knowledge.broadcom.com/external/article/221329/endpoint-protection-firewall-blocks-netw.html
wsl2 을 재실행(재부팅)할 때마다 룰을 적용해주는게 번거롭기도 하고, 회사와 같이 해당 규칙을 직접 관리할 수 없는, 중앙관리되는 환경이라면 매번 결재를 받을 수도 없고 난감하다.
근본적인 문제를 해결하는 방법은 아니겠지만, 컨테이너로 프록시를 구동해주는 것으로 우회해서 사용하고 있는데 관련 방법을 정리해본다.
wsl2 에서부터 도커 지원이 시작됐는데, 이게 wsl 머신 안에서 구동되는 도커데몬이 아니라 windows host 에서 구동되는 docker 데몬과 연동시켜주는 방식으로 구현돼 있다. 그래서 컨테이너에서는 외부 네트워크가 정상적으로 동작하는데 이를 활용하면 다소 억지스럽긴하지만 wsl2 머신 안에서도 도커 컨테이너를 경유시켜 외부 네트워크가 가능하도록 할 수 있다.
준비물은 nginx 이미지 하나만 있으면 된다. 이 방식까지 써야하는 환경은 보통 보안이 치밀한 회사일테니, 도커 이미지를 인터넷 환경에서 추출해 반입하거나 사설 도커 이미지 레포지토리를 이용해 nginx 를 내려받으면 된다. docker pull 은 windows host 에서 동작하는 도커 데몬에서 이뤄지기 때문에 네트워크가 되지 않는 wsl2 머신 안에서 명령하더라도 windows host 의 네트워크를 이용하기 때문에 정상적으로 동작할 것이다.
이미지를 내려받았으면 다음과 같이 nginx 설정에 다음과 같이 프록시를 경유시킬 url 들을 기재해놓고 컨테이너를 기동하면 된다.
docker–compose.yml
version: '3'
services:
nginx:
image: nginx:latest
ports:
– 1599:443
– 3333:80
volumes:
– .⁄nginx.conf:⁄etc⁄nginx⁄nginx.conf
– .⁄conf.d:⁄etc⁄nginx⁄conf.d
– .⁄stream–enabled:⁄etc⁄nginx⁄stream–enabled
nginx.conf
user nginx;
worker_processes 1;
events {
worker_connections 1024;
}
http {
include ⁄etc⁄nginx⁄mime.types;
default_type application⁄octet–stream;
log_format main '$remote_addr – $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
access_log ⁄var⁄log⁄nginx⁄access.log main;
sendfile on;
keepalive_timeout 65;
include ⁄etc⁄nginx⁄conf.d⁄*.conf;
}
stream {
include ⁄etc⁄nginx⁄stream–enabled⁄*.conf;
}
conf.d⁄default.conf
다음과 같이 http 서비스들은 sub–directory 로 접근하고자 하는 서비스들을 구분해 location 섹션에서 맵핑하고
server {
listen 80;
client_max_body_size 0;
location ⁄gitlab⁄ {
proxy_pass https://gitlab.private.domain/;
}
location ⁄nexus⁄ {
proxy_pass https://nexus.private.domain:9443/;
}
}
stream–enabled⁄ssh.conf
ssh 와 같은 스트림 서비스들은 위 경로에 설정한다. stream 섹션에는 location 으로 구분할 수가 없어서 ssh 등의 스트림을 여러개 사용하려면 각각 포트 맵핑이 필요하다.
server {
listen 442;
proxy_pass gateway.private.domain:22;
}
다음과 같이 명령했을 때는 한참 응답이 없다가 타임아웃이 발생하지만
# curl –XGET https://gitlab.private.domain/
curl: (28) Failed to connect to gitlab.private.domain port 443: Connection timed out
다음과 같이 위 깃랩 서비스를 로컬호스트로 프록시한 경로로 요청을 보내면 정상적으로 응답이 온다.
# curl –XGET http://localhost:3333/gitlab/
<html><body>You are being <a redirected<⁄a>.<⁄body><⁄html>