質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
iptables

iptablesは、一般的なLinuxに備わっているパケットフィルタリング型のファイアウォール機能。パケットフィルタリングルールおよびネットワークアドレス変換ルールを適用することが可能です。

HTTPヘッダー

Hypertext Transfer Protocol(HTTP)の中のHTTPヘッダフィールドはHTTPの要求やレスポンスの機能しているパラメーターが含まれます。その要求もしくはレスポンスライン(メッセージの最初の一行)でメッセージヘッダを作ります。

ソフトウェアテスト

ソフトウェアテストは、プログラムを実行し、要求通りに正しく動作が行えているかどうか確認する作業です。プログラム中のバグをできる限り多く発見することを目標として行われます。

Q&A

解決済

1回答

3165閲覧

外部との疎通テストで接続できない現象を再現したい

XNXSXMXR

総合スコア239

iptables

iptablesは、一般的なLinuxに備わっているパケットフィルタリング型のファイアウォール機能。パケットフィルタリングルールおよびネットワークアドレス変換ルールを適用することが可能です。

HTTPヘッダー

Hypertext Transfer Protocol(HTTP)の中のHTTPヘッダフィールドはHTTPの要求やレスポンスの機能しているパラメーターが含まれます。その要求もしくはレスポンスライン(メッセージの最初の一行)でメッセージヘッダを作ります。

ソフトウェアテスト

ソフトウェアテストは、プログラムを実行し、要求通りに正しく動作が行えているかどうか確認する作業です。プログラム中のバグをできる限り多く発見することを目標として行われます。

0グッド

0クリップ

投稿2019/11/21 01:20

編集2019/11/21 02:45

WebアプリケーションからWebAPIへアクセスする際に「たまたま接続できなかった」を再現する場合、プログラムコードでわざとエラーを発生させたりしていますが、コードを注入せずエラーを再現させたいのですが、方法が思いつきません。

やってみたこと

iptablesを使って特定IPアドレスのアウトバウンドをドロップすることはできましたが、特定のURLを含む場合ができませんでした。

# できた iptables -A OUTPUT -d 192.168.0.10/32 -j DROP # できなかった iptables -A OUTPUT -d 192.168.0.10/32 -m string --algo bm --string 'phpinfo' -j DROP

↑ローカルエリアのサーバーへ、「phpinfo」を含む場合はドロップする仕掛けとして考えたコマンドラインですが、疎通できてしまいます。

また同じURLでも1回目は通信NG、2回目は通信OKという具合にもテストしたく、HTTPのXヘッダーを作り、そのXヘッダーを含む外部通信を遮断したいのですが、これも方法が思い当たりません。

何かよい方法(別途ツールがあれば、それとか)がありますでしょうか。

【追記】特定URLのアウトバウンドをDROPができた

一部解決できました。
アルゴリズムを「bm」から「kmp」に変えると遮断できました。

[root@www ~]# iptables -A OUTPUT -d 192.168.0.10/32 -m string --algo kmp --string 'phpinfo' -j DROP [root@www ~]# wget http://192.168.0.10/phpinfo.php --2019-11-21 11:06:02-- http://192.168.0.10/phpinfo.php Connecting to 192.168.0.10:80... connected. HTTP request sent, awaiting response... No data received. Retrying.

※これで特定URLに対しては全DROPができましたが、Webアプリケーション内では同じURLに対して2回通信しているので、1回目はエラー、2回目は正常というテストはできません。

Webアプリケーションの環境

・PHP5.6~、nginx1.16.1
・PHPからcURLまたはソケット通信で外部へ通信
・外部のWebAPIはHTTPS接続。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hentaiman

2019/11/21 01:33

iptablesでやるよりはテストプログラム用意した方が良いと思いますが、手を加えたくないのはどのプログラムでしょう DROPを通信NGとしたいのですか?
dameo

2019/11/21 01:53

実際にリクエストした接続が拒否されることが必要なのでしょうか? それともHTTPでエラーになってもいいのでしょうか? テストスクリプトのようなものがあってそれを実行するのでしょうか? テストスクリプト実行時そのマシンには管理者権限でアクセスできるのでしょうか?
XNXSXMXR

2019/11/21 01:55

WebアプリケーションはPHPで作っており、あるWebAPIの専用クラスをアプリケーション側で呼び出しています。 呼び出し元プログラムも専用クラスも手を加えたくありません。 受入テストをする際に、プログラムに手を加えずサーバーやインフラ環境の設定を変えるか何かでテストできればいいのですが・・・。 WebAPIはHTTPステータスコードなどで成否が判定できますが、そもそも接続できない事を再現したかったので、iptablesで試した時はDROPにしました。
dameo

2019/11/21 02:02

受入テストということは、ブラウザを直接手で操作してテストしているのでしょうか?
XNXSXMXR

2019/11/21 02:05

> dameo 様 接続拒否でもHTTPでエラーでもかまわなく、要はWebAPIが正常に返すコード以外でネットワーク上のエラーが再現できればいいなと思っています。 CIなどは導入していない環境です。(デプロイとかも手動でしている、昔ながらのやり方です) シンプルに、本番環境とは別にテスト環境があり、ブラウザで操作して確認しております。 テスト担当者はコンソール等でアクセスはできます。
dameo

2019/11/21 02:12

では、ブラウザで操作する度にiptablesを書き換えるとかではダメなのでしょうか? ぶっちゃけ192.168.0.10のケーブル抜く/挿すとかが出来るなら、それでもいいです
XNXSXMXR

2019/11/21 02:37

> dameo 様 そうなりますよね。 WebAPIへの通信を全て遮断ならそれでいいのですが、ブラウザからWebアプリへ1回アクセスした際に、Webアプリ内ではWebAPIへの通信を2回しています。 1回目は通信エラー、2回目は成功というふうにもテストしたく、頭を悩ませています。
hentaiman

2019/11/21 02:51

なるほどリトライのテストもしたいのか WEBアプリからは任意のヘッダーやオプション付けても良いようだしやはりサーバー側のプログラム手を加えた方がいいんじゃないですかね オプションつけなければ通常動作するんだし
guest

回答1

0

ベストアンサー

iptablesを使う場合

iptablesはデフォルトではL7を扱うことは出来ないのでl7-filterを使う必要があります。
が、HTTPSでの通信だと通信内容までは把握出来ないのでやっぱり無理だと思います。

多分一番簡単だが、ソースコードの設定変更が必要になる場合が多い

インターネットに出る際にHTTPSをキャプチャするような設定(mitmする設定)のProxyを経由させて、Proxy側で通信内容をキャプチャ&ブロックする。

  1. ホストのデフォルト通信をそのProxy経由になるようにする
  2. Proxyで内容をキャプチャして一定の条件の時はブロックするような設定を行う

ソースコードを変更せずにそのまま通信できるかは採用しているHTTPクライアント次第

確実に出来るが手間が多い

  1. キャプチャ&ブロック用サーバをインターネット上に用意する
  2. 1.のサーバにテスト用URLの証明書を取得/設定する
  3. テスト実施サーバのhostsでテスト用FQDNを1のサーバのIPに向ける(* テスト用のFQDNを変更出来るのであれば必要無し)
  4. 1のサーバで全リクエストを受け付けて、特定の条件の通信があった場合はそれに合った処理を、それ以外の処理は本来のテスト用URLからの通信を受けて返却するような仕組みを作る(PHPで作っても良いし、内容によってはnginxやsquid,Apache+mod_proxy等の設定でもできそうな気もします)

投稿2019/11/21 02:21

tanat

総合スコア18713

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

XNXSXMXR

2019/11/21 02:47

回答ありがとうございます。 WebAPIへの通信がHTTPSなので、やっぱ無理なんですね・・・。
dameo

2019/11/21 03:08

Proxy経由だと、接続自体を拒否する設定ができるのでしょうか? キャプチャする前提の話は、DNSをいじってテスト用証明書を使わせるんですね そこまでは思いついてなかったです
tanat

2019/11/21 03:10

> XNXSXMXRさん 試してはいませんが、iptablesでは無理なんじゃないかなと思います。
tanat

2019/11/21 03:13

> dameoさん 接続自体をどの時点で拒否できるは、採用するProxyの設定次第かなと思います。 要件的にはそこまで厳密である必要は無い様に見えたので、「X-HTTPヘッダの条件が合致すれば4XXを返す」ような設定であれば多くのProxyで割と簡単に設定可能だと思います。
dameo

2019/11/21 03:20

> tanatさん 質問者さんが「WebAPIはHTTPステータスコードなどで成否が判定できますが、そもそも接続できない事を再現したかった」とおっしゃってたので、多分その意図にはそわないかもですよ。 そして仮に何らかの条件で接続を切れたとして、今度いつ再接続可能にするのか?とかそういう問題もあり、そんなProxyなさそうと思ってました。
tanat

2019/11/21 03:31

> dameoさん > 「WebAPIはHTTPステータスコードなどで成否が判定できますが、そもそも接続できない事を再現したかった」 に関しては確かに内部のProxyでは対応しきれないと思います。 一方で >「接続拒否でもHTTPでエラーでもかまわなく、要はWebAPIが正常に返すコード以外でネットワーク上のエラーが再現できればいいなと思っています。」 ともあるので、そんなに厳密である必要は無いのかなと思っての回答と思っていただければ。
dameo

2019/11/21 03:37

あ、確かに!見落としてました。すみません。 私はこの回答に全面的に賛成なのですが、さっき追記・修正依頼のところで質問者さんに書こうと思ってたことだけ最後に書いておきます。 個人的な感覚でいうと、受入テストでここまでしなくていいんではないか?(ブラウザからのリクエストの途中でAPI鯖が落ちた場合のテスト)と思いました笑
tanat

2019/11/21 03:54

APIサーバの高負荷時にタイムアウトしてしまう様なケースはあり得るので、その際の挙動は確認しておくに越したことは無いのかなと。 とはいえ、そこまでテストが必要であれば、 通常はテストがしやすいような設計をする必要があるので、 後から何とかするのは中々手間がかかりますね。
hentaiman

2019/11/21 05:55

iptablesでL7の制御できるんですね、知らなかった DROP(timeout)じゃなくても正常なレスポンス以外が返ってくれば良いとなるとやりたい事明確にしてテスト出来るようにプログラム組んだ方が良い点に物凄く同意です
XNXSXMXR

2019/11/24 06:14

> dameoさん お付き合いいただきありがとうございました。 たしかに受入テストでここまでする?というのもごもっともなのですが、今回そういう事が必要になってきましたので・・・(^^;
dameo

2019/11/24 06:17

ご愁傷さまです・・・
XNXSXMXR

2019/11/24 06:22

> tanatさん ご回答ありがとうございました。L7-Filterがあることは初めてしりました。 今後はご指摘のように「テストしやすい設計」も意識して考えていきたいと思います。
XNXSXMXR

2019/11/24 06:27

> hentaimanさん お付き合いいただきありがとうございました。 テストをするために、どこまで実施するのか・許容するのか(環境を変更してよいのか、こういう挙動ならよしとするのか)も含めて、「テストしやすい設計」というのを考えていこうと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問