5 min read

VPN으로 방화벽 뚫기

WierGuard를 이용하여 건물 방화벽을 뚫고(...) 내부 서버에 접속하는 방법에 대한 이야기이다.

어째서 이런 일이 필요한가?

회사 건물의 네트워크 구조가... 좀 거지같다.

건물 인터넷으로 KT 기업용 회선이 깔려 있는데, 공유 오피스 5개 층에 공인IP를 모두 할당해 주면 돈이 너무 많이 나가는 모양이다. 얹혀 사는 입장에서는 군소리 할 계제가 없다.

층 당 포트 40개 정도 설치되어 있으니, 5개 층이면 포트가 200개 쯤 될 거다. 여하튼 건물 내부에서 인터넷을 연결하면 사설IP가 할당되고, KT에서 깔아준 방화벽이 그 앞을 틀어 막고 있다. 외부에서 접속은 막혀 있고, D-NAT (흔히 말하는 포트 포워딩) 열어 달라고 은근슬쩍 관리 사무실에 물어보니 "그게 모에요?" 하는 걸 보고 말끔히 포기.

근데 그렇다고 외근이나 재택근무를 피할 수도 없으니, 회사 컴퓨터에 원격 접속은 꼭 필요하다. 그럼 이걸 어떻게 뚫어?


역방향으로 VPN을 굴리자

결론부터 말하면 외부에 적당한 VPN 서버를 두고, 회사 컴퓨터에서 상시 접속 상태를 유지하면 된다.

실제 구축 사례를 보자. VPN 소프트웨어는 WireGuard (WG)를 이용하였다.

위 그림과 같은 방식이다. 외부에 WG 서버를 두고, 회사 컴퓨터와 외부 컴퓨터가 모두 VPN에 접속하면 된다. 그러면 서로 VPN 내부의 사설IP 주소로 원격 접속을 할 수 있게 된다. 이런 구성을 Hub and Spoke model 이라고 하는 모양이다.

물론 여기에서 설명이 빠진 부분이 존재한다. 기본적으로 VPN은 점 대 점(Point-to-Point) 연결이기 때문에, 외부 컴퓨터에서 쏘는 패킷은 서버로 전달되며, 회사 컴퓨터로는 전달되지 않는다. 반대 경로도 마찬가지이다. 둘 사이에 직접적인 연결이 없기 때문이다.

그렇다면 WG 서버가 둘 사이의 패킷을 중계해 주도록 해야 한다. 슬슬 눈치챘을 것이다. WG 서버에서 net.ipv4.ip_forward 설정을 켜고, 넷필터 에서도 FORWARD 룰을 설정해 주어야 한다.

넷필터 룰 자체는 간단하다. 입력=출력=wgX 인터페이스인 경우 ACCEPT로 잡아주면 된다. 다만 WG 가상 인터페이스가 생기고 없어질 때마다 룰을 재설정 해 주는게 귀찮을 따름이다.

마침 wg-quick에는 PreUp/PostUp , PreDown/PostDown 훅이 존재하고, 여기에서 %i 예약어를 인터페이스 이름으로 대체해 준다. 따라서 WG 서버에서 사용하는 wg-quick 설정 파일에 다음과 같이 설정해 주면 서비스를 올리고 내릴 때마다 알아서 포워딩 룰을 잡아준다. 손에 익은게 iptables라 이걸 사용하고 있는데, 어째 요즘은 nftables를 더 많이 사용하는 모양이다.

PreUp=sysctl -w net.ipv4.ip_forward=1
PostUp=iptables -I FORWARD -i %i -o %i -j ACCEPT
PostDown=iptables -D FORWARD -i %i -o %i -j ACCEPT

이제 지속적으로 WG서버와 회사 컴퓨터 사이에 통신이 오가도록 해서, 방화벽의 S-NAT 설정을 유지해야 한다. WG는 UDP 연결을 사용하는데, 오랫동안(보통 30초) 트래픽이 없으면 방화벽은 통신 종료로 간주하여 S-NAT 설정을 날려버리고, 그럼 VPN 접속이 끊어진다. 이걸 복구하려면 회사 사무실에 가서 다시 VPN을 켜 줘야 하니, 원격 접속을 하겠다는 목적은 말짱 도루묵이 되어 버린다.

WG의 PersistentKeepalive 설정을 이용하면 손쉽게 몇 초 마다 PING을 날려서 연결을 유지해 준다. 회사 컴퓨터의 WG 설정에 다음과 같이 추가해 주면 된다. 예를 들어 15초마다 Ping을 날리도록 하려면 15를 설정해 준다.

PersistentKeepalive = 15

WG서버 마련하기

이제 문제는 24/7 구동되는 WG 서버를 마련하는 것이다.

집에 놀고 있는 라즈베리파이 같은 싱글보드 컴퓨터(SBC)가 있다면 서버로 설정해서 사용할 수도 있을 것이다. 다만 요즘 반도체 대란으로 전반적으로 SBC 구매가 쉽지 않은 편이며, 그 외에도 전기 및 인터넷 요금도 내가 부담해야 하니 조금 아쉬울 수 있다.

이럴 때 쓰라고 있는게 클라우드 서비스에서 제공하는 VPC이다. 동시 접속자 두서너 명 정도의 WG 서버는 그렇게 고성능 서버를 요구하지 않기 때문에, 클라우드 서비스의 무료 맛보기 티어 정도만 되어도 충분하다.

클라우드 서비스의 대표 주자인 AWS는 아쉽게도 VPC 서비스의 무료 티어가 제한적이다. 계정 생성 후 12개월 동안만 제공하고 이후로는 돈을 내야 한다. GCP나 OracleCloud는 Always Free 인스턴스를 제공하므로 이 쪽을 이용해 봄 직 하다.