Skip to Content
Next Hat / ブログ

Nanocl と WireGuard で自分専用のプライベートネットワークを作る

世界中のどこからでも、プライベートネットワークに高速かつ安全にアクセスしたいと思いませんか?外部の VPN サービスに頼りたくない方は、WireGuard と Nanocl を使えば、高度なシステム管理の知識がなくても、自分の VPN サーバーを数分で起動できます。

このガイドでは、次のことを学びます。

  • 任意の Linux マシンに WireGuard VPN サーバーを構築する。
  • Docker と Nanocl を使って、簡単で信頼性の高いデプロイを行う。
  • どこからでも内部サービスに安全に接続する。

Nanocl と WireGuard を組み合わせると、運用の負担を抑えながら、内部サービスを安全に公開、検出できます。

プライバシーを自分で管理できるよう、始めましょう!

前提条件

  • パブリック IP アドレスを持つ Linux サーバー
    • WireGuard VPN を動かし、安全なゲートウェイとして利用します。
  • Docker  がインストール済みであること
    • Docker を使うと、分離されたコンテナでサービスを実行できます。
  • Nanocl がインストール済みであること
    • Nanocl はコンテナのオーケストレーションを簡素化し、プロキシと DNS サーバーを内蔵しています。

Docker をインストールする

お使いの Linux ディストリビューションに対応する、公式の Docker インストールガイド に従ってください。

Nanocl をインストールする

次のコマンドで Nanocl CLI のバイナリーをダウンロードしてインストールします。

curl -fsSL https://download.next-hat.com/scripts/get-nanocl.sh | sh

続いて Nanocl グループを作成し、Nanocl の内部サービスをインストールします。

sudo groupadd nanocl sudo usermod -aG nanocl $USER newgrp nanocl nanocl install

WireGuard をデプロイする(自分専用の VPN)

ここから VPN を構築します。広く使われている linuxserver/wireguard  イメージを利用します。

設定済みの Statefile は Nanocl リポジトリ で提供しています。

作成するユーザーは環境変数から取得します。 次の内容で .env ファイルを作成できます。

WG_USERS=myuser

複数のユーザーはカンマで区切って追加できます。

WG_USERS=user1,user2,user3

以下の 0.18 の Statefile を wireguard.yml として保存し、次のコマンドで適用します。

WG_USERS=myuser nanocl state apply -s ./wireguard.yml

この Statefile のマニュアルは、次のコマンドで表示できます。

nanocl state man -s ./wireguard.yml

ファイルの内容は次のとおりです。

ApiVersion: v0.18 Args: - Name: namespace Kind: String Default: wireguard - Name: puid Kind: String Default: 1000 - Name: pgid Kind: String Default: 1000 - Name: dns Kind: String Default: "1.1.1.1" - Name: config-path Kind: String Default: /opt/containers/wireguard Namespace: ${{ Args.namespace }} Cargoes: - Name: wgsrv PortBindings: 51820/udp: - HostPort: "51820" Dns: # Nanocl replaces $$INTERNAL_GATEWAY with the selected network gateway. - $$INTERNAL_GATEWAY - ${{ Args.dns }} Containers: - Name: wireguard Image: lscr.io/linuxserver/wireguard:latest Cmd: - -c - SERVERURL=$NANOCL_NODE_ADDR sh /init Env: - PUID=${{ Args.puid }} - PGID=${{ Args.pgid }} # Set this to your desired users, they will be created automatically # When the container start # You can add multiple users separated by comma - PEERS=${{ Envs.WG_USERS }} - PERSISTENTKEEPALIVE_PEERS=all HostConfig: CapAdd: - NET_ADMIN Binds: - ${{ Args.config-path }}/config:/config Sysctls: net.ipv4.ip_forward: "1"

名前空間、PUID、PGID、DNS サーバー、設定のパスは、引数として渡して変更できます。たとえば次のように指定します。

WG_USERS=myuser nanocl state apply -s ./wireguard.yml -- --config-path /my/custom/path --puid 1001 --pgid 1001 --dns 8.8.8.8

WireGuard クライアントの設定を取得するには、次を実行します。

cat /opt/containers/wireguard/config/myuser/myuser.conf

設定例:

[Interface] Address = 10.13.13.2 PrivateKey = 4Kgkxcu27g9s69OSYmSbh6jmvu8kCC8h12XxqrI3uH4= ListenPort = 51820 DNS = 10.13.13.1 [Peer] PublicKey = O/xFv4cFdrSok+Ujm9r5J6Laf1PcQv0A4u2T8BWQBQ8= PresharedKey = ZOKnf2Zp30WVuTYgcFO7M0QH5C0c3/XTYqCevC69vOg= Endpoint = 92.161.136.52:51820 AllowedIPs = 0.0.0.0/0, ::/0

この設定ファイルと公式の WireGuard クライアントを使えば、
Windows、Mac、Linux、モバイルなど、任意のデバイスから WireGuard サーバーに接続できます。

内部サービスをデプロイする

Nanocl を使って内部サービスをデプロイできます。
サービスには WireGuard VPN 経由でアクセスします。
例として、HTTP ヘッダーを返すシンプルなサービスをデプロイします。

ApiVersion: v0.18 Namespace: global Cargoes: - Name: deploy-example Containers: - Name: web Image: ghcr.io/next-hat/nanocl-get-started:latest Env: - APP=EXAMPLE Resources: - Name: dns.my-domain.internal Kind: ncdns.io/rule/v0.10 Data: Network: Internal Entries: - Name: my-domain.internal IpAddress: Internal - Name: my-domain.internal Kind: ncproxy.io/rule/v0.15 Data: Rules: - Domain: my-domain.internal Network: Internal Locations: - Path: / Target: Key: global.deploy-example.c Port: 9000

VPN に接続したら、http://my-domain.internal  を開けます。

内部サービス


セキュリティのベストプラクティス

  • ファイアウォールを使い、UDP ポート 51820 へのアクセスを信頼する IP アドレスに制限してください。
  • 秘密鍵は秘密のまま保ち、他人と共有しないでください。
  • Docker、Nanocl、WireGuard のイメージを定期的に更新してください。
  • サーバーのログで不審な活動を監視してください。

問題の解決方法

  • WireGuard コンテナが起動しない場合は、Nanocl のログでエラーを確認してください。
  • ファイアウォールが UDP ポート 51820 の通信を許可していることを確認してください。
  • 設定のパスが存在し、書き込み可能であることを確認してください。
  • nanocl ps と nanocl cargo list --namespace your_namespace で、実行中のインスタンスを確認してください。

構成図

WireGuard の構成図

次のステップ

これで、自分専用の高性能な VPN サーバーができました。このガイドを友人と共有したり、構築できたことを投稿したりして、ほかの人がプライバシーを自分で管理するための手助けをしてください。

最終更新日