質問: linux上のJavaプログラムで、送信元IPを制限しているAPIに接続する(https)ようなことをしています。 API側ではこちらのグローバルIPを許可して穴あけした「らしい」状態で、この許可作業が正しく設定されているかどうかをこちらで確認するのには ``` # telnet XXX.XXX.XXX.XXX 443 ``` で `Connected to XXX.XXX.XXX.XXX.` の応答があれば確認OKだとばかり思っていたのですが 適当な私用のさくらのVPSやAWSのインスタンスから上記コマンドで確認してみたら同じくConnected to~が出てしまったのであてがはずれ(別のテストサーバで実施した際は何も応答がなかったので、この確認方法で問題ないと思っていた)、適切な確認方法がわからない状態です。 サーバ間通信において、正常に穴あけされているかどうか確認する適切なコマンドを教えてください。 --- 接続先はLBで、接続元のIPを制限しています(許可IP以外は通さない)という情報を頂いています。 改めてtelnet以外のコマンドで確認したところ、 * wget -S --spider https://XXX.XXX.XXX.XXX/ これは無関係のサーバからもConnecting to XXX.XXX.XXX.XXX... connected.と返答 * curl -k -l https://XXX.XXX.XXX.XXX/ 無関係のサーバからは暫くした後curl: (56) SSL read: errno -5961と返答(許可IPからはhtml) →先日はcurlでも応答があった旨書いており、logにも残っているのですが、現状はこうなりました ので、curlでやるのが信憑性があるだろうか? という風に短絡的には思っています。ただし、情報追加修正のご指摘でも頂いておりますが、疎通確認の方法はケースにより異なるというように認識しております。ですが、その「どのケースの際にはこの確認方法」という手法がわからないため、今後のためにご助言など頂けませんでしょうか。wget, curl, telnet以外の方法や、検索ワードなどでもありがたいのですが、よろしくお願い致します。
回答: ロードバランサを介している旨の追加情報のご提供ありがとうございます。ほかのかたが指摘しておられることと重なりますが、アクセス制御より前にロードバランサがTCP/443の接続を受け付けてしまっている可能性もありますね。 ですので単に疎通だけでなく、通信内容をきちんと確認できる方法で確認したほうがいいと思います。たとえばopensslのs_client(1)を使った場合、アクセス制限がなにもなければ次のような結果が得られるはずです。 ``` $ openssl s_client -connect 相手先ホスト名:443 CONNECTED(00000003) <= 接続成功 ここに、証明書チェーンの詳細が表示される ここに、TLS (SSL) ハンドシェークの詳細が表示される TLSが確立すれば以下の内容が表示されるGET /APIのURI HTTP/1.1 <= APIへのリクエスト (GET等) を入力 Host: 相手先ホスト名 ここにAPIからの応答が表示される closed ``` アクセス制限が行われていれば、上のどこかでアクセスを拒否されると思われます。 ##### ちなみに 本来、サービスが正常動作しているかどうかの判断基準やそれを確認するための手順はサービスを利用する側で検討するものではなく、サービスを**設計・提供している側が明示すべき**ものとも考えられます。もしも差支えなければ、先方の担当者に確認手順の提示を求めてもよいのではないかと (第8層から上はこの場のスコープ外かな)。