🐥

WSLのhostnameでLinux同士をSSH接続する方法

2022/11/28に公開

mDNSってなんですか?

関連記事:
WSLのLinux側からPodmanを利用する方法: ポッドマンが倒せない(5)
Distrodを使ってWSLでsystemdを動かす

前回の記事にてnpiperelayを介したLinux経由のアクセスを実現した。

ただ、実際使ってみるとやりたいことが実現できなかったり、
動作が遅かったりと不便な箇所も出てきている。
シェルを駆使すればどうにかなるのかもしれないが、
それより他の手段を探した方が良さそうだ。

単純にローカルIPを使用すれば接続自体は可能。
ただし、この方法はIPが動的に変わるWSLでは不便なところが多い。
その上、インスタンス複数立ち上げたらこの手法はとれない。

そこでドメイン名を使って接続する方法はないかと探したら条件付きだが可能っぽい
今回は特定のLinuxにhostnameをつけて接続する方法をやってみる。
肝になるソリューションは

avahi

ちなみに、IPを調べる方法は、

powershell
wsl -d [distro] -e hostname -I

それからWSLの仕様上IPは一つで各Distroに割り振るのは無理っぽい
(誰かやり方おせーて)

ヾ(・ω<)ノ" 三三三● ⅱⅲ コロコロ♪

------------------- ↓ 本題はここから ↓-------------------

準備

今回はホストにUbuntu(focal)、ゲストにDebian(bullseye)を使用。
以下のような接続が出来るようにする

各WSLのインストール

powershell
wsl --install debian
wsl --install Ubuntu-20.04wsl --install

アップデートを済ませておく

bash
sudo apt update && sudo apt upgrade -y

ホスト名の設定

Ubuntu側にホスト名を設定する
ホスト名は ubuntuhost

/etc/wsl.conf
[network]
hostname=ubuntuhost

[boot]
systemd=true

Ubuntuを再起動

powershell
wsl -t Ubuntu-20.04;wsl -d Ubuntu-20.04

avahiのインストール

インストール

mDNS(マルチキャストDNS)というソリューションがある。
これはDNSサーバを立てて名前解決していた従来の形ではなく、
ローカルエリアネットワークに一斉に問い合わせをして、
クライアント側からIPを返却させるという方式

.localというドメインで各クライアントに接続するというもの。
そのモジュールをであるavahiおよびlibnss-mdnsをインストールする。

sudo apt install -y avahi-daemon libnss-mdns
sudo service --status-all
 [ + ]  avahi-daemon
 [ + ]  ssh

動作確認

Powershellで動作確認

powershell
Resolve-DnsName ubuntuhost
 Name                Type   TTL   Section    IPAddress
 ----                ----   ---   -------    ---------
 ubuntuhost.local    AAAA   120   Answer     fe80::215:5dff:fe0b:fa24
 ubuntuhost.local    A      120   Answer     172.20.45.43

(・∀・) ひけた

IPV6でも引けるのがいい

他OS(Debian)からSSH接続

さて、特定のLinuxにhostnameでアクセスできるのなら、
SSHなどどのプロトコルでも基本的には大丈夫なはず。

wsl -d debian
sudo apt install -y dnsutils ssh
nslookup ubuntuhost.local
 Server:         172.20.32.1
 Address:        172.20.32.1#53

 Non-authoritative answer:
 Name:   ubuntuhost.local
 Address: 172.20.45.43
 Name:   ubuntuhost.local
 Address: fe80::215:5dff:fe0b:fa24
ssh dozo@ubuntuhost.local
 The authenticity of host 'ubuntuhost.local (172.20.45.43)' can't be established.
 ECDSA key fingerprint is SHA256:kg2PNabW0gT5J/AoIfhTq0uoPQsDEiwn6jLYjuBCeno.
 Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
 Warning: Permanently added 'ubuntuhost.local,172.20.45.43' (ECDSA) to the list of  known hosts.

(-_-;)鍵認証じゃないと怒られた

まぁ接続が出来たのはわかったのでヨシ!

------------------- ↓ 後書はここから ↓-------------------

hostnameを使って特定のWSLに接続を試みたわけだが、
各WSLインスタンスにhostnameを設定すれば相互に接続できるのかと言えばそうではない。
理由はIPが全部共通だから。
なので特定のインスタンスをサーバー機能としてクライアントサーバー的に運用するのが良いかもしれない。

Fedora

bash
sudo dnf install -y avahi nss-mdns
sudo systemctl enable --now avahi-daemon

Discussion