CentOS 7.4系にインストールしたOracle Database 12c Release 2 (12.2.0.1.0) へEclipseから接続を試みるために、ネットワークについて調べてみました

やっぱり、というかネットワークが鬼門じゃったよ、皆の衆!

すみません、取り乱しました。

/etc/hosts ファイルを編集して、ホストオンリーアダプターのIPアドレスを直接設定しとったよ、Oracleさんは...。

http://www.oracle.com/technetwork/jp/database/enterprise-edition/documentation/sionvbox-db12101onol6u4-2080482-ja.pdf

 

ちなみに、httpでネットワーク接続する際は、Webサーバー(Apache http server、Nginx、LightSpeedなどのこと)を仮想マシン内にインストールしておく必要がありますかね。(今回は、httpは関係ないですが)

まぁ、例のごとく、今回もハマりにハマってます。おかげでいつも休日が全部潰れてるという(涙)。

それでは、レッツトライ。

 

ポートを開くこと、ポートフォワーディングへの道

NAT(Network Address Translation)でも接続することができるんだそうです。

どうやら、ファイヤーウォールでポートを許可してあげれば良いようです。

te2u.hatenablog.jp

⇧  上記サイト様を参考にトライしてみたいと思います。

 

NAT(Network Address Translation)って?

そも、NAT(Network Address Translation)ってどういう仕組み?

48n.jp

NAT・NAPTとIPアドレス | IPラーニング

ayufishing.blog.fc2.com

⇧  上記サイト様が詳しいです。

NATは、プライベートIPアドレスグローバルIPアドレスに変換してくれるということのようです。(※ただし、一対一対応。人で言ったら、マンツーマンってことですかね。) 

 

突然ですが、ザックリとインターネットのしくみ

まず、インターネットにつながるには、グローバルIPアドレスが必要ですと。

その前に、各機器(パソコンやスマホルーターなどなど)には、必ず、MACアドレスIPアドレス(プライベートIPアドレス)というものが割り当てられています。

IPアドレスは、必要に応じて人間様の手で変更することができます。一方のMACアドレスは、機器にあらかじめ割り当てられたものです。変更することはできません。

「IPアドレス」と「MACアドレス」の違い|「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典

⇧  上記サイト様が説明してくれています。

  

で、何でMACアドレスIPアドレスの2つが必要かという経緯は、

milestone-of-se.nesuke.com

⇧  上記サイト様が詳しいです。 

いまでこそ、Ethernet という通信が主流になったようですが、昔は通信の規格が様々であったため、MACアドレスの情報を利用しない通信方法も存在したようです。

ルーターの負担(様々な通信に対応するにはコストがかかる)を減らすために、Ethernet主流の流れができあがったようです。

で、Ethernetには、IPアドレスMACアドレスの2つの情報(それ以外にも情報は必要ですが)が必要ということのようです。

 

ascii.jp

⇧  上記サイト様によりますと、

Ethernetでは、ハブによって複数のコンピュータやルータが接続され、物理的に通信できるのは「隣接ノード」となる。Ethernetではこの複数の隣接ノードの中から通信する1つのノードを示すためにMACアドレスが使われるのである。

ASCII.jp:EthernetでのID「MACアドレス」を理解する (2/4)|完全解剖「名前とアドレス」

となっていて、Ethernetでは、MACアドレスの情報を元に、最終的な宛先であるIPアドレスへ情報が届けられるということのようです。 

 

プライベートIPアドレスグローバルIPアドレス

IPアドレスには、大きく分けて

の 2種類があるようです。

なぜ、

の2つあるのか? 

tech.nikkeibp.co.jp

⇧  上記サイト様が詳しいです。

通常、会社や、自宅で利用している機器に、プライベートIPアドレスは被ることなく割り当てられています。

f:id:ts0818:20180407143637p:plain

⇧ A社、B社でネットワークが独立してる(閉じられてる)ので問題なし。

ですが、ネットワークをつなげようとしたときに、プライベートIPアドレスは重複する可能性がでてきてしまいます。

f:id:ts0818:20180407144003p:plain

⇧  上図の場合、A社とB社でネットワーク接続が行われた際に、192.168.1.3が被ってしまいます。 

そこで、「アドレス変換機能」の登場です。

みなさんも実感しているように,プライベートIPアドレスを使っている機器でもインターネットへアクセスできる。それは,インターネットと社内ネットの境界部分にアドレス変換機能を持った機器があるからだ。

家庭向けのブロードバンド・ルーターファイアウォールは,必ずアドレス変換機能が備えている。この機能があるおかげで,プライベートIPアドレスを使っている社内や家庭の端末も,インターネットへアクセスできる。

アドレス変換を使えば,IPアドレスが重複しても大丈夫? | 日経 xTECH(クロステック)

アドレス変換のイメージ図

f:id:ts0818:20180407150640p:plain

⇧  ルーターで、一意であるグローバルIPアドレスに変換してから通信することで、

みたいな感じで、区別できるようになる感じですかね。

「アドレス変換機能」は、ルーター以外にもL3スイッチなどでも利用できるようです。

detail.chiebukuro.yahoo.co.jp

 

※実際のネットワークはもっと複雑な構成だと思われますが、イメージ図ということでザックリ表現になってます。

 

 

ようやくNAT(Network Address Translation)とかの話

インターネット接続の再、プライベートIPアドレスだと被ってしまうよ問題が浮上し、「アドレス変換機能」というものを利用することで解決できることが分かりました。

で、「アドレス変換機能」には大きく分けて、

の2種類があるようです。 

ようやくNAT の話に戻ってきました。

で、なんで2種類あるですかね?

hirotsugu-furukawa.hatenablog.com

⇧  上記サイト様によりますと、 NAPTを利用することで、複数の外部アクセスに対応できるようです。

NAPTは、(別名:IPマスカレード、PAT)と言われているようで、

www.infraexpert.com

⇧  上記サイト様が詳しいです。

DMZとは?静的IPマスカレード/NAPTとは?

⇧  上記サイト様によりますと、DMZ(DeMilitarized Zone)というものも存在する用です。

DMZ(DeMilitarized Zone)については、

boxil.jp

⇧  上記サイト様が詳しいです。

 

たびたび脱線してすみません。話を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

www.atmarkit.co.jp

⇧  上記サイト様が詳しいです。 

 

さっそく、仮想マシンを起動します。今回は、VirtualBox で用意されている VBoxManageコマンドで起動していきたいと思います。

VboxManage list vms
VboxManage startvm [仮想マシン名] --type headless

f:id:ts0818:20180407163905p:plain

VirtualBoxを起動すると、仮想マシンが起動できてます。

f:id:ts0818:20180407164358p:plain

では、sshログインしていきます。

f:id:ts0818:20180407164542p:plain

スーパーユーザー(root)になっておく必要があるので、ユーザーを切り替えます。 

Vagrant仮想マシンを作成してる場合、rootユーザーのパスワードのデフォルトはvagrant でいけるかと。

su -

f:id:ts0818:20180407165150p:plain

スーパーユーザー(root)に切り替わりましたら、firewalldの状態を確認。 

systemctl start firewalld

f:id:ts0818:20180407190206p:plain

止まってるので、起動します。 

firewall-cmd --state

f:id:ts0818:20180407194128p:plain

自動起動するように設定の変更。 

systemctl enable firewalld

f:id:ts0818:20180407194349p:plain

デフォルトのゾーンのファイアーウォールの設定確認。 

firewall-cmd --list-all

f:id:ts0818:20180407194702p:plain

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

f:id:ts0818:20180407195101p:plain

設定を反映させます。 

firewall-cmd --reload

f:id:ts0818:20180407200214p:plain

f:id:ts0818:20180408113940p:plain

 

Oracle Database 12c Release 2 (12.2.0.1.0)への接続

そいでは、oracleユーザーになっておきます。切り替えだと、環境変数が反映されない状態になってしまったので、exitコマンドで最初のログイン時(oracleユーザー)の状態まで戻ります。

f:id:ts0818:20180407200833p:plain

sakusakuit.blog.fc2.com

sysdba権限でDBにログインします。

sqlplus / as sysdba

f:id:ts0818:20180407201154p:plain

ORACLEインスタンスの起動とDBをマウントしておきます。 

startup

f:id:ts0818:20180407201719p:plain

 そうしたらば、もう1つコマンドプロンプトを起動し、仮想マシンsshログインし、Oracleリスナーを起動します。

lsnrctl start

f:id:ts0818:20180407202113p:plain

f:id:ts0818:20180407202219p:plain

では、Eclipseを起ち上げましたら、「パースペクティブ」をDBViewerに切り替えます。

f:id:ts0818:20180407202720p:plain

「DB ツリー・ビュー」の「DBViewerPlugin」を選択した状態で右クリックし、「登録(A)」を選択します。

f:id:ts0818:20180407203004p:plain

「データベース定義名」を適当に入力し、「ファイルの追加(F)」を選択。

f:id:ts0818:20180407203259p:plain

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」を選択しました。

f:id:ts0818:20180407203644p:plain

「次へ(N)>」をクリック。

f:id:ts0818:20180407204229p:plain

JDBC Driver(J):」で、「oracle.jdbc.driver.OracleDriver」を選択。

f:id:ts0818:20180407204340p:plain

 「OK」を選択。

f:id:ts0818:20180407204459p:plain

「接続文字列(S)」の<host>と<sid>には、Oracleリスナー起動時に表示されたHOSTとサービス名を指定します。

f:id:ts0818:20180407204543p:plain

で、「テスト接続(T)」で無事....つながらないと。

f:id:ts0818:20180407204945p:plain

www.cosol.jp

⇧ 上記サイト様によりますと、新規接続時には、接続に時間がかかるようです。

 

一旦、「完了(F)」して、

f:id:ts0818:20180407205617p:plain

「ウィンドウ(W)」>「設定(P)」を選択。

f:id:ts0818:20180407205723p:plain

「DBViewer プラグイン」の「タイムアウト設定」の「接続タイムアウト(秒)(T):」を変更します。

f:id:ts0818:20180407205855p:plain

300秒とかにします。

f:id:ts0818:20180407210118p:plain

で、再度、接続を試みるも、エラー。

f:id:ts0818:20180407211419p:plain

Oracleさんの見解によりますと、

I/O Exception: The Network Adapter could not establish the connection

JDBC URLにおけるOracleリスナー・ポートのIPアドレスとマシン名が不適切です。

Oracleでの一般的エラー

だそうですが、 

f:id:ts0818:20180407211334p:plain

問題なのは、ユーザー名とパスワードを設定してなかったんですが....

再度、設定の編集で、接続を試みるもエラー、ムムム。

f:id:ts0818:20180407212447p:plain

どうやら、接続ユーザー、接続パスワードは、sqlplusで接続時に使うものじゃないと駄目らしい?

仮想マシン内からだと、リスナー経由で接続できましたので、 

f:id:ts0818:20180407213913j:plain

そのユーザーとパスワードで試すも、エラー。

f:id:ts0818:20180407221016p:plain

 もしかしてだけど~、もしかしてだけど~、Windowsに以前インストールしていたOracle Database 12c Release 2 (12.2.0.1.0)のリスナーが影響してるんじゃないの?

f:id:ts0818:20180407220411p:plain

f:id:ts0818:20180407220759p:plain

f:id:ts0818:20180407220845p:plain

⇧  確かに、ホストOS側で同じポート番号つかってるけど、関係あるんですかね?

どうやら、それとは別の問題かしら。

zorinos.seesaa.net

⇧ 上記サイト様によりますと、NATのポートフォワーディングはVirtualBox での設定も必要だったみたいです。

 

f:id:ts0818:20180407222231p:plain

「ネットワーク」で「NAT」が設定されてるアダプターのタブで、「高度」を開くと、「ポートフォワーディング(P)」があるので、選択。

f:id:ts0818:20180407222333p:plain

f:id:ts0818:20180407222638p:plain をクリックして、「新規ポートフォワーディングルール」が追加できます。

f:id:ts0818:20180407222434p:plain

d.hatena.ne.jp

⇧  上記サイト様によりますと、ホストIP、ゲストIPはともに空にしておくようです。

編集します。ホストのポートはnetstat -n で使われてないポート番号を指定しましょう。

f:id:ts0818:20180407222802p:plain

ということで、「OK」。

f:id:ts0818:20180407223321p:plain

Windowsファイヤーウォールの警告が出ましたら「アクセスを許可する(A)」を選択。

f:id:ts0818:20180407224317p:plain

 

ゲストOSを再起動する必要があるようです。 

一応、ORACLEインスタンスをシャットダウンしておき、切断してから、スーパーユーザー(root)に切り替えておきます。

f:id:ts0818:20180407224010p:plain

eng-entrance.com

⇧  上記サイト様を参考に再起動

shutdown -r now

f:id:ts0818:20180407224437p:plain

 が、再起動したのかよく分からず。再起動したという仮定で、

f:id:ts0818:20180407225229p:plain

sshログインし、sqlplusで接続。

f:id:ts0818:20180407225420p:plain

ORACLEインスタンスの起動とDBのマウント。

f:id:ts0818:20180407225646p:plain

別のコマンドプロンプトで、リスナーの状態を確認すると、起動されてないようなので、再起動はされたのでしょう。

f:id:ts0818:20180407230120p:plain

リスナーを起動。

f:id:ts0818:20180407230304p:plain

 

今度こそ、Eclipseで...エラー。

f:id:ts0818:20180407230605p:plain

 

駄目だ...心が折れた。

時間も時間なので、明日へ持ち越しですな...毎度毎度こうも上手くいかないって何なすかね。他サイト様とかサクサク設定できているようなんですが....。

で、翌日。いろいろ調査してみました。

 

 

qiita.com

⇧  上記サイト様によりますと、

ホストポートは既存のサービスとかぶらなければなんでも良いようですが、ユーザ権限だとウェルノンポートはバインドできないので、ハイポート(1024以上)を指定するのが良いようです。

VirtualBoxのNATアダプタでホストからゲストに通信する方法 - Qiita

ということのようです。ポート番号が大きいのにも理由があったとは...。

ウェルノンポートとは?

実際ポート自体は0から65535まで存在するが、そのなかでも0~1023までを「ウェルノウンポート番号」という。これらはIANAという団体により管理されている。

TCP/IPUDPにおいて通信で利用されるポート番号のうち、メジャーなサービスやプロトコルが利用するために予約されているポート番号のことである。

80がHTTP、22がSSHとあるように、メジャーなサービスはポート番号が一般的に決め打ちされている。

【3分で把握】ポート番号とは?と代表的なポート番号まとめ

eng-entrance.com

とりあえず、0~1023は避けたほうが良いようです。

VirtualBox で該当の仮想マシンを選択した状態で「設定」>「ネットワーク」で、NATが割り当てられたアダプターの「高度(D)」「ポートフォワーディング(P)」を選択。

f:id:ts0818:20180408132624p:plain

ホストポートを、

f:id:ts0818:20180408132424p:plain

 変更して、「OK」。

f:id:ts0818:20180408132522p:plain

そんでは、ORACLEインスタンスの起動とDBのマウント。

f:id:ts0818:20180408134107p:plain

もう1つコマンドプロンプトを起ち上げ、oracleユーザーで仮想マシンsshログインし、

f:id:ts0818:20180408134344p:plain

リスナーを起動。

f:id:ts0818:20180408134617p:plain

Eclipseで接続を試みるも、エラー。

f:id:ts0818:20180408134755p:plain

 

Eclipseのネットワーク設定の問題か? 

d.hatena.ne.jp

⇧  上記サイト様によりますと、直接接続でいける?とのこと。「ウィンドウ」>「設定」のを選択し、「一般」>「ネットワーク接続」の「アクティブ・プロバイダー」で、「直接」を選べばOKのようです。

f:id:ts0818:20180408135252p:plain

blog.livedoor.jp

⇧  上記サイト様によりますと、 

アクティブプロバイダの違いは、次の通りです。

  • 直接:すべての接続でプロキシー・サーバーを使用しない
  • ネイティブ:OS 内に検出された設定が使用される
  • マニュアル:Eclipse で定義済みの設定がされる

Eclipseでプロキシを設定する : quantum_chemistのblog

とのこと。変更し、「OK」。

f:id:ts0818:20180408135909p:plain

一応、Eclipseを再起動してから、接続するも、エラー。

f:id:ts0818:20180408140411p:plain

 

万策尽きた感がありますが、

ポートが空いてるか調べる – Linux memo

⇧  上記サイト様を参考にポートが解放できてるか確認してみたろころ、

f:id:ts0818:20180408145417p:plain

駄目じゃん...。

で、原因を調査したところ、

www.atmarkit.co.jp

⇧  上記サイト様によりますと、

 タイムアウト・エラーになるということは、IPアドレスそのものが存在していないということである。そのため、クライアント側の名前解決の結果が正しいかどうかを確認したり、pingコマンドを使ってサーバが存在しているか/サーバと通信できるかどうかを調べたりすればよい。

 なお、ファイアウォール(パケット・フィルタ)を使ってポートをブロックしている場合もこのタイムアウト・エラーになるので、ファイアウォールの設定も確認するとよいだろう(ファイアウォールは、クライアント側、経路途中のルータ、サーバ側のいずれの場所でも使われる可能性があるので、注意すること)。

ネットワークの接続拒否とタイムアウトの違いを知る:Tech TIPS - @IT

pingって、VirtualBox 側がNATで...通らないっすよね。

f:id:ts0818:20180408151934p:plain

 

原因は別にありました。 

すみません、ポートフォワーディングを思いっきり勘違いしていました。

Windows側にもOracle Database入れてしまってるんで、CentOS側のOracle Databaseに接続できてるのか微妙ですが、接続できたとしましょう。

f:id:ts0818:20180408152813p:plain

f:id:ts0818:20180408152959p:plain

 

ポートフォワーディングですが、

web.plus-idea.net

⇧  上記サイト様でも仰っていますが、

接続先には、ポートフォワーディングで設定した、ホストOS側の情報を入力する必要があったようです。

 

ファイヤーウォールでポートを解放したのに、なぜ、直接、ゲストOS側の情報を接続先に指定しては駄目なのかがいまいち分かりませんが。 

そして、NAT経由でのDB接続は実際に利用されるもんなんですかね?

なんとか、EclipseからCentOS7.4のOracle Database 12c Release 2 (12.2.0.1.0) へJDBC接続できたということで。

次は、DBにテーブルを作成して、JavaプログラミングでDB接続していきたいですね。

自分も、ITエンジニアスクールとかに通って勉強したいですね。

今回はこのへんで。