Virtual Boxからlocalhostにアクセスする
やりたいこと・背景
やりたいこと
Virtual Boxを使ってIE11での画面を確認したい. デプロイ環境ではなく,Macbookで建てたローカルにアクセスしたい.
今回利用したVMとイメージ
- Virtual Box 6.1.22 VirtualBox 注意:日本語版サイト(Oracle VM VirtualBox - ダウンロード | Oracle 日本)からDLできるものは少し古く,アップデートしようとしてもできないので,英語版公式VirtualBox からインストールすること.
- イメージ:IE11 on Win81 (x86) for VirtualBox 仮想マシン - Microsoft Edge Developer
VMの設定はこちらの記事を参考にした.
Virtual Boxの画面が小さい時はこちらを
導入エラーが出たら
https://www.nemotos.net/?p=3707
背景
Virtual Boxは 10.0.2.2
にアクセスすることでホストマシンの localhost
にアクセスできる.
なのでホストの localhost:3000
にアクセスしたければ 10.0.2.2:3000
を叩けばいい!はい終了!
こまったこと
ともいかず…開発しているサイトの仕様上(まあどこもそうだと思うが),ページ遷移のたびにURLが書き変わる. 例えば login画面 にアクセスし,ログインしてページ遷移するとURLは次のようになる.
10.0.2.2:3000/signin
→ localhost:3000/mypage
こうなってしまうとVM上のlocalhostにアクセスしてしまうためうまくいかない.さらにセキュリティ上 10.0.2.2:3000/mypage
と入力しても /signin
にリダイレクトされる仕様になっているためサインイン画面から先に進めないのだ.
試したこと
プロジェクトのルーティングとかその辺をいじれよ,とも思ったがIEから同格するのは一瞬なので余計なことはしたくない.VM側の設定でなんとかしたい
hostsファイルをいじる
- hostsファイルとは設定ファイルの一つで,DNSのようにIPアドレスとドメインの対応付をさせられるファイル(詳しくはリンクを参照) hostsファイルの場所やら編集/設定するメモ(mac、linux、windows) - tweeeetyのぶろぐ的めも
ここで
10.0.2.2
をlocalhost
に紐づけてやれば ゲストlocalhost
にアクセスしてもホスト側のlocalhostに飛ばされるのでは!?と思った. 実際先輩はこれで問題なくできいたようだ. が,なぜか僕は同じように設定しても解決せず.
うまくいかなかった理由
そういう仕様だった
hostsファイルに以下の記述が
localhost name resolution is handled within DNS itself.
うわー!Not being able to re-direct requests to localhost in the VM to the host's localhost is now baked in to Windows (https://tools.ietf.org/html/rfc6761#section-6.3), including the VM's available at https://developer.microsoft.com/en-us/microsoft-edge/tools/vms/
For security reassons Microsoft now prevents host file entries for overriding the address of localhost to anything other than the loopback address ::1. So adding a line the VM's host file such as10.0.2.2 localhost
will be ignored.VM内のローカルホストへのリクエストをホストのローカルホストにリダイレクトできないことは、httpsで利用可能なVMを含め、Windows(https://tools.ietf.org/html/rfc6761#section-6.3)に組み込まれるようになりました。 ://developer.microsoft.com/en-us/microsoft-edge/tools/vms/
セキュリティ上の理由から、Microsoftは、localhostのアドレスをループバックアドレス:: 1以外にオーバーライドするためのホストファイルエントリを禁止するようになりました。したがって、10.0.2.2localhost
などのVMのホストファイルに行を追加しても無視されます。
Addressing localhost from a VirtualBox virtual machine - Stack Overflow(別の先輩が見つけてくださった.感謝)
先輩は古いバージョンのものを使っていたため,この方法が取れたようだ.(自分は最新版を使っていた) ちなみに今古いバージョンを落として起動しようとしてもうまくいかない.
解決策
netsh をつかって上書きする
Network Shell (netsh) は、コマンドライン ユーティリティであり、Windows Server 2016 を実行中のコンピューターにインストールした後、さまざまなネットワーク通信サーバーの役割とコンポーネントを構成してそれらのステータスを表示できます。
ネットワーク シェル (netsh) | Microsoft Docs
TCP/IPのパラメータを手動で制御するためのものらしい.(【Windows】netshコマンドでTCP/IPのパラメータを設定する:Tech TIPS - @IT)
これを管理者権限で実行すればDNSの設定を上書きできるらしい.
*Windowsボタンを押し,[command]とタイプすると出てくる.
記述方法は
netsh interface portproxy add v4tov4 listenaddress=[アクセスするIP] listenport=[ポート番号] connectaddress=[対応付するIP] connectport=[ポート]
今回は,コマンドプロンプトを右クリックし「管理者権限で〜」を選んで起動し,次のように書けば良い.
netsh interface portproxy add v4tov4 listenaddress=127.0.0.1 listenport=3000 connectaddress=10.0.2.2 connectport=3000
こちらを実行後にlocalhost:3000
にアクセスすると問題なく表示された!
これ以外にもDBなどを建てている場合はそれらのポート番号についても同様の処理が必要になる.(自分の場合は4.5個やった…)
なお
「本来はlocalhostはループバックアドレスとして明確に定められたアドレスなので明確に定められたアドレスなので,捻じ曲げるのはRFC的には好ましくない」とのご指摘をさらに別の先輩から頂いた.
??????????
ネットワークセキュリティの講義が良だった生物学科出身の僕には何も分からなかったがとりあえず「なるほどー🙇♂️」と返しておいた. ???????????
一回おちついて ループバックアドレス
ループバックアドレスとは、 ネットワークカード などに割り当てられた特殊なIPアドレスで、そのコンピュータ自身を示すIPアドレスのこと。あるコンピュータがネットワークを通じて提供している機能に自身で動作する別のソフトウェアからアクセスする場合や、ネットワークを利用するソフトウェアのテストなどに用いられる。
https://e-words.jp/w/%E3%83%AB%E3%83%BC%E3%83%97%E3%83%90%E3%83%83%E3%82%AF%E3%82%A2%E3%83%89%E3%83%AC%E3%82%B9.html
自分自身と通信するために必要なアドレスだということらしい.
IETFドキュメント”Special-Use IPv4 Addresses” ( RFC 5735 )には、127.0.0.0/8はループバック用に予約された IPv4アドレス であると記載されている。
このアドレスはどの組織やISPにも割り当てられていない。このアドレスブロック’127.0.0.0/8’宛のパケットはホストシステム外へは出ない。
localhost - Wikipedia
なるほど.特殊なアドレスで,これを持っているパケットは外に出れないようになっているらしい.確かにこれを勝手に変えてしまったらまずいな.
RFC(Request for Comments)は、インターネットで用いられるさまざまな技術の標準化や運用に関する事項など幅広い情報共有を行うために公開される文書シリーズです。
インターネット10分講座 - JPNIC
インターネット標準ルールを議論・規定,広く公開するものなのかな?
つまり一般的によろしくないということらしい.
でもまぁ…今回はIEでのCSS対応状況を確認するためにしか使わないし,VMだしいいかな,ということにしておく.
おまけ
VirtualBoxくんのイメージもアプデするのね…だるすぎぃ