VPN 이라는 용어는 한번쯤 들어봤을 것 같아. 코로나 시대에 사무실 근무가 여의치 않아 재택근무를 할 수 밖에 없던 시절, 사무실 밖에서 사무실 네트워크에 접속하기 위해서 원격 접속 프로그램도 사용했었겠지만, VPN 에 연결해서 마치 사무실에 있는 것처럼 자유롭게 업무를 봤었지.
VPN 은 Virtual Private Network 의 이니셜인데, 가상사설망이라고 번역되지. pfSense 에도 VPN 서비스 기능이 있는데, 기본적으로 IPsec, L2TP, OpenVPN 메뉴가 존재해.
그런데 나는 WireGuard 라는 패키지를 설치해서 구성해보려고 해.
VPN 을 구성하는 목적은 pfSense 의 WAN 영역에 있는 PC에서는 LAN 영역의 서버로 접근이 불가능하기 때문이야. PostgreSQL 접속 설정하기 포스트에서 작업하는 PC에서 LAN 영역의 PostgreSQL 서버에 접속할 수 있게 하기 위해서 포트포워딩 규칙을 설정해야 했지. 내가 접속이 가능하게 하기 위해서 인터넷에 해당 접속을 공개해버리는건 보안적으로는 너무 안좋은 선택이야.
WireGuard 패키지 설치
우선 System / Package Manager 화면의 Available Packages 탭으로 이동해서 검색어에 wireguard 라고 입력한 후에 검색을 해보자.

검색결과 2번째로 0.2.1 버전이 표시가 되네. 초록색 Install 버튼을 클릭해서 일단 설치를 해보자구.

설치가 완료되면 VPN 메뉴 아래에 WireGuard 메뉴가 추가되지.
WireGuard 규칙(Rule) 추가
WireGuard 설치한 결과로 Firewall Rules 목록에 WireGuard 가 생겨나지.

Add 버튼을 눌러서 WireGuard 인터페이스에 대한 방화벽 규칙을 모두 허용으로 추가해 주어야 해.


터널 설정
이제 VPN 터널을 생성해주어야 해. VPN 에서 터널은 네트워크와 네트워크간의 보호되는 통로를 의미하지. 즉, VPN 은 기본적으로 보안성을 포함하고 있어.
VPN / WireGuard 메뉴화면으로 이동해서

Tunnels 탭의 아래쪽 Add Tunnel 버튼을 눌러보자.

터널의 설명으로 WG_tunnel, 포트값은 디폴트값인 51820을 그대로 두고(보안을 생각한다면 디폴트값을 그대로 사용하지 말고 수정해주는게 좋아), 터널 IP 주소로 172.16.20.1/24 를 할당했어. 이 터널 주소는 공인 IP 주소가 아닌 사설 IP 주소중에서 마음에 드는 대역대로 선택해주면 되겠어.
사설 IP 주소 대역은 아래 목록을 참고해봐.
- 10.0.0.0/8 (할당범위 : 10.0.0.0 ~ 10.255.255.255)
- 172.16.0.0/12 (할당범위 : 172.16.0.0 ~ 172.31.255.255)
- 192.168.0.0/16 (할당범위 : 192.168.255.255)
오른쪽 파란색의 Generate 버튼을 클릭하면 Interface Keys 의 Private Key 와 Public Key 가 발급되어 채워지지.

이중에서 Public Key 값은 이 터널을 통과할 PC (Peer) 에 할당할 때 사용될거야. 사용할 때 Copy 링크를 클릭해서 클립보드로 복사하면 돼. 메모장에 그 값을 미리 옮겨놔도 돼.

아래쪽으로 스크롤하면 Save Tunnel 버튼이 있어. 이 버튼을 클릭해서 Tunnel 정보를 일단 저장하자.

방화벽 규칙 (WAN)
VPN 터널을 만들었으니 WAN 에서 이 터널로 패킷이 진입할 수 있도록 VPN 터널 포트에 대한 방화벽 규칙을 추가해 주어야 해.
Firewall / Rules 메뉴 화면으로 이동하고, WAN 탭에서 Add 버튼을 눌러주자.

UDP 프로토콜을 처리한다는게 특이점이야. 목적지는 WAN address, 포트범위는 VPN 터널 포트로 설정한 51820 을 선택해주자.
이제 서버에서의 VPN 구성을 완료했고, VPN 으로 들어오는 패킷에 대한 규칙까지 추가 완료한 상태야.
Peer 추가
VPN 에 접속할 클라이언트에 대한 정보를 등록하는 일이 남았어. 지금부터는 WireGuard 클라이언트 설정과 동시에 진행할거야.
https://www.wireguard.com/install/ 주소로 이동하면 OS 별로 WireGuard 클라이언트 프로그램 목록이 정리되어 있지.

Windows 버전을 내려받아 설치를 해보자.

설치가 완료되고 프로그램이 실행된 상태의 모습이야. 아래쪽에 Add Tunnel 버튼이 보이지? 반드시 오른쪽 화살표를 눌러서 나오는 Add empty tunnel 메뉴를 선택해야 해.

클라이언트에 표시되고 있는 Public key 의 값을 클립보드에 복사해두고, pfSense 의 VPN / WireGuard 메뉴의 Peers 탭으로 이동해서 Add Peer 버튼을 누르자.

클립보드에 복사해 둔 클라이언트의 Public Key 값을 Public Key 항목값으로 붙여넣기 하고, Tunnel 은 앞에서 등록한 터널을 선택해주면 돼.
Allowed IPs 에는 클라이언트에게 할당할 IP 주소값을 입력해주는건데, 터널에 할당했던 IP 주소가 172.16.20.1 이니까 그 다음 번호인 172.16.20.2 로 입력해주면 되겠네. Save Peer 저장 버튼 누르는거 잊지마~!
이제 클라이언트 설정을 해볼께.
VPN Client (for Windows) 설정
다시 WireGuard Client 로 돌아와서 나머지 설정값들을 입력해볼께.

[Interface] 섹션의 Address 는 이 클라이언트가 할당받을 VPN IP 주소야. pfSense 의 Peer 에 할당한 값과 동일해야 하지.
[Peer] 섹션의 PublicKey 에는 아까 메모장에 잠시 기록해 두었던 VPN 터널의 PublicKey 값을 입력해주면 돼.
EndPoint 는 pfSense 서버주소와 VPN 터널의 포트를 기록해주면 되는거야.
AllowedIPs 값으로는 이 VPN 클라이언트가 접속 가능한 IP 주소 대역 목록을 콤마(,) 로 연결해서 기록해주면 되는데, VPN IP 주소 대역(172.16.20.0/24) 은 당연히 포함되어야겠고, 10.10.1.0/24 는 pfSense 의 내부 네트워크(LAN) 영역에 할당한 IP 주소 대역인데, VPN 으로 연결해서 LAN 네트워크에 구성되어 있는 서버에 접속할 수 있게 하기 위한 목적이지.
AllowedIPs 값으로 0.0.0.0/0 만 입력하는 경우도 있는데, 터널로 모든 IP 주소 대역대의 트래픽을 통과시키겠다는 의미라서 접근 가능한 범위는 넓어질지 모르겠지만, 보안에 조금 더 취약해질 수 있는 단점이 있지.
새로 추가 작성한 항목들을 아래에 다시 정리해봤어.
Address = 172.16.20.2/24
[Peer]
PublicKey = +t2HtufGse0dwZYahsWkLIeQyMG8SevpuAt/t0BuOCk=
Endpoint = 192.168.219.254:51820
AllowedIPs = 172.16.20.0/24, 10.10.1.0/24
WireGuard VPN Client 에서 Activate 버튼을 클릭하면 터널에 접속할 수 있게 돼.

cmd 에서 ipconfig /all 을 입력해보면 172.16.20.2 IP 주소를 할당받은 것을 확인할 수 있어.

pfSense 의 VPN / WireGuard 메뉴의 Status 탭으로 이동해서 터널 항목을 확장해보면 Peer 와 정상적으로 연결되었다는 초록색 악수 모양 아이콘을 확인할 수 있지.

그럼 제대로 연결된 것인지 확인해볼까?
PostgreSQL 접속 설정하기 포스트에서 PostgreSQL 서버로의 접속을 확인하기 위해서 5432 포트 포워딩 규칙을 추가했었던것 기억나지? 이 규칙을 비활성화하면 PostgreSQL 서버로 접속이 안되지.
그러면 규칙을 비활성화한 상태에서 VPN 으로 연결하는 경우에는 PostgreSQL 로 접속이 될까?
DBeaver 에서 PostgreSQL 서버 접속 설정값을 조금 변경해야 할 필요가 있는데, 5432 포트 포워딩 규칙을 활성화했을 때에는 DB 서버 주소를 192.168.219.254 로 pfSense 서버 주소를 지정했었잖아? 그런데, VPN 으로 연결하는 경우에는 내부 LAN 영역에 있는것과 같은 개념이니, postgres-ubuntu 서버의 주소인 10.10.1.11 로 변경해 줘야 해.

이제 DB 서버를 외부 인터넷에 노출시키지 않은 보안 상태로 운영하다가 작업을 위해서 접속이 필요한 경우에만 VPN 으로 연결해서 작업하면 되겠네.
WireGuard Client 는 macOS 용도 있으니 집에 있는 MacBook 에도 설치를 해야겠어. 어디서든지 VPN 만 연결하면 작업이 가능해지니 좋을것 같네.