VPN 연결 공유하기

특정 네트워크로 연결하게 해주는 VPN을 여러 기기를 통해 사용해야 한다고 할 때, 이것을 어떻게 공유하는지 정리해보기로 한다.

준비물

특정 PC에만 허락된 VPN 연결 공유하기

VPN 연결을 특정 PC에서만 할 수 있도록 설정되어있는 경우가 있다. 이런 경우 해당 PC에서만 작업해야 하는데, 그게 불편하다면 VPN 연결을 다른 디바이스로 공유하도록 하면 편리하다. 대개 이런 PC의 경우 윈도우즈이고 사용자 권한을 제한하여 소프트웨어나 시스템 사항 변경을 마음대로 하지 못하게 하는 경우가 대부분이다. 이 때 msys/msys2/cygwin 같은 것들의 설치는 의외로 허가되어있는 경우가 많다.

가능하다면 msys2를 설치하자. (왜? 이게 가장 설치하기 편하고 최소 설치가 가능하다.)

1) sshd/openssh를 설치하자. ssh로 터널을 뚫기 위함이다. 2) 그 다음은 sshd를 실행한다. 3) VPN이 되는 PC에서 reverse tunnel을 뚫는다. 다음과 같이 한다. 여기서 리모트 호스트라고 함은 VPN을 공유하게 해주는 PC 혹은 라스베리파이 주소가 된다.

ssh -fNC -R 리모트호스트의포트번호:localhost:해당PC의포트 리모트호스트주소

어차피 SSH를 통해서 리모트 호스트에서 VPN이 되는 호스트로 SOCKS proxy를 뚫어야 하므로 로컬포트는 SSH 포트 번호인 22번이 되어야 하고, 리모트 호스트의 포트번호는 아무거나 하고 싶은 걸로 하면 된다. 그러면 리모스 호스트의 같은 번호의 로컬 포트로 ssh로 접속하면 VPN이 설치된 PC로 ssh 접속이 가능하다.

4) 공유하는 호스트에서는 VPN이 되는 호스트에 socks proxy tunnel을 뚫는다.

다음과 같이 한다.

ssh -f -N -D [sock proxy 포트번호] localhost -p [리버스 터널의 포트 번호]

MacOS는 socks proxy가 지원되기 때문에 localhost, socks proxy port 번호를 설정해주면 VPN연결을 가져다 쓸 수 있다. 윈도우즈나 리눅스 같은 경우에는 시스템 전체로 되는 proxy는 OS에서 지원되지 않고 웹 브라우져들만 지원하므로 웹 연결에만 쓸 수 있다.

그러나, VPN 연결을 통해서 접속하려는 주소의 대역은 대부분 일부 영역에 한정되어있기 때문에 VPN이 뚫렸다고 해서 모든 트래픽을 VPN을 통해서 보내야 할 이유는 없다. 더구나 VPN을 타고 우회하게 되면 latency도 늘어나고 대역폭도 줄어들기 때문에 특정 주소대역만 VPN을 사용하려하게 된다. 또 모든 OS에서 아무때나 편하게 사용하려면 VPN 연결을 공유해주는 뭔가가 필요하게 된다. raspberry pi가 이런 의미에서 아주 쓸모가 있다.

4) VPN을 공유하는 호스트에서 VPN 호스트로 ssh를 이용하여 socks 터널을 뚫는다. 해당 호스트에는 badvpn을 설치한다. badvpn은 socks를 통해서 vpn을 가능하게 해주는 응용프로그램이다. socks proxy로 터널을 뚫으면 해당 포트로 socks proxy로 연결해도 되지만, MacOS이 아닌 경우 socks proxy를 지원하는 것은 대부분 웹브라우저 정도이고 그외 트래픽은 proxy를 쓸 수 없다. 5) badvpn을 실행하면 tunneling device가 하나 생기는데 이것에 사설 IP 어드레스 (대부분 10.0.0.1)를 부여하고 VPN을 통해서 접속하려는 주소 대역을 route를 이용하여 연결해준다. 이 때 VPN을 공유하는 호스트로 들어오는 패킷은 내부에서 routing되어 다른 곳으로 빠져나가는, 이른바 packet forwarding이 되어야 하므로, kernel option (/proc/net….)에서 이것을 허가해주어야 한다. iptables로 방회벽 옵션이 있다면 적당히 풀어주어야 한다.