Hyper-VでNAT環境を作り、仮想PCにインターネット接続させる

テスト用のLinuxを持ち運びたくて、WindowsノートPC上にHyper-Vで仮想PCを作りましたが、ネットワーク接続に困った。
・外のPCからはアクセスされなくて良い
・自分のWindowsからは固定されたIPでアクセスしたい
 ↑or 独自のローカルドメイン名でアクセスさせる(unbound DNS使用)
・仮想PCからインターネット接続も使いたい

Hyper-Vのネットワーク接続は仮想スイッチで行う。
仮想スイッチは「外部」「内部」「プライベート」があって、
・「外部」ホストPCの物理NICに相乗りする。なのでWiFiなど環境が変わると仮想PCもDHCPの影響を受ける。
・「内部」ホストPCと仮想PCでLANを作る。
・「プライベート」仮想PC同士だけでLANを作る。ホストPCとも繋がらない。
という違いがある。

仮想PCのIPアドレスを固定しつつインターネット接続を行うには、「内部」仮想スイッチを作成して、そこからNAT(WinNAT)で仮想PCのアクセスを確保する。

仮想スイッチのIPアドレスを 192.168.99.1、仮想PCのIPアドレスを192.168.99.2として
ホストPC上管理者権限で
New-NetNat -Name hogeNAT -InternalIPInterfaceAddressPrefix 192.168.99.0/24
とするとNATが使えるようになる。
やってみたけどすぐには使えなくて、再起動したら使えるようになってた。

NAPTでポート転送もできる。
Add-NetNatStaticMapping -NatName hogeNAT -ExternalIPAddress 0.0.0.0 -InternalIPAddress 192.168.99.2 -ExternalPort 10022 -InternalPort 22 -Protocol TCP
これで他のPCからホストPC:10022宛で仮想PC:sshができるようになったりする。

仮想PC側はIP固定にして、DNSはGoogle Public DNSなりホストPCに立てたDNSなりを使えば良い。DHCPサーバーを立てることもできるようだ(やってない)。

現在どんなNatが存在しているかはGet-NetNat、削除はRemove-NetNatのようだ。
コマンドが長いけどオプションまでタブ補完してくれて助かる。

ローカルドメインでワイルドカード名を使う

webサーバー作るときに最終的には *.example.com とか使うつもりだけど、開発テストで *.hogehoge.local みたいな名前を使いたい。
Windows上でHyper-Vで仮想PCをサーバーにしてLinuxを動作させる。
Linuxはwebサーバー、DB等。Windowsでブラウザを開いて使うため、Windowsにワイルドカードなホスト名を認識させないといけない。hostsにはワイルドカードが書けないので、LinuxでもWindowsでもどっちでもいいのでDNSを立てる。

今回はWindows上にUnboundを使ってみました。ちゃんとwindows用インストーラーがある。
NLnet Labs – Unbound – About

インストールしたら c:\Program Files\Unbound\service.conf を編集。

server:
    interface: ::1
    interface: ::0
    interface: 192.168.99.1 #Hyper-Vの仮想スイッチ(内部)接続で使ってるIPアドレス
    interface: 127.0.0.1
    interface: 0.0.0.0
    access-control: 0.0.0.0/0 refuse #外部には使わせない
    access-control: ::0/0 refuse
    access-control: 127.0.0.1/8 allow
    access-control: 192.168.99.1/24 allow #仮想スイッチ内からは使わせる
    access-control: ::1 allow

    auth-zone:
        name: "hogehoge.local"
        for-downstream: yes
        for-upstream: no
        zonemd-check: no
        zonemd-reject-absence: no
        zonefile "hogehoge.local.zone"

forward-zone: #ローカル該当ドメイン以外はGoogle Public DNSに問い合わせる
    name:"."
    forward-addr: 2001:4860:4860::8888
    forward-addr: 2001:4860:4860::8844
    forward-addr: 8.8.8.8
    forward-addr: 8.8.4.4

hogehoge.local.zoneも作成

$ORIGIN hogehoge.local
*.hogehoge.local    A    192.168.99.2

unbound-checkconfでチェック後、WindowsなのでサービスからUnboundを再起動して読み込ませる。

nslookup fuga.hogehoge.local localhost で結果が返ってくればOK。
ネットワークアダプタの設定でDNSを手動にしてlocalhost指定。
ワイルドカードを使う際はauth-zoneじゃなきゃダメみたい。

ローカルにbind立てるのは面倒だったのですが、unboundは簡単な感じでいいですね。

メール受信から.forwardでコマンド実行したときの環境

Linux環境(postfix使用)で個人が.forward置いてコマンド利用するとどういう環境になるのか、軽く検索してたどり着けなかったので実験した。

.forwardの中身は
\username,”|/home/username/test.sh”
で、test.shは実行属性をつけてある。

結果、カレントディレクトリは /var/spool/postfixであることがわかった。
なので.forwardのほうもフルパス指定してやらないとそもそもshが起動しなかった。

あとついでに。shじゃなくてもphpも実行できる。
#!/usr/bin/php
<?php echo “Hello\n”;
って感じで実行ファイルにできる。(知ってたけど意外とやってなかったこと)

OpenVPNが一定時間毎に切れて繋がるまで一定時間かかる

OpenVPNを設定、dev tunで接続。
keepalive 10 120(デフォルト)で使用していたが、よく切れる。
OpenVPN上でpingを連続で打って見てみると、120秒で切れて、その後120秒後に再接続が行われて繋がる。

“Inactivity timeout (–ping-restart), restarting” each 120 secs – OpenVPN Support Forum

この人も同じような状況だったようだ。クライアントが二重に起動していたとのことだが、手元の環境ではその前の –duplicate-cn がポイントだった。

おそらく再接続の際にコネクションが残っているため、二重接続で拒否されたのだろう。おかげでさらに120秒待つことになっている。
keepalive 10 20 と設定しても20秒、20秒だったのでこの挙動のようだ。

serverのconfigに duplicate-cn を追記して、二重接続を許可したところ、OpenVPNが切れることはなくなった。

xfs上でrm -rfしてしまったものを復活させる

夜中に電話で起こされて何事かと思ったら「間違ってrm -rfしてしまいました」と。
対象ファイルシステムがxfsでして、extundeleteやext4magicが使えません。xfsでは諦めろ的なblogが多かったですが、Photorec/TestDiskというツールでなんとか回収できました。しかし欲しかった対象ファイルのうち3割ぐらいでしょうか…
残りは少し古いバックアップがあったので、合わせてみて、不足分は泣きを見ることにしてもらいました。

オープンソースで無料のファイル復元ソフト「PhotoRec」 – GIGAZINE
GIGAZINEの記事は2007年ですが、

Partition Recovery and File Undelete
配布元を見ると2024年でも更新されているし、XFSに対応している。
今回はLinux(CentOS Stream 9)でGUIなしの操作でしたので、コマンドラインだけで使えるツールであることは重要。

データ復旧ソフトと復元サービス(NAS対応)|復旧天使 公式
復旧天使という有償のもあるのですが、LinuxではGUIソフトのようで、今回はパス。

消しちゃったファイル群自体は200MBもないハズなのですが、対象パーティションが100GBあるので、最悪それぐらいの削除ファイルが復活される可能性があります。
ということで128GBのUSBメモリを用意して、fdiskでパーティションを切ってxfsにてフォーマット。回収ファイルの置き場とします。

回収ファイルと別領域のhomeに
testdisk-7.2.linux26-x86_64.tar.bz2 をダウンロードして、tar xjfで解凍、photorec_staticを起動すると、CUIでのメニュー操作が可能になります。
対象パーティションと書き込み先を指定して、あとは待つ。
回収先にはrecup_dir.XXXというディレクトリと共に、回収されたファイルが大量にできていきます。
ファイル名は回収されておらずランダムになっているので、あとは中身を見ながらリネームするなりしてぽちぽちと回収していくのです…

バックアップはこまめに、別領域、別媒体に取るべし、な…