🐙

WireGuardで簡単にVPNを構築する

に公開

何かと、VPNを利用したい、構築したい時ってあると思います。今回は自宅でのハニーポット運用のために構築したので今後のためにも記録しておきます。

この記事は、自宅で運用するハニーポットシリーズ#1 です。

WireGuardってなに

OpenVPNやIPsecと比較して、簡単に設定できること、暗号強度が高いことを目指して設計されたOSSのVPNソフトです。

環境

  • AWS EC2
  • t2.micro
  • Ubuntu 24.04.3
  • インスタンスにElastic IPをアタッチ

やること

  • インストール
  • 起動設定
  • サーバ設定
  • 鍵の生成
  • クライアント設定
  • 起動
  • ルーティング設定

インストール

まず、インストールが簡単ですね。aptで入れるだけです。

sudo apt update
sudo apt upgrade
sudo apt install wireguard

起動設定

立ち上げ時に自動で立ち上がるようにします、ソフトウェアの起動状況を確認します。

sudo systemctl status wg-quick@wg0

○ wg-quick@wg0.service - WireGuard via wg-quick(8) for wg0
     Loaded: loaded (/usr/lib/systemd/system/wg-quick@.service; disabled; preset: enabled)
     Active: inactive (dead)
       Docs: man:wg-quick(8)
             man:wg(8)
             https://www.wireguard.com/
             https://www.wireguard.com/quickstart/
             https://git.zx2c4.com/wireguard-tools/about/src/man/wg-quick.8
             https://git.zx2c4.com/wireguard-tools/about/src/man/wg.8

マシンの立ち上げ時に自動で立ち上げるようにします。

sudo systemctl enable wg-quick@wg0

VPN設定ファイル作成

sudo vim /etc/wireguard/wg0.conf

以下の設定を貼り付けます。

[Interface]
PrivateKey = サーバの秘密鍵
Address = 10.0.0.1 (サーバに割り当たってるプライベートIP)
ListenPort = 51820
 
[Peer]
PublicKey = クライアントの公開鍵
AllowedIPs = 192.168.100.10/32
PreSharedKey= 事前共有鍵
  • [Interface] はVPNサーバに関する設定をします。
  • Address はEC2のNICに割り当てるプライベートIPを指定します。
  • ListenPort は使用するポートを指定します。
  • [Peer] はVPNに接続するクライアントの設定をします。
  • AllowedIPs はクライアントに割り当てるプライベートIPを指定します。

必要な鍵

  • PrivateKey はサーバで生成した秘密鍵を設定します。
  • PublicKey はクライアントで生成した公開鍵を設定します。
  • PreSharedKey は事前共有鍵を設定します。この値がクライアントから接続する際に必要になります。

鍵の生成

wg genkey | sudo tee /etc/wireguard/server_primary.key
sudo cat /etc/wireguard/server_primary.key | wg pubkey | sudo tee /etc/wireguard/server_primary.pub
sudo wg genpsk | sudo tee /etc/wireguard/client01_shared.key

これらによって鍵が生成されます。

秘密鍵 /etc/wireguard/server_primary.key
公開鍵 /etc/wireguard/server_primary.pub
事前共有鍵 /etc/wireguard/client01_shared.key

権限をroot以外読み取り・書き込みできないように設定します。

sudo find /etc/wireguard/ -type f -exec chmod 600 {} +

クライアントの設定

VPNに接続するクライアントの設定を行います。

[Interface]
PrivateKey = クライアントの秘密鍵(アプリでは自動生成)
Address = 192.168.100.10/32

[Peer]
PublicKey = サーバの公開鍵
AllowedIPs = 0.0.0.0/0,::0
Endpoint = EC2のグローバルIP:51820
PreSharedKey = 事前共有鍵

この際、クライアントの公開鍵も表示される。

鍵の設定

sudo vim /etc/wireguard/wg0.conf

先ほど作成したサーバのwg0.confの鍵を更新します。
※多くのサイトではクライアントの鍵もサーバ側で生成する手順が紹介されますが、鍵の管理の原則に従ってクライアントの秘密鍵はクライアントで生成しています。

セキュリティグループ設定

セキュリティグループの設定では

  • プロトコル: UDP
  • ポート: 51820
  • AnyIPか接続するクライアントのグローバルIPを指定し、許可します。

起動

sudo systemctl start wg-quick@wg0
sudo systemctl status wg-quick@wg0

起動状態を確認できます。
クライアントから接続してみます。

sudo wg show

転送量などが表示されます。

ルーティング設定

sudo vim /etc/sysctl.conf
#net.ipv4.ip_forward=1

#を外して、設定を有効化する。

sudo sysctl -p

これで設定を反映します。

また、interfaceの設定項目に wg0を経由した通信をACCEPTするとともに、enX0から出るパケットをサーバのIPで書き換えます。

sudo vim /etc/wireguard/wg0.conf
[Interface]
----- 省略 -----
PostUp = iptables -t nat -A POSTROUTING -o enX0 -j MASQUERADE; iptables -A FORWARD -i wg0 -j ACCEPT; iptables -A FORWARD -o wg0 -j ACCEPT
PostDown = iptables -t nat -D POSTROUTING -o enX0 -j MASQUERADE; iptables -D FORWARD -i wg0 -j ACCEPT; iptables -D FORWARD -o wg0 -j ACCEPT

[Peer]

enX0はネットワークのインターフェース名です。必要に応じて

ip a

などで確認して変更してください。
この時点で、クライアントがすべての通信をVPN経由で送受信できるようになります。

ユースケース

  • 大人数が接続するVPNサーバであれば普通に契約するよりも低コストかもしれません。
  • EC2の無料枠内で運用できます。
  • 外出先や海外からスマホから利用しても良いのではないでしょうか。
  • AWSのIPが出口になるので、たまにブロックされます。

自宅で運用するハニーポットシリーズ#2 ではTPotの構築を行います。

Discussion