やっぱり、というかネットワークが鬼門じゃったよ、皆の衆!
すみません、取り乱しました。
/etc/hosts ファイルを編集して、ホストオンリーアダプターのIPアドレスを直接設定しとったよ、Oracleさんは...。
ちなみに、httpでネットワーク接続する際は、Webサーバー(Apache http server、Nginx、LightSpeedなどのこと)を仮想マシン内にインストールしておく必要がありますかね。(今回は、httpは関係ないですが)
まぁ、例のごとく、今回もハマりにハマってます。おかげでいつも休日が全部潰れてるという(涙)。
それでは、レッツトライ。
ポートを開くこと、ポートフォワーディングへの道
NAT(Network Address Translation)でも接続することができるんだそうです。
どうやら、ファイヤーウォールでポートを許可してあげれば良いようです。
⇧ 上記サイト様を参考にトライしてみたいと思います。
NAT(Network Address Translation)って?
そも、NAT(Network Address Translation)ってどういう仕組み?
⇧ 上記サイト様が詳しいです。
NATは、プライベートIPアドレスをグローバルIPアドレスに変換してくれるということのようです。(※ただし、一対一対応。人で言ったら、マンツーマンってことですかね。)
突然ですが、ザックリとインターネットのしくみ
まず、インターネットにつながるには、グローバルIPアドレスが必要ですと。
その前に、各機器(パソコンやスマホ、ルーターなどなど)には、必ず、MACアドレスとIPアドレス(プライベートIPアドレス)というものが割り当てられています。
⇧ 上記サイト様が説明してくれています。
で、何でMACアドレスとIPアドレスの2つが必要かという経緯は、
⇧ 上記サイト様が詳しいです。
いまでこそ、Ethernet という通信が主流になったようですが、昔は通信の規格が様々であったため、MACアドレスの情報を利用しない通信方法も存在したようです。
ルーターの負担(様々な通信に対応するにはコストがかかる)を減らすために、Ethernet主流の流れができあがったようです。
で、Ethernetには、IPアドレスとMACアドレスの2つの情報(それ以外にも情報は必要ですが)が必要ということのようです。
⇧ 上記サイト様によりますと、
Ethernetでは、ハブによって複数のコンピュータやルータが接続され、物理的に通信できるのは「隣接ノード」となる。Ethernetではこの複数の隣接ノードの中から通信する1つのノードを示すためにMACアドレスが使われるのである。
となっていて、Ethernetでは、MACアドレスの情報を元に、最終的な宛先であるIPアドレスへ情報が届けられるということのようです。
プライベートIPアドレスとグローバルIPアドレス
IPアドレスには、大きく分けて
- プライベートIPアドレス
- グローバルIPアドレス
の 2種類があるようです。
なぜ、
- プライベートIPアドレス
- グローバルIPアドレス
の2つあるのか?
⇧ 上記サイト様が詳しいです。
通常、会社や、自宅で利用している機器に、プライベートIPアドレスは被ることなく割り当てられています。
⇧ A社、B社でネットワークが独立してる(閉じられてる)ので問題なし。
ですが、ネットワークをつなげようとしたときに、プライベートIPアドレスは重複する可能性がでてきてしまいます。
⇧ 上図の場合、A社とB社でネットワーク接続が行われた際に、192.168.1.3が被ってしまいます。
そこで、「アドレス変換機能」の登場です。
みなさんも実感しているように,プライベートIPアドレスを使っている機器でもインターネットへアクセスできる。それは,インターネットと社内ネットの境界部分にアドレス変換機能を持った機器があるからだ。
家庭向けのブロードバンド・ルーターやファイアウォールは,必ずアドレス変換機能が備えている。この機能があるおかげで,プライベートIPアドレスを使っている社内や家庭の端末も,インターネットへアクセスできる。
アドレス変換のイメージ図
⇧ ルーターで、一意であるグローバルIPアドレスに変換してから通信することで、
- A社のグローバルIPアドレス.プライベートIPアドレスである192.168.1.3
- B社のグローバルIPアドレス.プライベートIPアドレスである192.168.1.3
みたいな感じで、区別できるようになる感じですかね。
「アドレス変換機能」は、ルーター以外にもL3スイッチなどでも利用できるようです。
※実際のネットワークはもっと複雑な構成だと思われますが、イメージ図ということでザックリ表現になってます。
ようやくNAT(Network Address Translation)とかの話
インターネット接続の再、プライベートIPアドレスだと被ってしまうよ問題が浮上し、「アドレス変換機能」というものを利用することで解決できることが分かりました。
で、「アドレス変換機能」には大きく分けて、
- NAT(Network Address Translation)
- 動的NAT
- 静的NAT
- NAPT(Network Address Port Translation)
の2種類があるようです。
ようやくNAT の話に戻ってきました。
で、なんで2種類あるですかね?
hirotsugu-furukawa.hatenablog.com
⇧ 上記サイト様によりますと、 NAPTを利用することで、複数の外部アクセスに対応できるようです。
NAPTは、(別名:IPマスカレード、PAT)と言われているようで、
⇧ 上記サイト様が詳しいです。
⇧ 上記サイト様によりますと、DMZ(DeMilitarized Zone)というものも存在する用です。
DMZ(DeMilitarized Zone)については、
⇧ 上記サイト様が詳しいです。
たびたび脱線してすみません。話をNAPT(別名:IPマスカレード、PAT)に戻しますと、で、このIPマスカレードには、
2種類あるらしいのですが、詳しい説明は、ネットワークに詳しそうな他サイト様を参考ください。(パソコンに疎いので申し訳ないですが。)
このポートフォワーディングを利用することで、仮想マシン(CentOS7 .4)内のOracle Database 12c Release 2 (12.2.0.1.0) へ外部(ホストOSであるWindows 10 Home)からネットワーク接続が実現できそうです。
今回は、このポートフォワーディングにトライしていきたいと思います。
ファイアーウォールの設定
アドレス変換機能は、ファイアーウォールでも行えるとあったので、CentOS7系のファイヤーウォールを活用してまいりましょう。
ちなみに、CentOSのバージョンによって通信に関わる設定を行うのに利用するコマンドが異なるようです。
バージョン | 通信の設定方法 |
---|---|
CentOS7系 | Firewalld |
CentOS6系 | iptables |
Firewalldは、CentOS 7から採用された「パケットフィルタリング」の仕組みです。パケットフィルタリングは、パケットの送受信において、あらかじめ指定したルールに基づいて通信の許可/拒否を制御する、セキュリティ対策の基礎手段です。
前バージョンのCentOS 6までは、これを「iptables」で行っていました。
ハマる前に理解する「Firewalld」の設定方法、「iptables」との違い:CentOS 7で始める最新Linux管理入門(4) - @IT
⇧ 上記サイト様が詳しいです。
さっそく、仮想マシンを起動します。今回は、VirtualBox で用意されている VBoxManageコマンドで起動していきたいと思います。
VboxManage list vms
VboxManage startvm [仮想マシン名] --type headless
VirtualBoxを起動すると、仮想マシンが起動できてます。
では、sshログインしていきます。
スーパーユーザー(root)になっておく必要があるので、ユーザーを切り替えます。
Vagrantで仮想マシンを作成してる場合、rootユーザーのパスワードのデフォルトはvagrant でいけるかと。
su -
スーパーユーザー(root)に切り替わりましたら、firewalldの状態を確認。
systemctl start firewalld
止まってるので、起動します。
firewall-cmd --state
自動起動するように設定の変更。
systemctl enable firewalld
デフォルトのゾーンのファイアーウォールの設定確認。
firewall-cmd --list-all
Oracle Database 12c Release 2 (12.2.0.1.0)へのtcp接続(ポートフォワーディング)のためのポートを解放。
firewall-cmd --zone=public --add-port=5500/tcp --permanent
firewall-cmd --zone=public --add-port=1521/tcp --permanent
設定を反映させます。
firewall-cmd --reload
Oracle Database 12c Release 2 (12.2.0.1.0)への接続
そいでは、oracleユーザーになっておきます。切り替えだと、環境変数が反映されない状態になってしまったので、exitコマンドで最初のログイン時(oracleユーザー)の状態まで戻ります。
sysdba権限でDBにログインします。
sqlplus / as sysdba
ORACLEインスタンスの起動とDBをマウントしておきます。
startup
そうしたらば、もう1つコマンドプロンプトを起動し、仮想マシンにsshログインし、Oracleリスナーを起動します。
lsnrctl start
では、Eclipseを起ち上げましたら、「パースペクティブ」をDBViewerに切り替えます。
「DB ツリー・ビュー」の「DBViewerPlugin」を選択した状態で右クリックし、「登録(A)」を選択します。
「データベース定義名」を適当に入力し、「ファイルの追加(F)」を選択。
※Oracleのサイトより、対応したバージョンのJDBCドライバをダウンロードしておく必要があります。
・JDBC, SQLJ, Oracle JPublisher and Universal Connection Pool (UCP)
⇧ 上記サイトでJDBCドライバをダウンロードできます。
自分は以前、WindowsのほうでOracle Database 12c Release 2 (12.2.0.1.0) をインストールしていたので、「C:¥app¥product¥12.2.0¥dbhome_1¥jdbc¥lib¥ojdbc8.jar」を選択しました。
「次へ(N)>」をクリック。
「JDBC Driver(J):」で、「oracle.jdbc.driver.OracleDriver」を選択。
「OK」を選択。
「接続文字列(S)」の<host>と<sid>には、Oracleリスナー起動時に表示されたHOSTとサービス名を指定します。
で、「テスト接続(T)」で無事....つながらないと。
⇧ 上記サイト様によりますと、新規接続時には、接続に時間がかかるようです。
一旦、「完了(F)」して、
「ウィンドウ(W)」>「設定(P)」を選択。
「DBViewer プラグイン」の「タイムアウト設定」の「接続タイムアウト(秒)(T):」を変更します。
300秒とかにします。
で、再度、接続を試みるも、エラー。
Oracleさんの見解によりますと、
I/O Exception: The Network Adapter could not establish the connection
だそうですが、
問題なのは、ユーザー名とパスワードを設定してなかったんですが....
再度、設定の編集で、接続を試みるもエラー、ムムム。
どうやら、接続ユーザー、接続パスワードは、sqlplusで接続時に使うものじゃないと駄目らしい?
仮想マシン内からだと、リスナー経由で接続できましたので、
そのユーザーとパスワードで試すも、エラー。
もしかしてだけど~、もしかしてだけど~、Windowsに以前インストールしていたOracle Database 12c Release 2 (12.2.0.1.0)のリスナーが影響してるんじゃないの?
⇧ 確かに、ホストOS側で同じポート番号つかってるけど、関係あるんですかね?
どうやら、それとは別の問題かしら。
⇧ 上記サイト様によりますと、NATのポートフォワーディングはVirtualBox での設定も必要だったみたいです。
「ネットワーク」で「NAT」が設定されてるアダプターのタブで、「高度」を開くと、「ポートフォワーディング(P)」があるので、選択。
をクリックして、「新規ポートフォワーディングルール」が追加できます。
⇧ 上記サイト様によりますと、ホストIP、ゲストIPはともに空にしておくようです。
編集します。ホストのポートはnetstat -n で使われてないポート番号を指定しましょう。
ということで、「OK」。
Windowsのファイヤーウォールの警告が出ましたら「アクセスを許可する(A)」を選択。
ゲストOSを再起動する必要があるようです。
一応、ORACLEインスタンスをシャットダウンしておき、切断してから、スーパーユーザー(root)に切り替えておきます。
⇧ 上記サイト様を参考に再起動
shutdown -r now
が、再起動したのかよく分からず。再起動したという仮定で、
sshログインし、sqlplusで接続。
別のコマンドプロンプトで、リスナーの状態を確認すると、起動されてないようなので、再起動はされたのでしょう。
リスナーを起動。
今度こそ、Eclipseで...エラー。
駄目だ...心が折れた。
時間も時間なので、明日へ持ち越しですな...毎度毎度こうも上手くいかないって何なすかね。他サイト様とかサクサク設定できているようなんですが....。
で、翌日。いろいろ調査してみました。
⇧ 上記サイト様によりますと、
ホストポートは既存のサービスとかぶらなければなんでも良いようですが、ユーザ権限だとウェルノンポートはバインドできないので、ハイポート(1024以上)を指定するのが良いようです。
ということのようです。ポート番号が大きいのにも理由があったとは...。
ウェルノンポートとは?
実際ポート自体は0から65535まで存在するが、そのなかでも0~1023までを「ウェルノウンポート番号」という。これらはIANAという団体により管理されている。
TCP/IPやUDPにおいて通信で利用されるポート番号のうち、メジャーなサービスやプロトコルが利用するために予約されているポート番号のことである。
80がHTTP、22がSSHとあるように、メジャーなサービスはポート番号が一般的に決め打ちされている。
とりあえず、0~1023は避けたほうが良いようです。
VirtualBox で該当の仮想マシンを選択した状態で「設定」>「ネットワーク」で、NATが割り当てられたアダプターの「高度(D)」「ポートフォワーディング(P)」を選択。
ホストポートを、
変更して、「OK」。
もう1つコマンドプロンプトを起ち上げ、oracleユーザーで仮想マシンにsshログインし、
リスナーを起動。
Eclipseで接続を試みるも、エラー。
Eclipseのネットワーク設定の問題か?
⇧ 上記サイト様によりますと、直接接続でいける?とのこと。「ウィンドウ」>「設定」のを選択し、「一般」>「ネットワーク接続」の「アクティブ・プロバイダー」で、「直接」を選べばOKのようです。
⇧ 上記サイト様によりますと、
アクティブプロバイダの違いは、次の通りです。
とのこと。変更し、「OK」。
一応、Eclipseを再起動してから、接続するも、エラー。
万策尽きた感がありますが、
⇧ 上記サイト様を参考にポートが解放できてるか確認してみたろころ、
駄目じゃん...。
で、原因を調査したところ、
⇧ 上記サイト様によりますと、
タイムアウト・エラーになるということは、IPアドレスそのものが存在していないということである。そのため、クライアント側の名前解決の結果が正しいかどうかを確認したり、pingコマンドを使ってサーバが存在しているか/サーバと通信できるかどうかを調べたりすればよい。
なお、ファイアウォール(パケット・フィルタ)を使ってポートをブロックしている場合もこのタイムアウト・エラーになるので、ファイアウォールの設定も確認するとよいだろう(ファイアウォールは、クライアント側、経路途中のルータ、サーバ側のいずれの場所でも使われる可能性があるので、注意すること)。
pingって、VirtualBox 側がNATで...通らないっすよね。
原因は別にありました。
すみません、ポートフォワーディングを思いっきり勘違いしていました。
Windows側にもOracle Database入れてしまってるんで、CentOS側のOracle Databaseに接続できてるのか微妙ですが、接続できたとしましょう。
ポートフォワーディングですが、
⇧ 上記サイト様でも仰っていますが、
接続先には、ポートフォワーディングで設定した、ホストOS側の情報を入力する必要があったようです。
ファイヤーウォールでポートを解放したのに、なぜ、直接、ゲストOS側の情報を接続先に指定しては駄目なのかがいまいち分かりませんが。
そして、NAT経由でのDB接続は実際に利用されるもんなんですかね?
なんとか、EclipseからCentOS7.4のOracle Database 12c Release 2 (12.2.0.1.0) へJDBC接続できたということで。
次は、DBにテーブルを作成して、JavaプログラミングでDB接続していきたいですね。
自分も、ITエンジニアスクールとかに通って勉強したいですね。
今回はこのへんで。