LinuxをVPNサーバー化するメモ ~外出先からセキュアに自宅にアクセス~(wireguard)
こんにちは、Rcatです。
今回はVPN接続をやっていきます。
VPN接続とはクライアントとサーバーの間に仮想のトンネルを構築し、サーバー経由で通信を行う技術です。これによって次の2つのことが実現されます。
クライアントとサーバーの間で暗号化通信が行われる
クライアントから出た瞬間からサーバーに入るまでの通信が暗号化されます。自作のWebサーバーがhttpだったとしてもセキュア
通信を覆うVPNトンネルが暗号化されているため、暗号化通信になる。フリーwi-fiなどで安全な通信ができる
パスワードの設定されていないフリーwi-fiは電波そのものが暗号化されていません。つまり、何らかの傍受システムを作ってしまえば、内容を盗み見ることが可能です。
しかし、VPNは端末から出た瞬間からなので、電波が暗号化されていなくてもデータ自体が暗号化されているので、傍受されても中身を見ることができません。
まぁ使わないのが一番ですが。
サーバー側のローカルネットワークにアクセスできる
自宅にいる時と同じようにローカルIPアドレスを使って周辺機器にアクセス可能です。
もうポート開放をしなくていいのです。
この特徴を生かして、外出先から自作のシステムにアクセスしたいと考えています。
ちなみに自宅にアクセスするという点で、ポート開放との違いは次の通りになります。
暗号化の有無
今までの自作システムは全て平文通信なので暗号化されていません。
VPNにすることにより暗号化されます。自宅の全ての機器にアクセスできる
ポート開放の場合は個別にマッピングする必要がありましたが、VPNの場合、自宅にいるのと同じ状態になるので全ての機器に接続可能です。
ポート開放を削減することで、セキュリティの向上と工数削減が期待できます。
というわけで、自作のシステムにポート開放なしでVPN経由でアクセスするというのを目標に進めていこうと思います。
前提
サーバー
24H稼働で使用しているLinuxを使います。詳しくはこちら
VPNソフト
wireguardを使います。
クライアントはAndroid前提なので、それ用のアプリがあることで選びました。
サーバー側
まずはサーバー側の環境を整えていきます。
途中でクライアントの情報も必要になるので、同時に進めてください。
インストール
以下のコマンドでwireguardのインストールを行います。
sudo apt install wireguard
鍵の作成
まずは秘密鍵を作成します。
以下のような感じで秘密鍵が作成されます。メモしておきましょう。
※今回は入出力の例として鍵をそのまま書いてますが、絶対に公開しないようにしてください。
# wg genkey
ODRKwRhGTO/n2E/1M6VOFFld4Q8QE7bb5HAEYfbvmUI=
次に公開鍵を作成します。
wg pubkeyコマンドで作成します。このコマンドは標準入力から秘密鍵を入力し、公開鍵を作るそうです。
なので、エコーで表示したものをパイプで入力してみました。
# echo ODRKwRhGTO/n2E/1M6VOFFld4Q8QE7bb5HAEYfbvmUI= | wg pubkey
lUV+mGOYU5O9+zNtCPQu0ljWLx/2YTh/76wovKva9RQ=
サーバー設定の作成
/etc/wireguardディレクトリに移動し設定を作成します。
設定ファイルを名前はインターフェースの名前と同じにするとのことで、調べた通りにwg0としておきます。なのでパスは以下になります。
/etc/wireguard/wg0.conf
/etc/wireguard# vi /etc/wireguard/wg0.conf
中身は以下のように記述します。
サーバー側秘密鍵
最初に作ってメモした秘密鍵です。ここに貼り付けます。サーバー側のインターフェースIPアドレス
調べてみると大体10.0.0.1が多いです。今回復習も兼ねて別のマシンでやってるので+10してます。サーバーのネットワークデバイス名
ip routeやifconfigなどのコマンドで事前に調べておきます。
調べるサイトによってこの行の有無が違うのですが、これはローカルネットワークに対して接続可能にするために必要です。
今回の目的であるセキュアに自宅にアクセスするを達成するために必要です。クライアントの公開鍵
次のセクションのスマホ側でもキーの生成を行います。
その時生成したキーをここに貼り付けます。なので、同時進行でクライアントのセクションも進めてください。クライアントに割り当てるIPアドレス
特に理由がなければサーバー側+1でいいでしょう。
[Interface]
PrivateKey =
Address = 10.0.0.11/32
ListenPort = 51820
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o enp1s0 -j MASQUERADE
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o enp1s0 -j MASQUERADE
[Peer]
PublicKey =
AllowedIPs = 10.0.0.12/32
デバイス名は以下のように検索できます。defaultと書いてある行です。
ローカルネットワークへのルーティング許可
自宅内のネットワークにアクセスするために必要な設定です。
以下のコンフィグファイルの書き換えます。
#vi /etc/sysctl.conf
下記で示している部分がコメントになっているので、コメントアウトを解除してください。
変更を反映
# sudo sysctl -p
net.ipv4.ip_forward = 1
VPNサーバーの起動
systemdを使って管理します。
"wg-quick"コマンドに対して"@"を挟んで今回作った"wg0"をくっつけたコマンドで実行を行います。
/etc/wireguard# sudo systemctl enable wg-quick@wg0
Created symlink /etc/systemd/system/multi-user.target.wants/wg-quick@wg0.service → /lib/systemd/system/wg-quick@.service.
/etc/wireguard# sudo systemctl restart wg-quick@wg0
クライアント(スマホ)側
アプリのインストール
スマホ側は専用のアプリがあるので、それをダウンロードします。
設定の作成
指示通りプラスボタンを押して作成画面に入ります。
以下のようにアプリの設定を行ってください。
一部サーバーの情報が必要なので、同時進行でやっていきましょう。
エンドポイントについては、自宅のグローバルIPアドレスを入力します。
私は動的IPなので、DDNSを使用しているため、ホスト名を入力しています。
実はこの24時間PCこのDDNSを更新するのが一番最初の目的だったりします。
その他の準備
ポート開放
VPNサーバーへのアクセスが必要なので、ポートは開けておきましょう。
マッピングするのにマシンがローカルIPアドレスが必要なので固定しておきましょう。
私の場合はルーターでMACアドレスを使って固定できるのでそっちでやってます。
接続する
接続する
準備が整ったら接続していきます。
wi-fiを切断してモバイルデータ通信に切り替えます。
右上のボタンを押して起動します。
アンテナマークの横にVPNのマークがつきましたね。うまくいっていればこれでVPN接続が完了しているはずです。
接続の確認
本当に接続できているのかを確認してみましょう。
今回は自作のwi-fiMP3プレイヤーにモバイルデータ経由でアクセスします。
というわけで、MP3プレイヤーのローカルIPアドレスを入力して実行。
画面が表示されましたので、うまくいったみたいです。
右側のアンテナマークがモバイルで、アドレスバーがローカルIPというなかなか面白い表示になってますね。上手く行ったようです。
まとめ
今回はwireguardによるVPN接続を行いました
これで外出先でもセキュアに自作システムにアクセスすることができますね!
それではまたお会いしましょう
情報が役に立ったと思えば、僅かでも投げ銭していただけるとありがたいです。