これまでOpenVPNを使って外出先からVPN(トンネル)を張って自宅のNASに接続したり、録画予約をしたり、便利に使ってきました。
これはこれで便利に使えていたのですが、VPNの有効な選択肢としてOpenVPNに比べて高速&堅牢なWireGuardが出てきたので、早速導入してみました。
ここ2か月ほど使ってみましたが、安定して使えることが確認できたので、DockerでWireGuardをインストールする方法について記事にしたいと思います。
非常に簡単にインストールできますし、スマホのアプリ(android/ios)もあるので使うのも難しくありません。
ロゴはダサいけど、いいかんじ!
Contents
VPNとは?
VPN(Virtual Private Network)とは、直訳すると「仮想専用網」です。
簡単に言うと、疑似的な自分専用の通信経路を確保し安全な通信を可能にします。
例えば、駅やカフェにある公衆無線LAN(フリーWi-Fi)では、インターネットに接続するまでの経路で悪意のある第三者が介在し、個人情報の盗聴や通信を改ざんされるリスクがあります。
仮に、信頼のおけるネットワークを使ったとしても、サーバ側で外部(インターネット)に向けてポートを解放している場合、そこからセキュリティ攻撃を受けるリスクがあります。
VPNは端末とサーバの間で 通信を暗号化することにより疑似的に自分専用の通信経路を構築し、第三者の盗聴や改ざんを防ぐことができます。
これにより、サーバ側で直接的にサービスにアクセスするためのポートを解放せずとも安全に通信を実現することができます。
ちなみに、本ブログでは以前にOpenVPNを紹介しています。
WireGuard
WireGuardはLinuxカーネル内のモジュールとして実行されていることから、接続時のネゴシエーションが速い(低遅延)と言われています。
また、VPNの要ともいわれる暗号通信においても、強力な暗号化規格を採用しており、高速かつ堅牢なVPNを実現する新たな選択肢となりました。
OpenVPNでも十分実用的だと言われていた安全性が更に向上し、加えて高速化しているなら、このWireGuardを使わない理由はありません。
ただ、WireGuardはUDPでしかVPN(トンネル)を張ることができないという制約があるので、公衆のWi-Fiから443/TCPで使いたいならOpenVPNということになります。
インストール手順
では早速、WireGuardの導入方法について解説していきます。
Dockerを使ってインストールします。
前提
git、dockerおよびdocker-composeがインストールされていることが前提です。
もし、まだインストールしていない場合はこちらを参照してインストールしましょう。
私のマシンはこれです。
メモリ8GB以上を選択すれば性能的に問題はないと思います。
Windows10マシンですが、私はUbuntuを上書きインストールして自宅サーバを構築しています。
Raspberry Piにも導入できます。
docker-compose.yml
適当な場所に任意のプロジェクト(ディレクトリ)を作成し、その配下にdocker-compose.ymlを作成します。
エディタは何でもOKです。
1 2 3 |
mkdir ~/wireguard cd wireguard emacs docker-compose.yml |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
version: "2.1" services: wireguard: image: linuxserver/wireguard container_name: wireguard cap_add: - NET_ADMIN - SYS_MODULE environment: - PUID=1001 - PGID=113 - TZ=Asia/Tokyo - SERVERURL=komone-life.com #optional - SERVERPORT=51820 #optional - PEERS=1 #optional - PEERDNS=auto #optional - INTERNAL_SUBNET=10.2.93.0 #optional - ALLOWEDIPS=10.29.3.0/24 #optional volumes: - ./config:/config - /lib/modules:/lib/modules ports: - 51820:51820/udp sysctls: - net.ipv4.conf.all.src_valid_mark=1 restart: always |
オリジナルからの修正箇所
10,11行目:ホストのuidとgidを設定。
1 2 |
$ id uid=1001(docker) gid=113(docker) groups=113(docker) |
12行目:ログの時刻などを合わせるためにTZ(Time Zone)を設定。
13行目:ホストのURLを入力。IPアドレス/ドメイン指定が可能。
14行目:WireGuardのUDPポートを指定。デフォルトは58120。25番とか53番なら公衆無線LANからアクセス可能と思われるが、自宅サーバ環境の状況に合わせて設定。
15行目:クライアント(ピア)の数or識別子。整数指定だとピアの数。識別子の場合はカンマ区切りで指定。(例)PEERS=myPC,myPhone,myTablet
17行目:VPN(クライアントに割り当てる)のネットワークアドレスを設定。
18行目:疎通を許可するネットワークを指定。ANYの場合は、0.0.0.0/0を指定するか、この行毎削除。
20行目:WireGuardのコンフィグファイルを共有するパスを指定。
26行目:サーバ起動時にWireGuardも起動させる場合はalwaysを指定。
準備はたったこれだけ。
すばらC!
コンテナ起動
以下のコマンドでコンテナを起動します。
1 2 3 |
docker-compose pull docker-compose build --no-cache docker-compose up -d |
これで、サーバにwireguardが立ち上がりました。
ピア情報
wireguardのクライアントはpeerと呼ばれます。
wireguardクライアントの設定には、peer情報(ピア情報)が必要で、これはサーバ側の/config/配下に生成されます。
peer情報はdocker-compose.ymlで指定した数だけ生成されていて、peerXのXでpeerを識別できます。
スマホのアプリ側の解説は別の記事で紹介したいと思います。
記事にしましたので、参考にしてください。
まとめ
外部から自宅サーバにアクセスする際のVPNの手段として、WireGuardを紹介しました。
WireGuardはOpenVPNよりも高速&堅牢ということが売りとされています。
実際、使ってみましたが接続処理はかなり早かったのが体感でもわかりました。
ただ、WireGuardはUDPでしか使えないそうなので、443番ポートで使う場合は従来のOpenVPNを使うことになりです。
WireGuardとOpenVPNを利用状況に応じて使い分けて活用してください。
よろしければSSLHもどうぞ。
参考になれば幸いです。
(参考)Android&iOSアプリでWireGuardを使う方法
スマホのOSに応じて、以下の記事を参考にしてみてください
コメント
初めまして。
カズです。
先日テレビに関することで調べていたところ小茂根さんのブログを見つけました。
今現在は、Ubuntu20.04にPx-Q3U4を導入し視聴することができています。
これも小茂根さんのおかげだと思っております。ありがとうございます。
そして、今回お聞きしたいことがありコメントさせていただきました。
今現在は、wireguardによるVPN構築に挑戦しているのですが、ネットワーク関連に全然詳しくなく苦戦している状態です。
(環境)
デフォルトゲートウェイ:192.168.11.1
サブネットマスク :255.255.255.0
Ubuntu20.04
IPアドレス(固定) :192.168.11.20
今回は17行目と18行目にあたるこの部分に何を入力すればよいかをお聞きしたくコメントいたしました。
– INTERNAL_SUBNET=10.2.93.0 #optional
– ALLOWEDIPS=10.29.3.0/24 #optional
お忙しいところ恐縮ですがよろしくお願いいたします。
>カズさん
私の記事を参考にしてくださりありがとうございます。
お役に立てて私も嬉しいです。
INTERNAL_SUBNETには、VPNで接続する内部(ローカル)アドレス帯を設定してください(任意のNW)。
自宅のNWと重複しなければ、記事と同じ10.2.93.0でもOKです。
ALLOWEDIPSはVPNで接続した上記NWとアタッチするNWを指定します。
自宅のNWを指定することでVPNで自宅NWのアクセスが可能になり、VPN越しにインターネットに抜けたり自宅のサーバ(録画サーバ等)の参照が可能になります。
例えば、カズさんの自宅で録画サーバを同一NW(192.168.11.*/24)に構築されているなら
– INTERNAL_SUBNET=10.2.93.0 #何でも良い
– ALLOWEDIPS=192.168.11.0/24
で良いかと思います。
こちらの記事を参考にwireguardサーバーの構築を行っていますが、構築完了後、sambaに接続することが出来ません
サーバーの詳細はIPアドレスが192.168.1.15でサブネットマスクは255.255.255.0です
同じ、pcでsambaサーバーが動作しています
こもねさんの記事を参考に
INTERNAL_SUBNET=10.2.93.0
ALLOWEDIPS=192.168.1.0/24
に書き換えました
wireguard起動時には画面上にエラーメッセージ等は表示されません
この状態で、スマホからアプリを使用して接続後、ファイルマネージャでsambaに接続しようとしても接続待のまま、何も応答が有りません
因みに、スマホのwifiをonにすると問題無く接続が完了し、sambaの共有ファイルを確認することが出来ます
それと、sambaの構築についてもこもねさんの記事を参考に構築しておりますが、1点だけsmb.confの中の
interfaces = 127.0.0.0/8 10.29.3.0/24を
interfaces = 127.0.0.0/8 192168.1.0/24に
変更してあります
何か間違えていると思うのですが思い当たる箇所はありますでしょうか?
よろしくお願いします
連続での書き込み申し訳有りません
自己解決しました
お恥ずかしい話ですが、ルーターのポートを開放する番号を間違えていました
ありがとうございました
>金魚さん
亀レスすみませんm_ _m
ご報告ありがとうございます、うまく行ってよかったです:)
こもねさん
初めまして。この記事でWIREGUARDを知り、epgstatinonと同じサーバー内に構築しました。
dockerでは無いのですが、導入後うまくいかずに困っている点があります。ご教授いただければ嬉しいです。
現在VPN接続で外部、ローカル内ともepgstatinon起動の確認ができています。
しかし、今度はVPN接続しないで直接ローカル内からsmbやepgstatinonの接続ができなくなってしまいました。おそらくローカル内でepgstatinonのipアドレスを指定すると、フォワーディングしてVPNサーバーのipアドレスを見に行っているからかと思います。
ローカルとVPN両方からepgstatinonを開く方法はあるでしょうか。
こもねさん、初めまして。
コメントを送信しましたが表示されていないので、再送信させていただきます。連投していたら、申し訳ありません。
こちらの記事でwiregaurdを知り、epgstatinonのサーバーに通常の方法でVPNを導入しました。
なんとか外部からepgstatinonを見れるようにできたのですが、今度はローカル内からepgstatinonが見れず困っています。smbの共有フォルダも見れなくなってしまいました。
epgstatinon、wiregaurdを導入しているサーバー:192.168.1.111
VPNインタフェース:172.16.1.1/32
クライアント:172.16.1.2/24
VPNで接続中は、192.168.1.111でも172.16.1.1でもブラウザからepgstationを見ることができています。
ローカルで接続すると見れない状態です。おそらく192.168.1.111を指定すると172.16.1.1にフォワーディングしているためだと思います。
もし解決方法がわかりましたら、ご教授いただけると嬉しいです。お時間がございましたらコメントよろしくお願いします。
>マサノリさん
あけましておめでとうございます、ブログを見てくださってありがとうございます。
またコメントありがとうございます。
ちょうどいま旅行中のため、返信が遅れてすみません。
コメント内容について何点か確認ですが、
とは、LAN内で確認されたのでしょうか?
その後、VPNを利用したらLAN内から接続しても確認出来なくなったということでしょうか?
VPNでepgstationに接続できているなら、LAN内でもいけそうですが、おかしいですね?
epgstationと同じLAN、もしくは接続可能な「ローカル」ネットワーク(例えば、自宅Wifiとか)から接続していますでしょうか?
ご返信ありがとうございます。連投すみませんでした。
epgstationはwiregaurdを導入する前は、問題なくローカル内で動いていました。
しかし、その後wiregaurdを導入後に確認すると、VPN接続ではepgstationに繋がるのですが、ローカルではsmbやepgstationで192.168.1.111に接続すると、繋がらない状態です。ローカル内のWindowsパソコンからも確認しました。
そちらは問題なく接続出来ていますか。
epgstationには接続できているのでVPNの問題だと思います。
wireguardの設定内容がよく分からないのでピンポイントでの回答がしづらいのですが、
docker-compose.ymlのINTERNAL_SUBNETとALLOWEDIPSに相当するIPアドレスは正しく設定されていますでしょうか?
とありますが、最後の1行はサーバのブラウザから接続できたという事でしょうか?
それとも、クライアント端末のブラウザから接続できたのでしょうか?
VPNのネットワークアドレスは172.16.1.0/24と推察しますが、
LAN上(192.168.1.0/24)にepgstationが構築されている場合は、クライアント端末から172.16.1.1では接続できない想定です。
それが出来てしまっているということは、172.16.1.0/24と192.168.1.0/24のアタッチ設定が正常ではない気がするので、再度ネットワーク設定部分を確認してみてください。
こもね様
現状理由はわかりませんが、SMBとEPGSTATION両方ともローカル、VPNともにクライアント側からの接続が確認できました。理由がわからずムヤムヤしていますが、現状このままの状態で運用したいと思います。お騒がせして、本当に申し訳ありませんでした。
もしかしたらクライアントのスマホをリセットしたからかもしれませんし、使い分けがわかっていないのですが、VPNインターフェースの部分を172.16.1.1/24を172.16.1.1/32に変えたからかもしれません。
また質問して恐縮なのですが、192.168.1.0/24 このようなアドレスの0や/24の使い分けがあまり理解でいておりません。いろいろなサイトを参考にすると/24と/32がありますが、どのような使いわけがあるのでしょうか。また0にするとどのような意味があるか教えていただけないでしょうか。
連投すみません。やはり、また繋がらなくなってしまいました。
サーバーはブラウザから、
192.168.1.111と172.16.1.1から接続できます。
クライアントはVPNからのみ
192.168.1.111の接続ができました。
あれから自分で初期化し、dockerで導入すると、無事に動作させることができました。
やはりご指摘の通り、allowsipsの設定に誤りがあったようです。
ありがとうございました。また参考になる記事楽しみにしてます。
コメント家訓遅くなってすみません。
うまく行ったようで良かったです。
/16とか/24はサブネットマスクですね。
故に、/0と/32は通常設定しない値です。
設定した時にどうなるかは・・・・わかりませんw
最近、仕事が忙しくて更新できていませんが、
暇を見つけてぼちぼち記事を更新しますので、
時々遊びに来てください:)
こんにちは。 CentOS7 でこれをやろうとしてハマりました。
カーネルモジュール wireguard を作ろうとして Debian 系ではないので
作成がうまくいかず wireguard コンテナが動かないようでした。
peer1 ディレクトリが出来ずどこが悪いのか考えていました。
https://github.com/linuxserver/docker-wireguard/issues/87
の記事のように kmod-wireguard を入れて何とかなりました。
>cobonzuさん
はじめまして。
記事を参考にしてくださりありがとうございます。
CentOS7だとkmod-wireguardが必要なんですね!
大変に参考になります:)
感謝!