経緯
怪しいWi-Fi対策したいし、外から自宅サーバにアクセスできたら便利だろうなー。いつかVPN張りたいなーと思い続けてはや数年。
休職をきっかけに親から海外旅行に誘われ、海外のWi-Fi怖い!という気持ちから重い腰を上げました。
あと、旅行中も日本のアマプラでアニメ見たい。
やりたいこと
クライアント(主にスマホ)
↓
【VPN】
↓
OCI(踏み台)
↓
【VPN】
↓
自宅サーバ
↓
自宅NW & インターネット
要件
無料かつ今あるものを使って構築しようというエコノミーな発想です。
-
VM.Standard.E2.1.Micro
(OCIインスタンス:AMD1コア Oracle Linux9)
AlwaysFreeの範囲で使いたかったので。
Arm?知らない子ですね? -
WireGuard(VPN)
「モバイル通信に強い」「処理が軽い」「設定簡単」
という話を聞いて。 -
自宅サーバ
自宅のファイルサーバです。
OS:Rocky Linux 9.7
CPU:i5 6500
メモリ:20 GB
やったこと
WireGuard(の制御ツール)をインストール
OracleLinuxにWireGuard自体は元から入っていたので、
以下コマンドでWireGuardの制御ツールをインストールします。
sudo dnf install wg-tools
秘密鍵と公開鍵を作成
WireGuardの秘密鍵を作成した後、対応する公開鍵を作成します。
sudo wg genkey | tee private.key #秘密鍵を作成
#(秘密鍵がここに表示される)
sudo cat private.key | sudo wg pubkey | tee public.pub #秘密鍵に対応する公開鍵を作成
#(公開鍵がここに表示される)
これをOCIと自宅サーバ、クライアントの分だけ実施しておきます。
設定ファイルを作成する
OCI側でWireGuardの設定ファイルを作成します。WireGuard用のインターフェース名はwg0としてます。
sudo vi /etc/wireguard/wg0.conf
[Interface]
PrivateKey = [OCIのPrivateKey]
Address = 10.50.0.1/32
ListenPort = 51820
Table = 51820
PostUp = ip -4 rule add from 10.50.0.2/32 table 51820
PostUp = ip -4 rule add from 10.50.0.3/32 table 51820
PostUp = ip -4 route add 10.50.0.0/24 dev wg0
PostUp = sysctl -w net.ipv4.conf.all.rp_filter=2
PostDown = ip -4 rule del from 10.50.0.2/32 table 51820
PostDown = ip -4 rule del from 10.50.0.3/32 table 51820
PostDown = ip -4 route del 10.50.0.0/24 dev wg0
[Peer]
PublicKey = [クライアントのPublicKey]
AllowedIPs = 10.50.0.2/32
[Peer]
PublicKey = [自宅サーバのPublicKey]
AllowedIPs = 0.0.0.0/0
※WireGuard内でのIPアドレスは以下にしています。
- 10.50.0.1:OCI
- 10.50.0.2:クライアント(スマホ)
- 10.50.0.254:自宅サーバ``
自宅サーバ側のwg0.confは以下にしてます。
[Interface]
PrivateKey = [自宅サーバのPrivateKey]
Address = 10.50.0.254/32
PostUp = iptables -t nat -A POSTROUTING -s 10.50.0.0/24 -o eth0 -j MASQUERADE
PostUp = iptables -A FORWARD -i wg0 -o eth0 -j ACCEPT
PostUp = iptables -A FORWARD -i eth0 -o wg0 -m state --state RELATED,ESTABLISHED -j ACCEPT
PostDown = iptables -t nat -D POSTROUTING -s 10.50.0.0/24 -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i eth0 -o wg0 -m state --state RELATED,ESTABLISHED -j ACCEPT
PostDown = iptables -D FORWARD -i wg0 -o eth0 -j ACCEPT
[Peer]
PublicKey = [OCIのPublicKey]
Endpoint = [OCIの実IPアドレス]:51820
AllowedIPs = 10.50.0.0/24
PersistentKeepalive = 25
firewalldの設定
OCI・自宅サーバ共にNATと転送設定をします。
- NAT
firewall-cmd --permanent --zone=public --add-masquerade
- 転送設定
sysctl -w net.ipv4.ip_forward=1
# 一時反映
echo "net.ipv4.ip_forward = 1" | sudo tee /etc/sysctl.d/99-wireguard.conf
sysctl --system
# 永続化
- (OCIのみ)UDPの51820ポートを開けます。
firewall-cmd --add-port=51820/udp --permanent
- wg0をtrustedゾーンに追加
firewall-cmd --permanent --zone=trusted --add-interface=wg0
- 反映
firewall-cmd --reload
VCNの設定
VCNとは、OCI側で用意されている仮想ネットワークのことです。
SSHとPing以外が弾かれるような状態になっているので、WireGuardの通信は通るようイングレス・ルールを追加します。
追加するイングレス・ルール
【外部通信用】
ソースタイプ:CIDR
ソースCIDR:0.0.0.0/0
IPプロトコル:UDP
宛先ポート:51820
【内部通信用】
ソースタイプ:CIDR
ソースCIDR:10.50.0.0/24
IPプロトコル:すべてのプロトコル
WireGuard起動
以下コマンドでwg0を起動します。
wg-quick up wg0
以下も設定しておくと、OCI再起動時、自動で立ち上がるようになります。
sudo systemctl enable wg-quick@wg0
失敗したこと
やったことをつらつらと書きましたが、もちろん順調に行ったわけはなく、合間合間で何度もつまづきました。
なんなら、つまづいて対処してた時間のほうが断然長かった。
つまづいた箇所と対処を備忘録も兼ねて書いていきます。
WireGuardのアドレス帯が、OCIのデフォルトゲートウェイと衝突
【起きたこと】
当初、WireGuardのアドレス帯に10.0.0.0/24を使っていました。
しかし、OCIのデフォルトゲートウェイのアドレスが10.0.0.1だったため、デフォルトゲートウェイ宛の通信もwg0に渡す設定になってしまいました。
結果として、VPNの接続には成功するものの、インターネットへ出ることができない状況となり、それどころかSSHでの接続すらもできなくなってしまったため、復旧に大変手こずることになりました。
【対処】
OCIのコンソールからアクセスし、WireGuardで使用するアドレス帯を10.50.0.0/24に変更しました。
Pingが通らない
【起きたこと】
VPNもつながり、SSHも切れることがなくなったにも関わらず、何故かPingが通らない。
インターネットはおろか、VPN内のデバイスにすら通らない。
【対処】
パケット転送が有効になっていなかったので、以下の設定をOCIと自宅サーバの両方でやりました。
sudo sysctl -w net.ipv4.ip_forward=1
あとがき
記事をのんびりと書いてたら、親の金で行った海外旅行が終わってました。フランス楽しかったです。
僕の中のザッ○ーバーグも「Done is better than perfect!! Done is better than perfect!!」と叫び続けています。
モバイル通信をメインで利用し、旅行自体も結構忙しかったので、VPNの出番はほとんどありませんでした。
ですが、公衆Wi-Fiにアクセスしたときの心理的負担が軽減し、サーバにいつでも繋げるというワクワク感は手に入れたので良しとします。プライスレスです。