広告 デバイス

【解説】VPS+VPN(WireGuard)による自宅サーバの公開方法(ルーティング設定編)

※本ページには、プロモーション(広告)が含まれています。

悩んでいる人

WireGuardでVPN環境を構築したけど、外出先から自宅のLAN内にアクセスできない。

解決方法を教えて欲しい。

こんなお悩みを解決します。

今回は、VPS+DockerによりWireGuard環境を構築している前提で話を進めます。

VPSを利用したい方やDockerによるWireGuard環境の構築方法を知りたい方は、以下の記事を参考にしてください。

あわせて読みたい
【解説】VPS+VPN(WireGuard)による自宅サーバの公開方法を分かりやすく解説!(VPS契約編)

続きを見る

あわせて読みたい
【解説】VPS+VPN(WireGuard)による自宅サーバの公開方法(VPN設定編)

続きを見る

外出先から自宅のLAN内へのアクセス方法について、必要な設定を順番に解説していきますので、興味がある方はぜひ最後までご覧ください。

現状整理と対応方針

現状のネットワーク構成を再確認した上で、今回のお悩みに対する対応方針を解説します。

現状整理

現状、以下のような形で、VPN Serverに対し、VPN Client(スマホ、自宅サーバ1)が接続できている状態を前提とします。

前提とするネットワーク構成

補足となりますが、VPS(VPN Server)のiptablesの設定として、以下を追加することで、クライアント同士の通信が行えるようになります。

iptables -A FORWARD -i wg0 -o wg0 -j ACCEPT

対応方針

対策として、以下の2点を実施し、自宅のLAN内へアクセスする方法を解説します。

  • VPS(VPN Server)と自宅サーバ1(VPN Client2)間の通信をアドレス変換により、取り次ぎます。
  • 自宅サーバ1(VPN Client2)をLAN内のネットワークにも所属させ、LAN内へのアクセスを可能にします。

イメージを持ってもらうために、スマホ(VPN Client1)、VPS(VPN Server)、自宅サーバ1(VPN Client2)間の通信内容を図解しました。

アドレス変換による中継処理の図解

上記のうち、VPS(VPN Server)と自宅サーバ1(VPN Client2)のそれぞれで、アドレス変換による通信の取次ぎを行います。

構築するネットワークの全体構成

最終的なネットワークの全体構成は、以下のようになります。

今回構築するネットワークの全体構成

上記の図だけでは、通信イメージがしづらいと思うので、スマホから自宅サーバ2のNginx(192.168.11.2:80)にアクセスした場合を例に取り上げ、解説します。

事例イメージ:スマホから自宅サーバ2のNginxまでの経路

スマホからリクエストを出した後、Nginxに届くまでの経路は以下のようになります。

まず、スマホ(VPN Client1)からVPS(VPN Server)にリクエストが届きます。

事例イメージ(スマホ-VPS)

次に、VPS(VPN Server)で、届いたリクエストに対するアドレス変換を行い、自宅サーバ1(VPN Client2)に転送します。

事例イメージ(VPS-自宅サーバ1)

最後に、自宅サーバ1(VPN Client2)からLAN内の通信を経て、Nginx(192.168.11.2:80)にリスエストの処理を依頼します。

事例イメージ(自宅サーバ1-Nginx)

以上のステップを経て、スマホからNginxに向けてリクエストを流すことができます。

以降では、実際にiptablesを修正し、上記を実現する方法について解説します。

事前準備

今回もDockerを用いて環境構築を行っていきます。

Dockerの環境構築がまだの方は、以下の記事を参考にセットアップを済ませておいてください。

あわせて読みたい
【解説】VPS+VPN(WireGuard)による自宅サーバの公開方法(VPN設定編)

続きを見る

環境構築の詳細

今回は、以下の条件で環境構築を行います。

カテゴリ項目
スマホ(VPN Client1)VPN ClientのIPアドレス10.1.2.4
VPS(VPN Server)VPN ServerのIPアドレス10.1.2.1
自宅サーバ1(VPN Client2)VPN ClientのIPアドレス10.1.2.3
VPN Server経由で通信するIPアドレス(Docker ContainerのIPアドレス)10.0.20.2
Nginx(Web)LAN内でのIPアドレス192.168.11.2
待ち受ける際のポート番号80
構築環境の詳細情報

VPS(VPN Server)の設定更新

ここでは、以下の2点に対応し、VPN Serverの設定を更新します。それぞれ順に説明していきます。

  • VPN Server構築時の環境変数(WireGuard)の追加・更新を行う。
  • iptablesを設定する。

また、該当するコードは、GitHubの下記に保存してあります。git cloneして利用してください。

https://github.com/yuruto-free/vpnaccess-wireguard-nginx/tree/v0.2.0

環境変数の追加・更新

環境変数としてSERVER_ALLOWEDIPS_PEER_LocalServerを追加し、PEERSを修正します。

追加・修正後のenvs/wireguard/.envは以下のようになります。

SERVERURL=example.vpn.com
SERVERPORT=51820
PEERS=PublicServer,LocalServer,myPhone # ←修正箇所
PEERDNS=8.8.8.8,10.1.2.1
INTERNAL_SUBNET=10.1.2.0/24
MTU=1380
KEEP_ALIVE=10
ALLOWEDIPS=10.1.2.0/24
SERVER_ALLOWEDIPS_PEER_PublicServer=10.0.16.0/24
SERVER_ALLOWEDIPS_PEER_LocalServer=10.0.20.0/24 # ←追加箇所

iptablesの設定

wireguard/iptables_scriptに移動し、conf.up.dconf.down.dにアドレス変換用の設定ファイルを作成し、保存します。

この設定が間違っていると通信できないため、環境に合わせて設定する際は十分注意してください。

ただ、全体像のイメージがつかめないと設定もしづらいと思うので、これから設定する内容を図解したいと思います。

まず、アドレス変換の全体像は以下のようになります。

アドレス変換の遷移詳細

そして、VPS(VPN Server)では、次のようなアドレス変換を行うことになります。

項目IPアドレスポート番号
変換前192.168.11.2/3280/tcp
変換後10.0.20.2/3280/tcp
アドレス変換による対応表(VPN Server)

conf.up.dに格納するconfファイルの内容

「アドレス変換による対応表」の内容をiptablesの設定コマンドで表現すると以下のようになります。

iptables -t nat -A PREROUTING -p tcp -d 192.168.11.2/32 --dport 80 -j DNAT --to-destination 10.0.20.2:80

後は、10.0.20.2/24に対するIP Masqueradeの設定も含めたコマンドをconf.up.d/02-routing-lan-access.confに保存します。

この段階で、conf.up.d/02-routing-lan-access.confは以下のようになっていることを確認してください。

iptables -t nat -A PREROUTING -p tcp -d 192.168.11.2/32 --dport 80 -j DNAT --to-destination 10.0.20.2:80
iptables -t nat -A POSTROUTING -d 10.0.20.0/24 -j MASQUERADE

conf.down.dに格納するconfファイルの内容

conf.down.dは、ルール削除時のコマンドを記載すればよいので、以下の内容をconf.down.d/02-routing-lan-access.confに保存します。nat -Dとなっている点に注意!

iptables -t nat -D PREROUTING -p tcp -d 192.168.11.2/32 --dport 80 -j DNAT --to-destination 10.0.20.2:80
iptables -t nat -D POSTROUTING -d 10.0.20.0/24 -j MASQUERADE

VPS(VPN Server)側で必要な設定は以上となります。

VPN Serverの起動

下記のコマンドを実行し、VPN Serverを起動します。

./wrapper.sh start

問題なく起動したら、下記のコマンドを実行し、先ほど追加したコードが出力されていることを確認してください。

./wrapper.sh logs
[#] iptables -A FORWARD -i wg0 -j ACCEPT; iptables -A FORWARD -o wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth+ -j MASQUERADE; iptables -A FORWARD -i wg0 -o wg0 -j ACCEPT
[#] /config/iptables_script/postup.sh
[#] - /config/iptables_script/conf.up.d/01-forwarding-to-public-server.conf
[#]   iptables -t nat -A POSTROUTING -d 10.0.16.0/24 -j MASQUERADE
[#] - /config/iptables_script/conf.up.d/02-routing-lan-access.conf
[#]   iptables -t nat -A PREROUTING -p tcp -d 192.168.11.2/32 --dport 80 -j DNAT --to-destination 10.0.20.2:80
[#]   iptables -t nat -A POSTROUTING -d 10.0.20.0/24 -j MASQUERADE

また、同時にwireguard/peer_LocalServer/peer_LocalServer.confwireguard/peer_myPhone/peer_myPhone.confというファイルが生成されていると思います。

それぞれ、VPN Client1(peer_myPhone.conf)、VPN Client2(peer_LocalServer.conf)で利用します。

スマホ(VPN Client1)の設定

スマホにWireGuardのアプリをインストールしてください。

Android版をダウンロード

iPhone版をダウンロード

そして、PC上でpeer_myPhone.confを開き、下記を修正します。

[Interface]
Address = 10.1.2.4
PrivateKey = 
ListenPort = 51820
MTU = 1380
DNS = 8.8.8.8,10.1.2.1
[Peer]
PublicKey = 
PresharedKey = 
Endpoint = example.vpn.com:51820
AllowedIPs = 10.1.2.0/24,192.168.11.0/24 # ← 192.168.11.0/24を追加
PersistentKeepAlive = 10

上記の変更により、192.168.11.0/24にアクセスする際はVPNを用いて接続することとなります。

後は、メールやNAS経由で上記の設定ファイルをスマホに送り、アプリ側から読み込みます。

自宅サーバ1(VPN Client2)の設定

自宅サーバ1(VPN Client2)では、以下のコードを利用します。git cloneして利用してください。

https://github.com/yuruto-free/wireguard-local-access-client/tree/v0.2.0

ここでは、以下の2点に対応し、自宅サーバ1(VPN Client2)の設定を更新します。それぞれ順に説明していきます。

  • peer_LocalServer.confの内容を修正し、conf/wg0.confとして保存する。
  • iptablesの設定をする。

注意点

上記のGitHubに格納しているdocker-compose.ymlの設定には、Dockerのversionが20.10.0以降でないと利用できないコードが含まれています。

services:
  wireguard:
    image: lscr.io/linuxserver/wireguard:latest
    container_name: wireguard

    # 中略
    extra_hosts:
      - "host.docker.internal:host-gateway"  # ←この部分

Dockerのversion20.10.0以前を利用している方は、docker-compose.ymlを以下のように修正してください。

version: '3.7'

services:
  wireguard:
    image: lscr.io/linuxserver/wireguard:latest
    container_name: wireguard
    cap_add:
      - NET_ADMIN
      - SYS_MODULE
    environment:
      - PUID=1000
      - PGID=1000
      - TZ=Asia/Tokyo
    networks:
      backbone:
        ipv4_address: 10.0.20.2
    volumes:
      - /lib/modules:/lib/modules
      - ./config:/config
    restart: always
    extra_hosts:
      - "host.docker.internal:10.0.20.1" # ←変更箇所

networks:
  backbone:
    name: backbone
    driver: bridge
    ipam:
      driver: default
      config:
        - subnet: 10.0.20.0/24

configファイルの格納・修正

wireguard-local-access-client直下にconfigというディレクトリがあります。

このconfig直下にpeer_LocalServer.confの内容をwg0.confというファイル名で保存します。

その後、wg.confInterfaceの末尾に、以下の2行を追加します。

これは、VPS(VPN Server)で設定したものと同じように、iptablesを修正するために必要になります。

PostUp = /config/iptables_script/postup.sh
PostDown = /config/iptables_script/postdown.sh

上記の修正を行うと、config/wg0.confの内容は、以下のようになります。

[Interface]
Address = 10.1.2.3
PrivateKey = 
ListenPort = 51820
MTU = 1380
DNS = 8.8.8.8,10.1.2.1
PostUp = /config/iptables_script/postup.sh     # 追加部分
PostDown = /config/iptables_script/postdown.sh # 追加部分
[Peer]
PublicKey = 
PresharedKey = 
Endpoint = example.vpn.com:51820
AllowedIPs = 10.1.2.0/24
PersistentKeepAlive = 10

iptablesの設定

config/iptables_scriptに移動し、conf.up.dconf.down.dにアドレス変換用の設定ファイルを作成し、保存します。

この設定が間違っていると通信できないため、環境に合わせて設定する際は十分注意してください。また、VPS(VPN Server)側で設定した内容と揃える必要があるので、十分注意してください。

先ほど記載した、アドレス変換の全体像を再掲します。

アドレス変換の遷移詳細(再掲)

そして、自宅サーバ1(VPN Client2)では、次のようなアドレス変換を行うことになります。

項目IPアドレスポート番号
変換前10.0.20.2/3280/tcp
変換後192.168.11.2/3280/tcp
アドレス変換による対応表(VPN Client2)

conf.up.dに格納するconfファイルの内容

「アドレス変換による対応表」の内容をiptablesの設定コマンドで表現すると以下のようになります。

iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 192.168.11.2:80

ここで、-d 10.0.20.2がないのは、送信元が必ず10.0.20.2になるためです。

後は、192.168.11.0/24に対するIP Masqueradeの設定も含めたコマンドをconf.up.d/02-routing-lan-access.confに保存します。

この段階で、conf.up.d/02-routing-lan-access.confは以下のようになっていることを確認してください。

iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 192.168.11.2:80
iptables -t nat -A POSTROUTING -d 192.168.11.0/24 -j MASQUERADE

conf.down.dに格納するconfファイルの内容

conf.down.dは、ルール削除時のコマンドを記載すればよいので、以下の内容をconf.down.d/02-routing-lan-access.confに保存します。nat -Dとなっている点に注意!

iptables -t nat -D PREROUTING -p tcp --dport 80 -j DNAT --to-destination 192.168.11.2:80
iptables -t nat -D POSTROUTING -d 192.168.11.0/24 -j MASQUERADE

自宅サーバ1(VPN Client2)側で必要な設定は以上となります。

VPN Client2の起動

下記のコマンドを実行し、VPN Client2を起動します。

chmod +x wrapper.sh
./wrapper.sh start

問題なく起動したら、下記のコマンドを実行し、先ほど追加したコードが出力されていることを確認してください。

./wrapper.sh logs
[#] /config/iptables_script/postup.sh
[#] - /config/iptables_script/conf.up.d/02-routing-lan-access.conf
[#]   iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 192.168.11.2:80
[#]   iptables -t nat -A POSTROUTING -d 192.168.11.0/24 -j MASQUERADE

動作確認

スマホのWebブラウザから、Nginxが起動しているサーバのIPアドレスを入力し、LAN内で起動しているWebサーバのトップページが表示されることを確認してください。

今回の例では、以下のようになります。環境が全く同じでない限り、コチラにアクセスしても期待通りの結果は得られません。気を付けてください。

http://192.168.11.2

まとめ

今回の実装は、下記のリンク先を参考にしてください。

VPS(VPN Server)側の実装

https://github.com/yuruto-free/vpnaccess-wireguard-nginx/tree/v0.2.0

自宅サーバ1(VPN Client2)側の実装

https://github.com/yuruto-free/wireguard-local-access-client/tree/v0.2.0

注意点

上記を動作させる際は、環境変数の設定が必要になります。詳細は、同封されているREADME.mdまたは以下を参照してください。

制約事項

今回は、LAN内で起動しているサーバのIPアドレスやポート番号を仮置きした上で、解説しました。

実際に稼働しているサーバのIPアドレスやポート番号は、各々の環境に合わせて読み替えてください。

【追記】トラブル事例をまとめました。

あわせて読みたい
VPS+VPN(WireGuard)の構成
【トラブル事例】VPS+VPN(WireGuard)で接続できない時の解決方法

続きを見る

スポンサードリンク

-デバイス
-, , , ,