にふうち回避

日々のプログラミング勉強の記録

*自分自身の勉強の備忘録としての記事がほとんどです.内容の正確性などは担保されません.

Virtual Boxからlocalhostにアクセスする

やりたいこと・背景

やりたいこと

Virtual Boxを使ってIE11での画面を確認したい. デプロイ環境ではなく,Macbookで建てたローカルにアクセスしたい.

今回利用したVMとイメージ

VMの設定はこちらの記事を参考にした.

www.ritolab.com

Virtual Boxの画面が小さい時はこちらを

pc-karuma.net

導入エラーが出たら

https://www.nemotos.net/?p=3707

www.nemotos.net

背景

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ファイルに以下の記述が

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 as 10.0.2.2 localhost will be ignored.

VM内のローカルホストへのリクエストをホストのローカルホストにリダイレクトできないことは、httpsで利用可能なVMを含め、Windowshttps://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]とタイプすると出てくる.

command
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

RFC(Request for Comments)は、インターネットで用いられるさまざまな技術の標準化や運用に関する事項など幅広い情報共有を行うために公開される文書シリーズです。
インターネット10分講座 - JPNIC
インターネット標準ルールを議論・規定,広く公開するものなのかな?

つまり一般的によろしくないということらしい.

でもまぁ…今回はIEでのCSS対応状況を確認するためにしか使わないし,VMだしいいかな,ということにしておく.

おまけ

VirtualBoxくんのイメージもアプデするのね…だるすぎぃ

windows8-in-updating
windows8-upload