水はじめにWireGuardはOpenVPNよりもシンプルで高速、より安全なVPNとして開発が進められており、OpenVPNに代わるVPNとして期待されています。端末間だけでなく拠点間のVPN接続にも対応しています。この記事ではWireGuardを使ってVPNサーバーを構築し、そのVPNサーバーにUbuntuやiPhoneから実際に接続してみるまでの手順をまとめます。前ですがOpenVPNサーバーを構築してUbuntuから接続しようとしたこともありましたが、設定が面倒だったり接続速度が遅かったりで結局使用しませんでした。WireGuardはまず設定がOpenVPNに比べて間違いなく簡単で、速度も十分です。WireGuard公式のクライアントアプリがWindows、macOSに加えてiOS、Anrdoid用も配布されているので簡単に接続できます。cryptography.www.wireguard.comできるようになること構築するシステムイメージ図が以下です。WireGuardを使用してクライアント(PC、スマホ)とサーバー間をVPN接続します。クライアントは全てのトラフィックをサーバー経由にしてインターネットに接続することができます。カフェや空港などの公衆WiFiを使用する場合にも役立ちます。以降ではWireGuardのクライアントを単にクライアント、WireGuardのサーバーを単にサーバーと呼びます。WireGuardのざっくりした仕組みとしては、サーバー側とクライアント側それぞれにWireGuardによるVPN接続用にネットワークインターフェースを追加し、それらを使ってVPN接続します。これらは設定ファイルを作成すれば後はWireGuardがよしなにやってくれます。WireGuardはサーバーで生成した公開鍵をクライアント側で使用し、クライアント側で使用した公開鍵をサーバー側で使用します。そのためサーバー側とクライアント側で並列して作業が必要になります。以下の環境でWireGuardによるVPN接続を構築しました。18.04、iOS(Windows、macOS、Android用の公式クライアントアプリも配布されています。)WireGuardはまだ正式リリースに至っておらず、潜在的なバグを持っている可能性もあります。使用は自己責任でお願い致します。ちなみに、WireGuardの公式ドキュメントでは、設定ファイルの作成をコマンドで順番に行っていく方法が説明されていますが、ここでは最初から設定ファイルを作成してそこに設定内容を記述していく方法を説明しています。やっていること自体は同じになります。18.04を使用します。WireGuardをUbuntuにインストールする以下でWireGuardをインストールします。wireguard以上でWireGuardのインストールが完了です。秘密鍵と公開鍵を作成するWireGuardが使用する秘密鍵と公開鍵を以下のコマンドで同時に生成します。publickey上記を実行すると、実行時のディレクトリにprivatekeyとpublickeyの2つが生成されます。秘密鍵privatekeyは決して誰とも共有してはいけないので、以下で権限を変更しておきます。privatekeyなお、秘密鍵の中身を確認すると以下のようになっています。この値を次の設定ファイルの中で使用します。privatekeyweohtowetu08230j2083j09203k9dALijF3h2KPA=公開鍵は以下です。この値を次の設定ファイルの中で使用します。publickeygeIEmgepi0123noige93jpt482jfALiei=サーバー用のWireGuardの設定ファイルを作成する以降の作業は全てroot権限が必要です。続いて、/etc/wireguardにwg0.confという設定ファイルを作成します。/etc/wireguard/wg0.conf/etc/wireguard/wg0.confの中身を以下のようにします。10.0.0.2/24上記のうち[Interface]はサーバーの設定、Peerはサーバーに接続するクライアントに関する設定になります。[Interface]の設定項目は以下です。この記事ではweohtowetu08230j2083j09203k9dALijF3h2KPA=が該当。VPN用のIPアドレス。WireGuardで構成するVPNにて、サーバー用に使用したい適当なアドレスを設定します。192.168.0.1/24などでもOK。ここでは10.0.0.1/24。WireGuardがListenするポート番号。デフォルトが51820。他のポート番号でもOKですが、後ほどファイアウォールの設定で許可する必要があります。trueにすることでWireGuardの起動時、停止時にこの設定ファイルの内容を保存します。WireGuardの起動直前(PostUp)、停止直前(PostDown)に実行する処理を記述します。ここでは、WireGuardの起動、停止それぞれの直前にiptablesのフォワーディング用の設定を追加しています。上記のiptablesルール内にあるeth0は私のサーバーの外部IP(WAN側IP)を持つインターフェースです。各自置換してください。[Peer]の設定項目は以下です。サーバーに接続するクライアント側で生成した公開鍵。ここではslwtj2o39jAofo428jAPJD8f038j20f=が該当。これはクライアント側で生成するものになります。サーバーへの接続を許可するクライアントのVPN用のIPアドレス。これも次節で説明します。上記を保存して最後に設定ファイルの権限も変更して完了です。wg0.confiptablesもしくはufwでポート番号を許可するiptablesやufw等のファイアウォールを使用している場合は、それらにてWireGuardが使用するポート(UDP)を許可する必要があります。WireGuardのデフォルトのポート番号51820をiptablesで許可する場合は、以下のルールを追加してください。ACCEPTufwの場合は以下でルールを追加できると思います。51820/udpフォワーディングを許可するWireGuardのサーバー側でクライアント側のトラフィックを受けてインターネットに流すには、サーバー側でフォワーディングを有効化しておく必要があります。Ubuntuの場合は、/etc/sysctl.confを編集することでフォワーディングを有効化できます。具体的には/etc/sysctl.confの以下の部分を非コメント化します。先頭の#を消して非コメント化する上記を上書きした後、以下で変更を反映させます。-pこれでフォワーディングが許可されました。WireGuardサーバーを起動、停止するWireGuardサーバーを起動するには、wgコマンドを使用して以下のようにします。/etc/wireguard/wg0.conf以降は以下でも起動できます。wg0上記を実行すると、ネットワークインターフェースとしてwg0が作成され、クライアントからの接続を待機する状態になります。ipコマンドを使用して確認すると、wgが追加されていることを確認できます。downを使用します。18.04をクライアントとして使用します。iOSをクライアントとして使用する場合の方法は後述します。サーバー側で行った作業と同じように以下でWireGuardをインストール、秘密鍵と公開鍵の生成、権限の設定を行います。privatekey秘密鍵の中身を確認します。privatekeySk9joFowprh80DSoehg98Ahgeiywg=公開鍵の中身を確認します。publickeyslwtj2o39jAofo428jAPJD8f038j20f=この値は前節で説明したサーバー側の設定ファイル/etc/wireguard/wg0.conf内の[Peer]のPublicKeyで指定します。クライアント用の設定ファイルを作成するサーバー側と同様にクライアント側でも設定ファイルを作成します。0.0.0.0/0,::/0クライアント側の設定ファイルはサーバー側よりも少ない内容です。以下が[Interface]部分の設定項目です。クライアント側の秘密鍵。ここではSk9joFowprh80DSoehg98Ahgeiywg=が該当。VPN用のIPアドレス。WireGuardで構成するVPNにて、クライアント用に使用したい適当なアドレスを設定します。ここでは10.0.0.2/24。[Peer]部分の設定項目は以下です。サーバー側で生成した公開鍵。ここではgeIEmgepi0123noige93jpt482jfALiei=が該当。接続先となるWireGuardサーバーの外部IP(WAN側IP)。ポート番号も指定する。WireGuard経由にするIPアドレスの範囲。0.0.0.0/0(IP6では::/0)を指定すると、クライアント側の全てのトラフィックをWireGuard宛にします。サーバーを経由させます。ここで10.0.0.0/24のように特定のIPアドレス範囲を指定すれば、そのIPアドレス範囲に含まれる宛先トラフィックのみWireGuardサーバーに転送します。クライアントからサーバーに接続するWireGuardサーバーを起動した時と同じで、wgコマンドを使用して以下のようにします。/etc/wireguard/wg0.conf上記を実行してWireGuardのネットワークインターフェースwg0が作成された時点でサーバーと接続します。試しにサーバー側のVPN用IP10.0.0.1にpingを打てば応答が返ってきます。10.0.0.1また、試しにIPアドレスを表示しくれるWebサイト等にアクセスしてみると、クライアントのIPではなくサーバーのIPが表示されると思います。downを使用します。wg0なお、WireGuardのサーバーとしてVPS等を使用している場合は、必ずVPSに対するトラフィック制限や規約等を確認してください。上記の設定はクライアントのトラフィックを全てサーバー経由にするため、クライアント側で大量にネットワークを使用すると、当然ながらサーバー側でも同じだけネットワークを消費します。公衆WiFiに接続している時だけ使用するようにするなど各自の状況に合わせて使用してください。iPhoneからWireGuardサーバーに接続するiOSとAndroidそれぞれでWireGuardの公式クライアントアプリが用意されています。Storeで検索すると以下のような感じです。これをインストールして起動すると以下のような画面が開きます。tunnel」をクリックして新しいVPN接続を追加します。tunnel」をクリックすると、以下のように設定方法のメニューが表示されます。設定ファイル、QRコード、手動での設定がそれぞれ可能です。code」を選択して開いたカメラで読み取ればOKです。Ubuntuの場合qrencodeはaptでインストールできます。qrencode後は以下で設定ファイルからQRコードを生成します。/etc/wireguard/wg0.confその他のOS用のクライアントアプリについては以下の公式ドキュメントを見てみてください。InstallationInstallationwww.wireguard.comWireGuardの状態を確認するwgコマンドで以下を使用することで追加したWireGuardのネットワークインターフェースのステータスを確認できます。上記までに記載した方法でWireGuardでインターネットに接続できていたものの、誤ってクライアント側のWireGuardの設定ファイルを削除してしまいました。同じ手順で設定し、WireGuardサーバーに接続できたもののWebサイトを表示できない状態になりました。調べてみるとPingは外部にも届いていましたが、DNSサーバーが分からずに名前解決できない状態になっていました。対策としては、クライアント側の設定ファイルに以下のようにDNSを指定する記述を追記しました。0.0.0.0/0,::/0以下でWireGuard用のインターフェースを再起動します。foundというエラーが出る場合があります。configfileこれは、WireGuardが内部で使用しようとしたresolvconfコマンドが見つからないことが原因なので、以下でインストールすれば解決します。wikiに記載れており参考になりました。DNSについての設定がWireGuardの設定ファイルになくても、元々パブリックなDNSサーバーを使っていたり、DNSサーバーについてルーティング設定を行っていればこの状態にはなりませんが念の為メモしておきます。以下の記事が大変参考になりました。servergithub.comまとめWireGuardを使ったVPNサーバーの構築手順と実際にクライアントから接続するまでの手順をまとめました。OpenVPN等に比べて遥かに簡単に構築できます。後で読むサービスのPocketにかなり近く、機能豊富なオープンソースのWallabagをUbuntuにインストールしたのでその手順をまとめます。クラウドストレージは便利な反面、見知らぬ人が自分のファイルを閲覧できてしまったり公開状態になってしまっていたりというバグが発生し得ます。Linuxで端末を使っている時にディレクトリ構造をざっくり確認したり各ディレクトリにどのようなファイルが入っているかを確認したりしたい場合があると思います。コメントをキャンセルメールアドレスが公開されることはありません。virtualiment。