コロナ関連でお家作業が増えるといろいろ考えないといけないことが増えるんですよね。今回、私の手元においてあるESXiサーバ内のVMに自社の別の人が接続できるようにする必要がでてきたのですが、ここではたと気づく。
VMのネットワークと宅内LANがフラットにつながっとるやん…
このままだと、接続させてあげた人にVM経由してうちのネットワークが見られてしまう…! (/▽\)きゃー♪
ってふざけてる場合じゃないので、真面目にVM用のNWを分離する必要があります。
これを実現するにはDD-WRTの設定でVLANを有効するのが有効です。かなり手こずりましたがなんとかできたので備忘録として記録しておきます。
2020/05/10時点:手順は記載。スクリーンショットなどはないので、余裕があれば追加していくつもりです。
構成の要件
今の構成だと
- 宅内LAN:192.168.10.0/24
- PC、スマホ、タブレット、プリンタ、NASなどが多数ぶら下がる
- DD-WRTルータ:192.168.10.1
- デフォルトゲートウェイ、DHCPサーバ、DNSリゾルバを兼ねる
- ESXiサーバアドレス:192.168.10.150
- 公開VM:192.168.10.91
- ポートフォワーディングにより、DD-WRTルータのWAN側IPの特定ポートへの接続をここへ転送する
となっていて、このままだと公開VMに入れたらNASの中まで見ようと思えば見られる状況になってあまりうれしくないなと。なので要件は
- ESXiサーバは宅内LANから制御可能にしたい→192.168.10.150は変更しない
- ポートフォワーディングにより外部から公開VMへはアクセス可能にしたい
- 公開VMから宅内LANにはアクセス不能にしたい
- 公開VMからインターネットへの接続は許可したい
となります。今回は切り出すVMを「VLAN10:172.31.10.0/24」に所属させ、ESXiとDD-WRTルータをIEEE 802.1Qトランキングにより複数VLANを1つのケーブルで運ぶことにします。
DD-WRTの設定
ここが一番のハマりどころでした。DD-WRTにはGUIでスイッチポートの設定ができる「Setup→Switch Config」の画面があるのですが、私の環境(ASUS RT-AC87U)では個々の設定を1つでも変更するとルータが固まる(DD-WRTの用語ではBrick:ブリックする)ので、この機種ではだめなのだと思っていました。
しかし各種資料をあたると「GUIではなくコマンドでやればできる」という事がわかりました。試行錯誤して確定した手順は以下のとおりです。なお、この手順は他のBroadcomチップ搭載ルータであれば流用可能なはずです。
既存の状態を確認
まずデフォルトのVLAN状態を確認します。ルータにssh(telnet)で接続し、以下の3つのコマンドを使って状態を取得します。
nvram show | grep vlan.*ports | sort nvram show | grep port.*vlans | sort nvram show | grep vlan.*hwname | sort
私の環境では以下のように出力されました。
root@rt-ac87u:~# nvram show | grep vlan.*ports | sort size: 43305 bytes (22231 left) vlan1ports=1 2 3 5 7* vlan2ports=0 7u root@rt-ac87u:~# nvram show | grep port.*vlans | sort size: 43305 bytes (22231 left) port0vlans=2 port1vlans=1 port2vlans=1 port3vlans=1 port4vlans=1 port5vlans=1 2 16 root@rt-ac87u:~# nvram show | grep vlan.*hwname | sort size: 43305 bytes (22231 left) vlan1hwname=et1 vlan2hwname=et1
ここでの各ポートや出力の意味は以下の通りです。
- vlan#ports:どのVLANがどのポートを通過できるか。
- 「*」フラグ:CPUを意味するポート。最初に出現するVLANでだけついているみたい。このポートが無いとそのVLANはCPUから制御できない(Ciscoスイッチで言うSVIが無い状態)
- 「u」フラグ:必ずTagなし(Un-tagged)とする。インターネット接続ポート(WANポート)のCPUポートには基本ついている。
- port#vlans:どの物理ポートがどのVLANに所属するか。特殊な値として「16:TagVLAN」がある
- VLANトランキングを行う場合は複数列挙する
- デフォルトでは、「VLAN2=WAN接続」「VLAN1=LAN」となっている
- vlan#hwname:どのVLANがどの物理インターフェースに接続するか。この環境ではEthernet1がスイッチを制御するインターフェースなので「et1」だけ。
追加設定
手作業で設定を追加していくのには主に「nvram」コマンドを使います。
- ESXiサーバの接続する物理ポート(今回はポート3)にVLANを追加する。ポート3が「VLAN1, VLAN10を通すトランキングポート」となるように「1 10 16」を設定する。
nvram set port3vlans="1 10 16"
- VLAN1とVLAN10がポート3を802.1Qタグ付きで通れるようにする。タグ付きになるポートには「t」フラグをセットする。
nvram set vlan1ports="1 2 3t 5 7*" nvram set vlan10ports="3t 7"
2020-06-05追記)vlan1をタグなしで扱いたい場合は以下のように設定する。
nvram set vlan1ports="1 2 3 5 7*"
- 追加したVLAN10がEthernet1(スイッチインターフェース)を使うようにする。
nvram set vlan10hwname="et1"
- ここまでの設定をNVRAMに保存する。
nvram commit
NVRAM コマンドでは設定できないもの
nvramコマンドで追加できない情報を登録する。
- eth0(ルータのCPUが提供するインターフェース)にVLAN10の制御を追加する。
/sbin/vconfig add eth0 10
- VLAN10インターフェースにIPアドレスを設定し、有効化する。
/usr/sbin/ip addr add 172.31.10.1/24 dev vlan10 /sbin/ifconfig vlan10 up
- DD-WRTのカーネルにVLAN10がタグ付きで通信可能なポートを登録する。今回はポート3とCPUポート(7)にタグ付きフラグをセットして書き込む。
echo "3t 7t" > /proc/switch/eth0/vlan/10/ports
なお、上記の nvram コマンド以外の4行は次回起動時も有効になるように[Administration→Commands]のStartupスクリプトとして登録する必要があります。
VLAN10インターフェースのレイヤ3設定
VLAN1とVLAN10が分離され、VLAN10配下でもDHCPでのアドレス割当ができるように設定します。
- [Setup→Networking]タブを開く
- [Port Setup]配下に[Network Configuration vlan10]があることを確認する
- [Bridge Assignment]をUnbridgedに変更する
- インターネットに出られるように[Masquerade / NAT]をEnableにする
- 他のセグメントとは通信不可とするため[Net Isolation]をEnableにする
- VLAN10インターフェースのIPアドレスを設定する(上で設定した172.31.10.1/24)
- 画面最下部あたりの[Multiple DHCP Server]のところで[Add]をクリックする
- ドロップダウンリストから[vlan 10]を選択する
- 画面最下部の[Save]をクリックする
Startupスクリプトの登録
nvram 設定に含まれない設定作業を次回起動時にも有効にするように起動時スクリプトとして登録する。
- [Administration→Commands]タブを開く
- 一番上の[Commands]フィールドに「NVRAMコマンドでは設定できないもの」のコマンドを登録する。
/sbin/vconfig add eth0 10 /sbin/ifconfig vlan10 up /usr/sbin/ip addr add 172.31.10.1/24 dev vlan10 echo "3t 7t" > /proc/switch/eth0/vlan/10/ports
- 画面最下部の[Save Startup]をクリックする。
ここまでできたらルータを再起動します。
ESXiのポートグループ
VMware ESXiでは、VLANにタグを付けるのは簡単です。VMが接続するポートグループのVLAN番号を、期待するVLAN番号にするだけです。今回はVLAN10のポートグループを作成して、そこに公開VMを配置しました。
ただし、ここでの注意はVM Kernelが接続するポートグループも「VLAN1」にする必要があることです。VLAN0のままだと「タグなし」になるので、DD-WRTがポート3で受信してもタグがないのでどこのVLANに渡してよいかわからなくなります。必ずVLAN1と設定します。
ポートフォワーディング
DD-WRTでのポートフォワーディングは割と簡単です。
- [NAT / QoS→Port Forwarding]タブを開く
- [Application]に識別用の名前をつける
- [Port from]に外部から接続してくるポート番号を指定する
- [IP Address]に公開VMのIPアドレスを指定する(VLAN10配下のVMなので、172.31.10.XX となります)
- [Port to]に公開VMの接続先ポートを指定する(今回はSSHしたいだけだったので22を指定しました)
これで、完成です。なかなか大変でしたが、VLANを追加するのにポートを増やす必要もないので、今後の検証環境構築に重宝しそうです。
コメント