사용 환경
지금 사용하는 컴퓨터들은 아래 그림과 같은 곳에 설치되어있습니다.
밖에서는 노트북(PC2)를 이용하여 주로 집 서버에 접속해서 작업을 진행합니다. 집 서버는 사설 IP(192.168.0.2)를 배정받지만 공유기에서 DMZ를 설정해놓았기 때문에 공인 IP(58.142.x.x)를 배정받은 경우처럼 작동합니다.
집 서버가 아닌 경우에는 다음과 같은 이유로 SSH를 이용한 접속에 문제가 발생합니다.
- 방화벽이 설정된 경우(학교서버, PC1): 인바운드 연결이 불가능
- IP가 유동적이거나 사설 IP를 배정받은 경우(PC2, 노트북에 SSH로 접속할 경우는 많이 없음): IP를 모르거나 해당 IP로 연결이 불가능
기존에는 reverse SSH같은 방법을 사용해서 문제를 해결했으나, wireguard를 이용하는 방식으로 수정했습니다
wireguard를 사용하면 각각의 컴퓨터가 하나의 공유기 안에 연결되어있는 것처럼 네트워크를 구성할 수 있습니다.
패키지 설치
wireguard 자체는 Linux 커널에 이미 포함이 되어있기 때문에, wireguard를 편하게 쓸 수 있는 wireguard-tools
을 설치합시다.
Ubuntu
1 | apt install wireguard-tools |
Arch Linux
1 | pacman -S wireguard-tools |
윈도우(wireguard 설치 필요) 및 기타 배포판은 wireguard 홈페이지를 참고합시다.
키 생성
wireguard는 각 컴퓨터에서 생성한 키쌍(공개키, 개인키)를 이용하여 VPN 터널을 구축하기 때문에 컴퓨터 하나당 키쌍 하나를 생성해야합니다.
공식 홈페이지에서는 다음과 같이 키쌍을 생성하라고 메뉴얼에서 언급하고 있습니다.
1 | umask 077 # 생성될 키의 퍼미션 설정, 생략해도 정상적으로는 작동 |
개인키와 공개키를 성공적으로 생성했다면 다음과 같이 base64형태의 문자열이 저장된 것을 확인할 수 있습니다.
1 | pngwna@ArchPngWnA ~/sandbox % cat privatekey publickey |
wireguard를 사용하는 컴퓨터마다 키 생성을 진행해줍시다.
설정파일 생성
다음과 같이 VPN 내부 IP를 설정하는 경우의 예시입니다.
- 집 서버(58.142.x.x) <- 10.0.0.1
- 학교 서버(163.152.x.x) <- 10.0.0.2
- 학교 PC1(58.142.x.x) <- 10.0.0.4
- 외부 PC2(58.142.x.x) <- 10.0.0.5
키 생성을 통해서 각 컴퓨터마다 하나의 키쌍(공개키, 개인키)를 생성해두었습니다. 이를 이용하여 설정파일을 생성합시다.
VPN 서버
공인 IP를 배정받은 서버를 이용해 여러 컴퓨터를 하나로 묵을 수 있습니다.
만약 공인 IP를 배정받을 수 있는 서버가 없다면, 프리티어 VM을 사용하는 것도 해결책이 될 수 있습니다.
서버로 사용할 컴퓨터의 /etc/wireguard/
아래 다음과 같이 설정파일(예시:wg0.conf
)를 추가해줍니다.
1 | [Interface] |
[Interface]
에는 해당 컴퓨터의 개인키, [Peer]
에는 대상 컴퓨터의 공개키를 넣어야하는 점을 기억합시다. 잘못 넣으면 연결이 되지 않습니다.
각 요소에 대한 설명은 다음과 같습니다.
- Address: 해당 컴퓨터가 배정받고자 하는 IP
- Saveconfig: 변경 사항을 자동으로 해당 설정 파일에 반영할지 여부
- ListenPort: wireguard 서버 포트
- PrivateKey: 해당 컴퓨터의 개인키
- PublicKyey: 대상 컴퓨터의 공개키
- AllowedIPs: 접속이 허용되는 IP대역(각각의 IP로만 10.0.0.1에 접속이 가능함)
- PersistentKeepAlive: 몇초마다 keepalive 패킷을 보낼지 인터벌 설정
VPN 클라이언트
서버를 제외한, VPN을 사용하려고 하는 컴퓨터마다 다음과 같이 /etc/wireguard/
에 설정파일(예시:wg0.conf
)를 만들어줍니다.
1 | [Interface] |
[Interface]
에는 해당 컴퓨터의 개인키, [Peer]
에는 대상 컴퓨터의 공개키를 넣어야하는 점을 다시 한 번 기억합시다.
AllowedIPs를 10.0.0.0/8로 설정할 경우 10.x.x.x에 매치되는 모든 연결은 VPN서버로 연결된 후 목적지 IP로 다시 라우팅됩니다. 이를 이용하여 wireguard VPN을 사용하는 컴퓨터를 하나의 네트워크 아래로 묶을 수 있습니다.
클라이언트마다 위와 같은 설정 파일을 생성해줍시다.
이렇게 설정파일을 설정할 경우 위에서 언급한 두가지 문제가 해결 됩니다.
- 방화벽이 설정된 경우: PersistentKeepAlive 설정으로 내부에서 연결을 시작할 수 있기 때문에 우회 가능
- IP가 유동적이거나 사설 IP를 배정받은 경우: 설정한 IP(10.0.0.x)로 접근 가능하기 때문에 해결 가능
wireguard 활성화
다음과 같은 명령어로 wireguard VPN을 활성화합시다.
1 | wg-quick up wg0.conf |
(윈도우같은 경우는 설정파일을 추가해준 후 activate를 클릭하면 터널이 활성화됩니다)
wg-quick up
뒤에는 설정한 파일 이름이 들어가야합니다. 만약 설정 파일을 wgserver.conf
로 만들었다면 명령어는
1 | wg-quick up wgserver.conf |
가 되어야 합니다.
활성화 후 wg
명령어를 이용하여 터널링이 제대로 활성화되었는지 확인할 수 있습니다.
1 | root@Polaris$ sudo wg |
클라이언트에서도 마찬가지로 wg
명령어를 사용하여 터널링 상태를 확인할 수 있습니다.
1 | pngwna@ArchPngWnA ~/sandbox % sudo wg |
wireguard가 제대로 설정된 것 같으면 다음과 같은 명령어로 컴퓨터 시작시 항상 실행되게 설정합시다.
1 | systemctl enable wg-quick@wg0.service |
(wg-quick@
뒤에는 설정파일이름.service
와 같은 형태로 입력하면 됩니다)
위와 같이 설정하면 컴퓨터간 wireguard VPN 터널링을 정상적으로 활용할 수 있습니다.
참고
vanity key
wg genkey로 생성되는 키는 보통 의미 없는 base64 문자열이지만 계속 키를 생성하다보면 의미있는 문자열이 나올 수 도 있습니다.
wireguard vanity keygen을 이용하면 본인이 원하는 문자열로 시작하는 공개키(예시: Home75VA21rBOQUX+TyHT2TCzY7Q/7e7byTWSQosPAE=
) 를 생성할 수 있습니다.