見出し画像

Windowsホスト上でIPアドレスが固定されたUbuntu(Wireguard)を使いたい

お久しぶりです。コンタクトを使い切ってしまったのですが、今朝かばんから2枚出てきました。ハッピーです。

WindowsホストのPCをVPNサーバ、内部公開のWebサーバとして使っているのですが、少し不便だったので変更を加えたので備忘録です。

変更目的は以下の2点です。

  • Wireguardは引き続き使いたい

  • Windowsは残したい

調べているとWindowsホストに直接Wireguard(サーバ)をインストールするためにコーディングした方がいるみたいです。いやはやすごいですね。素晴らしいです。ですがエラーが発生したときのトラブルシュートが面倒複雑なのと、何よりメンテナンスされなくなったときが怖いので今回の選択肢からは外します。

要件を整理すると以下の通りです。

  • Windowsのホストの設定を変更するのは最小限に

  • UbuntuのIPは固定する

  • Ubuntuは自動起動させる

1. WSLを使用する(変更前の構成)

僕が使ってたパターンです。WSLがsystemdに対応した、だのファイル共有がいい、だの謳っていたので使えるかを実験的にやってみました。ナレッジとして一応残しておきます。

以下で実現可能に感じたのです。

  1. wslをインストール

  2. wsl上にWireguardをインストール

  3. IPマスカレードを設定(ホストの51820ポートに着信したパケットをwslに渡す)

  4. wslを常時起動

ですが、結論から言うとうまくいきませんでした。課題は4です。

タスクスケジューラを使用して常時起動させればええやん、と思いますがどうもうまくいきません。コマンドで直接wsl.exeを実行するように設定、wsl.exeを実行する.batファイルを作成して.batファイルを起動するように設定、実行するユーザをAdministratorに変更、実行するファイルのパーミッションの変更、wslでWireguardを構築したユーザで実行させる、構築したユーザが実行するパスをタスクスケジューラで指定でなどなど思いつくものを一通り試したのですが無理でした。また、Windowsのサービスに登録すればええやん、ということでsexeを使ってみたりしましたがなぜか起動しません。。。WSL難しいです。

というかWSLってログが揮発しちゃうという記事を見た気がします。このような使い方は想定していないのでしょう。真面目にwireguard側のトラブルシューティングをするとなると、別途syslogサーバを立てなきゃなのでイケてませんよね。

※3についてはインターネットで日本語の記事が複数あります。普通にうまくいきますがネットワークの知識が必要なのでお勧めしません。ネットワークでハマっているのか、Linuxでハマっているのか、wslでハマっているのか、知識がないと厳しい気がします。

2. Hyper-Vを使用する(変更後の構成)

  1. Hyper-VでUbuntuの仮想マシンを作成

  2. 仮想マシンにWireguardをインストール

  3. IPアドレスを固定

  4. 仮想マシンを常時起動

1、2は簡単なので割愛します。

3のIPアドレスを固定について、WindowsホストでNATする方法、仮想マシンが直接IPをもらってくる、という2種類の方法が思いつきます。

NATする方法はインターネット上に記事がたくさんあるのですが、Windowsホストの設定を極力触りたくないので仮想マシンが直接IPをもらってくる方法を採用します。

まずはHyper-Vで直接IPをもらってこられるように設定します。

仮想マシンの設定を開き、ネットワークアダプターの「仮想スイッチ」で「External」を選択します。

続いて指定のIPを使用するため、仮想マシン上で以下のコマンドを実行していきます。

設定ファイルをコピーしてバックアップ

cd /etc/netplan
sudo cp 01-network-manager-all.yaml 01-network-manager-all.yaml.bak

設定ファイルの書き換え
以下のコマンドを実行し、以下を参考に中身を書き換えます。

sudo nano 01-network-manager-all.yaml
### 01-network-manager-all.yaml
network:
  ethernets:
    eth0:
      addresses:
        - 192.168.1.133/24 # 仮想マシンに設定するIPアドレス
      nameservers:
        addresses: [94.140.14.14, 94.140.15.15] # DNSサーバ8.8.8.8とかでもよい
      routes:
        - to: default
          via: 192.168.1.1 # 自宅のルータIPアドレス
  version: 2

以下を実行して設定ファイルを適用します。

sudo netplan apply

僕が実行したときは、エラーメッセージが出て怒られたのでご指摘の通りMetworkManager自体を以下のコマンドで再起動してあげました。

sudo systemctl restart systemd-networkd.service

一応ステータスを確認するとよいです。

systemctl status systemd-networkd.service
● systemd-networkd.service - Network Configuration
     Loaded: loaded (/lib/systemd/system/systemd-networkd.service; enabled-runtime; vendor preset: enabled)
     Active: active (running) since Sun 2023-10-22 12:50:11 JST; 1h 2min ago
TriggeredBy: ● systemd-networkd.socket
       Docs: man:systemd-networkd.service(8)
   Main PID: 403 (systemd-network)
     Status: "Processing requests..."
      Tasks: 1 (limit: 4631)
     Memory: 2.7M
        CPU: 140ms
     CGroup: /system.slice/systemd-networkd.service
             └─403 /lib/systemd/systemd-networkd

1022 12:50:11 hatomugicha systemd[1]: Started Network Configuration.
1022 12:50:11 hatomugicha systemd-networkd[403]: eth0: Link UP
1022 12:50:11 hatomugicha systemd-networkd[403]: eth0: Gained carrier
1022 12:50:12 hatomugicha systemd-networkd[403]: eth0: Gained IPv6LL
1022 13:00:59 hatomugicha systemd-networkd[403]: eth0: found matching network '/run/systemd/network/10-netplan-eth0.network', based on p>
1022 13:00:59 hatomugicha systemd-networkd[403]: eth0: Re-configuring with /run/systemd/network/10-netplan-eth0.network
1022 13:00:59 hatomugicha systemd-networkd[403]: eth0: DHCPv6 lease lost
1022 13:00:59 hatomugicha systemd-networkd[403]: eth0: found matching network '/run/systemd/network/10-netplan-eth0.network', based on p>
1022 13:00:59 hatomugicha systemd-networkd[403]: eth0: Re-configuring with /run/systemd/network/10-netplan-eth0.network
1022 13:00:59 hatomugicha systemd-networkd[403]: eth0: DHCPv6 lease lost

指定したIPアドレスが取得できているはずです。

ip address show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:15:5d:xx:xx:xx brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.133/24 brd 192.168.1.255 scope global eth0

残すは4の仮想マシンの常時起動ですが、Hyper-Vマネージャを開き、該当の仮想マシンを右クリックして「設定」をクリック、「自動開始アクション」を編集することで実現可能です。

補足

  • Macアドレスを固定してルータ側でIPアドレスを振ればよくない?

    • WSL、Hyper-VともにMacアドレスを固定するのは推奨していない

    • デフォルトでは再起動したら勝手にMacアドレスが変わる仕様になっている

    • そもそも2023年現在ではセキュリティ的にランダムにMacアドレスを変更していくのが流行ってますからね。。

  • 01-network-manager-all.yamlの先頭の01の意味は?

    • ファイルが複数存在したときの優先される順序のようです

    • 01よりも02の方が優先される、02よりも90の方が優先されるといった具合みたい

  • 仮想マシンのUbuntuにサーバ以外からRDPでアクセスしたい。なぜかHyper-Vを動かしているサーバ以外からRDPセッションを張れない

    • 昨日的にはUbuntu側の設定で「共有」という項目でUbuntu2204LTSから設定できるようになってます

    • 上記で行けるはずなのですが、Ubuntu側の作りが甘いみたいです。以下の記事で行けそうです。


ということで、僕は美術館に行ってきます。よい一日を!!

この記事が気に入ったらサポートをしてみませんか?