ケーブルを切断したり、接続したり、インターフェイスを閉じたり、開いたりする以外に、プログラムがインターネットから切断して再び回復する他の方法はありますか?
これは、プログラムがこの状況にどのように反応するかを理解するために必要です。
この場合、1つのプログラムの動作に興味があるので、1つのアプリケーションだけが切断されれば十分ですが、一方ですべてのプログラムの接続が切断される解決策も良いでしょう。
私がシミュレートしたいプログラミング以外の例は、コンピュータと「インターネットが出てくる場所」の間にスイッチがあり、インターネットとスイッチの間のケーブルを切断する場合です。この場合、コンピュータの接続が切断されますが、コンピュータまたはアプリケーションは正確に何が起こったのかを検出できません。
答え1
プログラムが通信する必要があるIPアドレスとポート番号を知っている場合、考えられる解決策は、ローカルファイアウォールルールを使用してアプリケーションに関連するすべてのネットワークパケットを破棄するか、カスタム--reject-with
タイプを使用することです。
iptables
以下の例では、本質的に大きな変更なしに適用する必要がある用語を使用していますが、firewalld
同じ概念をすべてのnftables
ファイアウォール管理システムに適用する必要があります。
すべてのアイテムを削除してください。ローカルゲートウェイの外部のどこかでネットワークの中断をシミュレートします。つまり、ローカルセグメントとゲートウェイへの接続は依然として有効ですが、その領域の外側のパケットはシステムにまったく到達しません。これによりネットワーク接続がタイムアウトします。実際に、エラーシナリオ中にルータなどがエラー検出を開始した場合、これは最終的に次のような状況に変わることがあります。
REJECTの使用
--reject-with icmp-[host|net]-unreachable
:以前と同じですが、シミュレートされたルーターは接続損失を検出し、失敗したリンクを介して接続しようとしたすべてのホストにエラーを報告しました。これにより、アプリケーションは切断を検出し、タイムアウト状況よりも早くユーザーにエラーを報告します。 (もちろん、誰かがエラーが発生したと推定される場所とシステム間のICMPエラー応答をブロックした可能性があるため、接続エラーは「すべてを削除」する状況と似ています。)
他の可能なシナリオ:
設定されたDNSリゾルバサーバのポート53から着信応答(TCPとUDP)の両方を削除します。これは DNS サーバーのエラーをシミュレートします。既存の接続は機能し、既知のIPアドレスへの接続は引き続き機能しますが、ホスト名を介した接続は失敗します。
アプリケーションに関連付けられたTCPポートから:REJECT
--reject-with tcp-reset
アプリケーションに必要なサービスはリモートホスト上で実行されていませんが、リモートホスト自体は正常に動作する状況をシミュレートするために使用されます。 (つまり、リモートホストがリブート中であるか、ある種のメンテナンスを受けており、アプリケーション関連サービスを終了していることをシミュレートします。)