[Wireguard] Wireguard 사용 예시

  1. 1. 사용 환경
  2. 2. 패키지 설치
    1. 2.1. Ubuntu
    2. 2.2. Arch Linux
  3. 3. 키 생성
  4. 4. 설정파일 생성
    1. 4.1. VPN 서버
    2. 4.2. VPN 클라이언트
  5. 5. wireguard 활성화
  6. 6. 참고
    1. 6.1. vanity key
    2. 6.2. Reference

사용 환경

지금 사용하는 컴퓨터들은 아래 그림과 같은 곳에 설치되어있습니다.

컴퓨터 구성 예시

밖에서는 노트북(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
2
3
umask 077 # 생성될 키의 퍼미션 설정, 생략해도 정상적으로는 작동
wg genkey > privatekey # 개인키 생성
wg pubkey < privatekey > publickey # 개인키를 이용하여 공개키 생성

개인키와 공개키를 성공적으로 생성했다면 다음과 같이 base64형태의 문자열이 저장된 것을 확인할 수 있습니다.

1
2
3
pngwna@ArchPngWnA ~/sandbox % cat privatekey publickey 
AOQ/mKof+blb60wF4nxMqM2i1CKmVwLunNbUwOZi93s=
zVXVrTkaOHI9WqnEHJyxdewt1fYRWxCHObIJ3jDtI2A=

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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[Interface]
Address = 10.0.0.1/32
SaveConfig = true
ListenPort = 7777
PrivateKey = ------------------------------------------ # 위에서 생성한 서버(10.0.0.1)의 개인키

[Peer]
PublicKey = ----------------------------------------- # 학교 서버(10.0.0.2)의 공개키
AllowedIPs = 10.0.0.2/32
PersistentKeepalive = 15

[Peer]
PublicKey = ----------------------------------------- # 학교 PC1(10.0.0.4)의 공개키
AllowedIPs = 10.0.0.4/32

[Peer]
PublicKey = ----------------------------------------- # 외부 PC2(10.0.0.5)의 공개키
AllowedIPs = 10.0.0.5/32

...

[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
2
3
4
5
6
7
8
9
[Interface]
Address = 10.0.0.2/32
PrivateKey = ----------------------------------------- # 외부 PC2(10.0.0.2)의 개인키

[Peer]
PublicKey = ------------------------------------------ # 위에서 생성한 서버(10.0.0.1)의 공개키
AllowedIPs = 10.0.0.0/8 #10.x.x.x에 해당하는 패킷은 전부 이 피어로 전달
Endpoint = 58.142.x.x:7777 # 서버 IP : 위에서 설정한 ListenPort
PersistentKeepalive = 15 # 15초마다 keepalive 패킷 전송

[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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
root@Polaris$ sudo wg

interface: wgserver
public key: RamenwxjwwmCp7z6uGxHCW7nFWOwRs1UMNanhJNCpiw=
private key: (hidden)
listening port: 7777

peer: LabFLZped7Cv9CDjU6SQudVH/Al+AihNLjvKuIRiG2E=
endpoint: 163.152.x.x:41164
allowed ips: 10.0.0.4/32
latest handshake: 44 seconds ago
transfer: 22.08 MiB received, 110.19 MiB sent

peer: gram/SUGOPwbZq0ggN42XlMROAxyP8ZIey9XEhObUW4=
endpoint: 163.152.x.x:41621
allowed ips: 10.0.0.5/32
latest handshake: 53 seconds ago
transfer: 18.06 MiB received, 93.89 MiB sent

peer: Home75VA21rBOQUX+TyHT2TCzY7Q/7e7byTWSQosPAE=
endpoint: 192.168.x.x:59810
allowed ips: 10.0.0.3/32
latest handshake: 1 minute, 1 second ago
transfer: 131.61 MiB received, 29.96 MiB sent

peer: KUAAA7/P6IPRSMw/aMEvbVw406ok0j1AU8ENf+A85U0=
endpoint: 163.152.x.x:60520
allowed ips: 10.0.0.2/32
latest handshake: 1 minute, 32 seconds ago
transfer: 43.73 MiB received, 6.32 MiB sent
persistent keepalive: every 15 seconds

클라이언트에서도 마찬가지로 wg 명령어를 사용하여 터널링 상태를 확인할 수 있습니다.

1
2
3
4
5
6
7
8
9
10
11
12
pngwna@ArchPngWnA ~/sandbox % sudo wg

interface: wg0
public key: gram/SUGOPwbZq0ggN42XlMROAxyP8ZIey9XEhObUW4=
private key: (hidden)
listening port: 41621

peer: RamenwxjwwmCp7z6uGxHCW7nFWOwRs1UMNanhJNCpiw=
endpoint: 58.142.x.x:7777
allowed ips: 10.0.0.0/8
latest handshake: 45 seconds ago
transfer: 107.30 MiB received, 28.72 MiB sent

wireguard가 제대로 설정된 것 같으면 다음과 같은 명령어로 컴퓨터 시작시 항상 실행되게 설정합시다.

1
systemctl enable wg-quick@wg0.service

(wg-quick@ 뒤에는 설정파일이름.service와 같은 형태로 입력하면 됩니다)

위와 같이 설정하면 컴퓨터간 wireguard VPN 터널링을 정상적으로 활용할 수 있습니다.

참고

vanity key

wg genkey로 생성되는 키는 보통 의미 없는 base64 문자열이지만 계속 키를 생성하다보면 의미있는 문자열이 나올 수 도 있습니다.

wireguard vanity keygen을 이용하면 본인이 원하는 문자열로 시작하는 공개키(예시: Home75VA21rBOQUX+TyHT2TCzY7Q/7e7byTWSQosPAE=) 를 생성할 수 있습니다.

Reference