Skip to content

自宅とクラウド間Wireguardの設定方法

Posted on:August 11, 2023 at 10:55 AM

目次

概要

自宅はマンション回線であり、グローバルIPを持っていないため、自宅にサーバーを持っても外部に公開できない。

そこで、外部公開をするためにGCPのVMを借りて、VMへのアクセスをルーティングしVPN経由で通信を受け取れるようにするようにした。

この記事のゴール

GCPで立てたインスタンスへの特定のポート(80, 443, 25565)の通信を自宅サーバーにルーティングできる状態

インフラ構成

wireguardのセットアップ

VM側設定

wireguardのインストール

sudo su -  # sudo はだるいのでrootになっておく
apt update
apt install wireguard

鍵の用意

wg genkey | sudo tee /etc/wireguard/server.key
sudo chmod 600 /etc/wireguard/server.key
sudo cat /etc/wireguard/server.key | wg pubkey | sudo tee /etc/wireguard/server.pub
sudo chmod 600 /etc/wireguard/server.pub

Wireguardのコンフィグのため、ネットワークインターフェースを確認しておく

ip aが以下の結果であれば、ens4がネットワークインターフェースとなる。

GCPでは割り当てられたグローバルIPからさらにルーティングされて10.x.x.xにパケットが送られてくるようになっている(と思っている).

$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
~~~
2: ens4: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1460 qdisc mq state UP group default qlen 1000
    link/ether 42:01:0a:92:00:02 brd ff:ff:ff:ff:ff:ff
    altname enp0s4
    inet 10.x.x.x/32 brd 10.146.0.2 scope global dynamic ens4
       valid_lft 3545sec preferred_lft 3545sec
    inet6 fe80::4001:aff:fe92:2/64 scope link
       valid_lft forever preferred_lft forever

wireguardのconfigを編集する

コンフィグファイルは/etc/wireguard/wg0.conf

wg0の部分は自分の好きなインターフェース名にして良い。

iptablesについては、Wireguardのネットワークインターフェスからens4へ抜けていく通信と、その逆の通信を許可する設定.

PostUpはwireguardを起動する時に実行するもので、PostDownはWireguardを落とす時に実行するもの。

[Interface]
PrivateKey = (サーバーの秘密鍵)
Address = 10.0.0.1
ListenPort = (利用するポート)
PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -A FORWARD -o %i -j ACCEPT; iptables -t nat -A POSTROUTING -o ens4 -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -D FORWARD -o %i -j ACCEPT; iptables -t nat -D POSTROUTING -o `ens4` -j MASQUERADE
[Peer]
PublicKey = (クライアントの公開鍵)
AllowedIPs = 10.0.0.2/32

パケットのフォーワーディングを許可しておく

/etc/sysctl.confを以下の通りに変更

- # net.ipv4.ip_forward=1
+ net.ipv4.ip_forward=1

以下で適用

sysctl -p

systemd管理にして再起動時なども自動で起動するように

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

自宅側設定

control-planeだけ設定する

wireguardインストール

apt install wireguard

鍵の準備

wg genkey | sudo tee /etc/wireguard/client.key
sudo chmod 600 /etc/wireguard/client.key
sudo cat /etc/wireguard/client.key | wg pubkey | sudo tee /etc/wireguard/client.pub
sudo chmod 600 /etc/wireguard/client.pub

コンフィグファイル

以下の設定だとAllowedIPsが0.0.0.0なので、LAN内の環境でなければ全ての通信がwireguard経由で行われるようになる。

この後設定するiptablesによるgatewayからのルーティングには好都合なのでこの設定にした。

[Interface]
PrivateKey = (クライアントの秘密鍵)
Address = 10.0.0.2 (クライアントのIPアドレス)

[Peer]
PublicKey = (サーバーの公開鍵)
EndPoint = (サーバーのIPアドレス(グローバルな方)):(ポート)
AllowedIPs = 0.0.0.0/0,::/0
PersistentKeepAlive = 30

なお、10.0.0.0/24だけをwireguard経由にしたい場合、以下のようにすれば良い。

AllowedIPs = 10.0.0.0/24

また、以下のサイトで特定のIPレンジをブラックリスト方式でAllowedIPsから外す設定ができるようだ(自分は失敗したので使ってない) https://www.procustodibus.com/blog/2021/03/wireguard-allowedips-calculator/

systemd管理にして再起動時なども自動で起動するように

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

gatewayからcontrol-planeに通信を流す

さらに、gatewayに来た通信をcontrol-planeに流したいので、iptablesを使ってそれを実現する。

vm(gateway)のみ設定を行う

iptablesの設定

設定の永続化の準備

Debian 11特有かは全く検証していないが、iptablesをまず永続化させる必要があったため、以下のパッケージを入れる

apt install iptables-persistent

すると、以下のように永続化されたコンフィグが生成される

$ ls /etc/iptables
/etc/iptables/rules.v4
/etc/iptables/rules.v6

iptablesのコンフィグ

nat項目に以下の設定を追加。ens4は各々のグローバルに面したネットワークインターフェースに書き換える。

10.0.0.2は自宅サーバーへのip addressとなっている。

# Generated by iptables-save v1.8.7 on Sat Jul 15 10:24:33 2023
*filter
~~~
*nat
~~~
+ -A PREROUTING  -p tcp -i ens4 --dport 80 -j DNAT --to-destination 10.0.0.2:80
+ -A PREROUTING  -p tcp -i ens4 --dport 443 -j DNAT --to-destination 10.0.0.2:443
+ -A PREROUTING  -p udp -i ens4 --dport 25565 -j DNAT --to-destination 10.0.0.2:25565
+ -A PREROUTING  -p tcp -i ens4 --dport 25565 -j DNAT --to-destination 10.0.0.2:25565

COMMIT

あとは適当に自宅サーバーでnginxを立てて、80, 443, 25565をlistenしておき、外部からgatewayのIPを叩くとルーティングされるはず。

参考文献