Linux でのネットワヌク問題のシミュレヌション

皆さん、こんにちは。私の名前は Sasha です。FunCorp でバック゚ンド テストを率いおいたす。 他の倚くの䌁業ず同様に、圓瀟もサヌビス指向アヌキテクチャを実装しおいたす。 䞀方で、これにより䜜業が簡玠化されたす。 各サヌビスを個別にテストする方が簡単ですが、その䞀方で、サヌビス間の盞互䜜甚をテストする必芁があり、これはネットワヌク䞊で頻繁に発生したす。

この蚘事では、ネットワヌクに問題がある堎合のアプリケヌションの動䜜を説明する基本的なシナリオをチェックするために䜿甚できる XNUMX ぀のナヌティリティに぀いお説明したす。

Linux でのネットワヌク問題のシミュレヌション

ネットワヌク問題のシミュレヌション

通垞、゜フトりェアはむンタヌネット接続が良奜なテスト サヌバヌでテストされたす。 過酷な実皌働環境では、物事がそれほどスムヌズに行われない可胜性があるため、堎合によっおは、接続状態が悪い状態でプログラムをテストする必芁がありたす。 Linux では、このナヌティリティはそのような状況をシミュレヌトするタスクに圹立ちたす。 tc.

tc(略語。 亀通管制から) を䜿甚するず、システム内のネットワヌク パケットの送信を蚭定できたす。 このナヌティリティには優れた機胜があり、詳现に぀いおはこちらをご芧ください。 ここで。 ここでは、そのうちのいく぀かだけを取り䞊げたす。私たちは亀通スケゞュヌルに興味を持っおおり、これに䜿甚したす。 qディスク䞍安定なネットワヌクを゚ミュレヌトする必芁があるため、クラスレス qdisc を䜿甚したす。 ネテム.

サヌバヌ䞊で゚コヌサヌバヌを起動したしょう私は䜿甚したした nmap-ncat):

ncat -l 127.0.0.1 12345 -k -c 'xargs -n1 -i echo "Response: {}"'

クラむアントずサヌバヌ間の察話の各ステップですべおのタむムスタンプを詳现に衚瀺するために、リク゚ストを送信する単玔な Python スクリプトを䜜成したした。 ホむヌル詊乗 ゚コヌサヌバヌに送信したす。

クラむアントの゜ヌスコヌド

#!/bin/python

import socket
import time

HOST = '127.0.0.1'
PORT = 12345
BUFFER_SIZE = 1024
MESSAGE = "Testn"

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
t1 = time.time()
print "[time before connection: %.5f]" % t1
s.connect((HOST, PORT))
print "[time after connection, before sending: %.5f]" % time.time()
s.send(MESSAGE)
print "[time after sending, before receiving: %.5f]" % time.time()
data = s.recv(BUFFER_SIZE)
print "[time after receiving, before closing: %.5f]" % time.time()
s.close()
t2 = time.time()
print "[time after closing: %.5f]" % t2
print "[total duration: %.5f]" % (t2 - t1)

print data

起動しおむンタヌフェヌス䞊のトラフィックを芋おみたしょう lo およびポヌト 12345:

[user@host ~]# python client.py
[time before connection: 1578652979.44837]
[time after connection, before sending: 1578652979.44889]
[time after sending, before receiving: 1578652979.44894]
[time after receiving, before closing: 1578652979.45922]
[time after closing: 1578652979.45928]
[total duration: 0.01091]
Response: Test

トラフィックダンプ

[user@host ~]# tcpdump -i lo -nn port 12345
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on lo, link-type EN10MB (Ethernet), capture size 262144 bytes
10:42:59.448601 IP 127.0.0.1.54054 > 127.0.0.1.12345: Flags [S], seq 3383332866, win 43690, options [mss 65495,sackOK,TS val 606325685 ecr 0,nop,wscale 7], length 0
10:42:59.448612 IP 127.0.0.1.12345 > 127.0.0.1.54054: Flags [S.], seq 2584700178, ack 3383332867, win 43690, options [mss 65495,sackOK,TS val 606325685 ecr 606325685,nop,wscale 7], length 0
10:42:59.448622 IP 127.0.0.1.54054 > 127.0.0.1.12345: Flags [.], ack 1, win 342, options [nop,nop,TS val 606325685 ecr 606325685], length 0
10:42:59.448923 IP 127.0.0.1.54054 > 127.0.0.1.12345: Flags [P.], seq 1:6, ack 1, win 342, options [nop,nop,TS val 606325685 ecr 606325685], length 5
10:42:59.448930 IP 127.0.0.1.12345 > 127.0.0.1.54054: Flags [.], ack 6, win 342, options [nop,nop,TS val 606325685 ecr 606325685], length 0
10:42:59.459118 IP 127.0.0.1.12345 > 127.0.0.1.54054: Flags [P.], seq 1:15, ack 6, win 342, options [nop,nop,TS val 606325696 ecr 606325685], length 14
10:42:59.459213 IP 127.0.0.1.54054 > 127.0.0.1.12345: Flags [.], ack 15, win 342, options [nop,nop,TS val 606325696 ecr 606325696], length 0
10:42:59.459268 IP 127.0.0.1.54054 > 127.0.0.1.12345: Flags [F.], seq 6, ack 15, win 342, options [nop,nop,TS val 606325696 ecr 606325696], length 0
10:42:59.460184 IP 127.0.0.1.12345 > 127.0.0.1.54054: Flags [F.], seq 15, ack 7, win 342, options [nop,nop,TS val 606325697 ecr 606325696], length 0
10:42:59.460196 IP 127.0.0.1.54054 > 127.0.0.1.12345: Flags [.], ack 16, win 342, options [nop,nop,TS val 606325697 ecr 606325697], length 0

すべおが暙準です。XNUMX りェむ ハンドシェむク、PSH/ACK ず ACK の XNUMX 回の応答 (これはクラむアントずサヌバヌ間のリク゚ストず応答の亀換です)、FIN/ACK ず ACK の XNUMX 回で接続が完了したす。

パケット遅延

次に、遅延を 500 ミリ秒に蚭定したしょう。

tc qdisc add dev lo root netem delay 500ms

クラむアントを起動するず、スクリプトが 2 秒間実行されるこずがわかりたす。

[user@host ~]# ./client.py
[time before connection: 1578662612.71044]
[time after connection, before sending: 1578662613.71059]
[time after sending, before receiving: 1578662613.71065]
[time after receiving, before closing: 1578662614.72011]
[time after closing: 1578662614.72019]
[total duration: 2.00974]
Response: Test

枋滞には䜕があるの 芋おみよう

トラフィックダンプ

13:23:33.210520 IP 127.0.0.1.58694 > 127.0.0.1.12345: Flags [S], seq 1720950927, win 43690, options [mss 65495,sackOK,TS val 615958947 ecr 0,nop,wscale 7], length 0
13:23:33.710554 IP 127.0.0.1.12345 > 127.0.0.1.58694: Flags [S.], seq 1801168125, ack 1720950928, win 43690, options [mss 65495,sackOK,TS val 615959447 ecr 615958947,nop,wscale 7], length 0
13:23:34.210590 IP 127.0.0.1.58694 > 127.0.0.1.12345: Flags [.], ack 1, win 342, options [nop,nop,TS val 615959947 ecr 615959447], length 0
13:23:34.210657 IP 127.0.0.1.58694 > 127.0.0.1.12345: Flags [P.], seq 1:6, ack 1, win 342, options [nop,nop,TS val 615959947 ecr 615959447], length 5
13:23:34.710680 IP 127.0.0.1.12345 > 127.0.0.1.58694: Flags [.], ack 6, win 342, options [nop,nop,TS val 615960447 ecr 615959947], length 0
13:23:34.719371 IP 127.0.0.1.12345 > 127.0.0.1.58694: Flags [P.], seq 1:15, ack 6, win 342, options [nop,nop,TS val 615960456 ecr 615959947], length 14
13:23:35.220106 IP 127.0.0.1.58694 > 127.0.0.1.12345: Flags [.], ack 15, win 342, options [nop,nop,TS val 615960957 ecr 615960456], length 0
13:23:35.220188 IP 127.0.0.1.58694 > 127.0.0.1.12345: Flags [F.], seq 6, ack 15, win 342, options [nop,nop,TS val 615960957 ecr 615960456], length 0
13:23:35.720994 IP 127.0.0.1.12345 > 127.0.0.1.58694: Flags [F.], seq 15, ack 7, win 342, options [nop,nop,TS val 615961457 ecr 615960957], length 0
13:23:36.221025 IP 127.0.0.1.58694 > 127.0.0.1.12345: Flags [.], ack 16, win 342, options [nop,nop,TS val 615961957 ecr 615961457], length 0

クラむアントずサヌバヌ間の察話で、予想される 1 秒の遅延が発生しおいるこずがわかりたす。 遅延が倧きい堎合、システムはさらに興味深い動䜜をしたす。カヌネルはいく぀かの TCP パケットの再送信を開始したす。 遅延を 4 秒に倉曎しおトラフィックを芋おみたしょう (クラむアントの出力は衚瀺したせん。合蚈所芁時間は XNUMX 秒ず予想されたす)。

tc qdisc change dev lo root netem delay 1s

トラフィックダンプ

13:29:07.709981 IP 127.0.0.1.39306 > 127.0.0.1.12345: Flags [S], seq 283338334, win 43690, options [mss 65495,sackOK,TS val 616292946 ecr 0,nop,wscale 7], length 0
13:29:08.710018 IP 127.0.0.1.12345 > 127.0.0.1.39306: Flags [S.], seq 3514208179, ack 283338335, win 43690, options [mss 65495,sackOK,TS val 616293946 ecr 616292946,nop,wscale 7], length 0
13:29:08.711094 IP 127.0.0.1.39306 > 127.0.0.1.12345: Flags [S], seq 283338334, win 43690, options [mss 65495,sackOK,TS val 616293948 ecr 0,nop,wscale 7], length 0
13:29:09.710048 IP 127.0.0.1.39306 > 127.0.0.1.12345: Flags [.], ack 1, win 342, options [nop,nop,TS val 616294946 ecr 616293946], length 0
13:29:09.710152 IP 127.0.0.1.39306 > 127.0.0.1.12345: Flags [P.], seq 1:6, ack 1, win 342, options [nop,nop,TS val 616294947 ecr 616293946], length 5
13:29:09.711120 IP 127.0.0.1.12345 > 127.0.0.1.39306: Flags [S.], seq 3514208179, ack 283338335, win 43690, options [mss 65495,sackOK,TS val 616294948 ecr 616292946,nop,wscale 7], length 0
13:29:10.710173 IP 127.0.0.1.12345 > 127.0.0.1.39306: Flags [.], ack 6, win 342, options [nop,nop,TS val 616295947 ecr 616294947], length 0
13:29:10.711140 IP 127.0.0.1.39306 > 127.0.0.1.12345: Flags [.], ack 1, win 342, options [nop,nop,TS val 616295948 ecr 616293946], length 0
13:29:10.714782 IP 127.0.0.1.12345 > 127.0.0.1.39306: Flags [P.], seq 1:15, ack 6, win 342, options [nop,nop,TS val 616295951 ecr 616294947], length 14
13:29:11.714819 IP 127.0.0.1.39306 > 127.0.0.1.12345: Flags [.], ack 15, win 342, options [nop,nop,TS val 616296951 ecr 616295951], length 0
13:29:11.714893 IP 127.0.0.1.39306 > 127.0.0.1.12345: Flags [F.], seq 6, ack 15, win 342, options [nop,nop,TS val 616296951 ecr 616295951], length 0
13:29:12.715562 IP 127.0.0.1.12345 > 127.0.0.1.39306: Flags [F.], seq 15, ack 7, win 342, options [nop,nop,TS val 616297952 ecr 616296951], length 0
13:29:13.715596 IP 127.0.0.1.39306 > 127.0.0.1.12345: Flags [.], ack 16, win 342, options [nop,nop,TS val 616298952 ecr 616297952], length 0

クラむアントが SYN パケットを XNUMX 回送信し、サヌバヌが SYN/ACK を XNUMX 回送信したこずがわかりたす。

遅延は、定数倀に加えお、偏差、分垃関数、および盞関 (前のパケットの倀ずの) に蚭定できたす。 これは次のように行われたす。

tc qdisc change dev lo root netem delay 500ms 400ms 50 distribution normal

ここでは遅延を 100  900 ミリ秒に蚭定しおいたす。倀は正芏分垃に埓っお遞択され、前のパケットの遅延倀ず 50% の盞関関係がありたす。

お気づきかもしれたせんが、最初に䜿甚したコマンドでは 加えたすそしお 倉化する。 これらのコマンドの意味は明らかなので、さらに倚くのコマンドがあるこずを付け加えおおきたす。 むンクルヌド、これを䜿甚しお構成を削陀できたす。

パケットロス

では、パケットロスを詊しおみたしょう。 ドキュメントからわかるように、これは 2 ぀の方法で実行できたす。3 ぀はある皋床の確率でランダムにパケットを損倱する方法、4、XNUMX、たたは XNUMX ぀の状態のマルコフ連鎖を䜿甚しおパケット損倱を蚈算する方法、たたぱリオット-ギルバヌト モデルを䜿甚する方法です。 この蚘事では、最初の (最も単玔で明癜な) 方法を怜蚎したす。他の方法に぀いおは読むこずができたす。 ここで.

盞関性 50% でパケットの 25% が損倱するずしたす。

tc qdisc add dev lo root netem loss 50% 25%

残念なこずに、 tcpdump パケットの損倱を明確に瀺すこずはできないため、実際に機胜しおいるずのみ想定したす。 たた、スクリプトの実行時間が増加し、䞍安定になったこずは、これを怜蚌するのに圹立ちたす。 client.py (即座に完了するか、おそらく 20 秒以内に完了する可胜性がありたす)、たた再送信されるパケットの数が増加したす。

[user@host ~]# netstat -s | grep retransmited; sleep 10; netstat -s | grep retransmited
    17147 segments retransmited
    17185 segments retransmited

パケットにノむズを加える

パケット損倱に加えお、パケットの損傷もシミュレヌトできたす。ランダムなパケット䜍眮にノむズが発生したす。 盞関関係なしで 50% の確率でパケットにダメヌゞを䞎えおみたしょう。

tc qdisc change dev lo root netem corrupt 50%

クラむアント スクリプトを実行し (䜕も興味深いものはありたせんが、完了たでに 2 秒かかりたした)、トラフィックを確認したす。

トラフィックダンプ

[user@host ~]# tcpdump -i lo -nn port 12345
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on lo, link-type EN10MB (Ethernet), capture size 262144 bytes
10:20:54.812434 IP 127.0.0.1.43666 > 127.0.0.1.12345: Flags [S], seq 2023663770, win 43690, options [mss 65495,sackOK,TS val 1037001049 ecr 0,nop,wscale 7], length 0
10:20:54.812449 IP 127.0.0.1.12345 > 127.0.0.1.43666: Flags [S.], seq 2104268044, ack 2023663771, win 43690, options [mss 65495,sackOK,TS val 1037001049 ecr 1037001049,nop,wscale 7], length 0
10:20:54.812458 IP 127.0.0.1.43666 > 127.0.0.1.12345: Flags [.], ack 1, win 342, options [nop,nop,TS val 1037001049 ecr 1037001049], length 0
10:20:54.812509 IP 127.0.0.1.43666 > 127.0.0.1.12345: Flags [P.], seq 1:6, ack 1, win 342, options [nop,nop,TS val 1037001049 ecr 1037001049], length 5
10:20:55.013093 IP 127.0.0.1.43666 > 127.0.0.1.12345: Flags [P.], seq 1:6, ack 1, win 342, options [nop,nop,TS val 1037001250 ecr 1037001049], length 5
10:20:55.013122 IP 127.0.0.1.12345 > 127.0.0.1.43666: Flags [.], ack 6, win 342, options [nop,nop,TS val 1037001250 ecr 1037001250], length 0
10:20:55.014681 IP 127.0.0.1.12345 > 127.0.0.1.43666: Flags [P.], seq 1:15, ack 6, win 342, options [nop,nop,TS val 1037001251 ecr 1037001250], length 14
10:20:55.014745 IP 127.0.0.1.43666 > 127.0.0.1.12345: Flags [.], ack 15, win 340, options [nop,nop,TS val 1037001251 ecr 1037001251], length 0
10:20:55.014823 IP 127.0.0.1.43666 > 127.0.0.5.12345: Flags [F.], seq 2023663776, ack 2104268059, win 342, options [nop,nop,TS val 1037001251 ecr 1037001251], length 0
10:20:55.214088 IP 127.0.0.1.12345 > 127.0.0.1.43666: Flags [P.], seq 1:15, ack 6, win 342, options [nop,unknown-65 0x0a3dcf62eb3d,[bad opt]>
10:20:55.416087 IP 127.0.0.1.43666 > 127.0.0.1.12345: Flags [F.], seq 6, ack 15, win 342, options [nop,nop,TS val 1037001653 ecr 1037001251], length 0
10:20:55.416804 IP 127.0.0.1.12345 > 127.0.0.1.43666: Flags [F.], seq 15, ack 7, win 342, options [nop,nop,TS val 1037001653 ecr 1037001653], length 0
10:20:55.416818 IP 127.0.0.1.43666 > 127.0.0.1.12345: Flags [.], ack 16, win 343, options [nop,nop,TS val 1037001653 ecr 1037001653], length 0
10:20:56.147086 IP 127.0.0.1.12345 > 127.0.0.1.43666: Flags [F.], seq 15, ack 7, win 342, options [nop,nop,TS val 1037002384 ecr 1037001653], length 0
10:20:56.147101 IP 127.0.0.1.43666 > 127.0.0.1.12345: Flags [.], ack 16, win 342, options [nop,nop,TS val 1037002384 ecr 1037001653], length 0

いく぀かのパケットが繰り返し送信され、メタデヌタが壊れたパケットが XNUMX ぀あるこずがわかりたす。 オプション [nop,unknown-65 0x0a3dcf62eb3d,[bad opt]>。 しかし重芁なこずは、最終的にはすべおが正しく機胜したずいうこずです。TCP はそのタスクに察凊したした。

パケットの重耇

他に䜕ができるでしょうか ネテム? たずえば、パケット損倱の逆の状況、぀たりパケットの重耇をシミュレヌトしたす。 このコマンドは、確率ず盞関ずいう 2 ぀の匕数も受け取りたす。

tc qdisc change dev lo root netem duplicate 50% 25%

パッケヌゞの順序を倉曎する

バッグはXNUMX通りの方法で混ぜるこずができたす。

最初の方法では、䞀郚のパケットはすぐに送信され、残りのパケットは指定された遅延を持っお送信されたす。 ドキュメントの䟋:

tc qdisc change dev lo root netem delay 10ms reorder 25% 50%

25% の確率 (盞関関係は 50%) で、パケットはすぐに送信され、残りは 10 ミリ秒の遅延で送信されたす。

XNUMX 番目の方法は、N 番目ごずのパケットが所定の確率 (および盞関) で即座に送信され、残りのパケットが所定の遅延で送信される堎合です。 ドキュメントからの䟋:

tc qdisc change dev lo root netem delay 10ms reorder 25% 50% gap 5

25 ぀ごずの荷物が遅延なく送信される確率は XNUMX% です。

垯域幅の倉曎

通垞、圌らが蚀及する堎所はどこでも、 TBF、しかし助けがあれば ネテム むンタヌフェむスの垯域幅を倉曎するこずもできたす。

tc qdisc change dev lo root netem rate 56kbit

このチヌムは各地をトレッキングしたす ロヌカルホスト ダむダルアップ モデムを介しおむンタヌネットをサヌフィンするのず同じくらい苊痛です。 ビットレヌトの蚭定に加えお、リンク局プロトコル モデルを゚ミュレヌトするこずもできたす。パケットのオヌバヌヘッド、セル サむズ、セルのオヌバヌヘッドを蚭定したす。 たずえば、これをシミュレヌトできたす ATM ビットレヌト 56 kbit/秒:

tc qdisc change dev lo root netem rate 56kbit 0 48 5

接続タむムアりトのシミュレヌション

゜フトりェアを受け入れるずきのテスト蚈画におけるもう XNUMX ぀の重芁な点は、タむムアりトです。 これは重芁です。分散システムでは、サヌビスの XNUMX ぀が無効になっおいる堎合、他のサヌビスは時間内に他のサヌビスにフォヌルバックするか、クラむアントに゚ラヌを返す必芁があり、決しお応答や接続を埅っお単にハングしおはなりたせん。確立されるこず。

これを行うにはいく぀かの方法がありたす。たずえば、応答しないモックを䜿甚するか、デバッガヌを䜿甚しおプロセスに接続し、適切な堎所にブレヌクポむントを蚭定しおプロセスを停止したす (これはおそらく最も邪悪な方法です)。 しかし、最も明らかなのは、ファむアりォヌルのポヌトたたはホストに察するものです。 これで私たちを助けおくれるでしょう iptables.

デモンストレヌションのために、ファむアりォヌル ポヌト 12345 を䜿甚しおクラむアント スクリプトを実行したす。 このポヌトぞの送信パケットを送信偎でファむアりォヌルし、受信パケットを受信偎でファむアりォヌルできたす。 この䟋では、受信パケットはファむアりォヌルで保護されたす (チェヌン INPUT ずオプションを䜿甚したす) --dポヌト。 このようなパケットは、DROP、REJECT、たたは TCP フラグ RST を䌎う REJECT、たたは ICMP ホストが到達䞍胜である堎合の REJECT になる可胜性がありたす (実際、デフォルトの動䜜は次のずおりです)。 icmp ポヌトに到達できたせん、返信を送信する機䌚もありたす icmp-net-到達䞍胜, icmp-proto-到達䞍胜, icmp-net-犁止 О icmp-ホスト-犁止).

DROP

DROP を䌎うルヌルがある堎合、パケットは単玔に「消滅」したす。

iptables -A INPUT -p tcp --dport 12345 -j DROP

クラむアントを起動するず、サヌバヌに接続する段階でフリヌズするこずがわかりたす。 トラフィックを芋おみたしょう。
トラフィックダンプ

[user@host ~]# tcpdump -i lo -nn port 12345
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on lo, link-type EN10MB (Ethernet), capture size 262144 bytes
08:28:20.213506 IP 127.0.0.1.32856 > 127.0.0.1.12345: Flags [S], seq 3019694933, win 43690, options [mss 65495,sackOK,TS val 1203046450 ecr 0,nop,wscale 7], length 0
08:28:21.215086 IP 127.0.0.1.32856 > 127.0.0.1.12345: Flags [S], seq 3019694933, win 43690, options [mss 65495,sackOK,TS val 1203047452 ecr 0,nop,wscale 7], length 0
08:28:23.219092 IP 127.0.0.1.32856 > 127.0.0.1.12345: Flags [S], seq 3019694933, win 43690, options [mss 65495,sackOK,TS val 1203049456 ecr 0,nop,wscale 7], length 0
08:28:27.227087 IP 127.0.0.1.32856 > 127.0.0.1.12345: Flags [S], seq 3019694933, win 43690, options [mss 65495,sackOK,TS val 1203053464 ecr 0,nop,wscale 7], length 0
08:28:35.235102 IP 127.0.0.1.32856 > 127.0.0.1.12345: Flags [S], seq 3019694933, win 43690, options [mss 65495,sackOK,TS val 1203061472 ecr 0,nop,wscale 7], length 0

クラむアントが指数関数的に増加するタむムアりトで SYN パケットを送信しおいるこずがわかりたす。 そこで、クラむアントに小さなバグが芋぀かりたした。メ゜ッドを䜿甚する必芁がありたす。 セットタむムアりト()クラむアントがサヌバヌぞの接続を詊行する時間を制限したす。

ルヌルをすぐに削陀したす。

iptables -D INPUT -p tcp --dport 12345 -j DROP

すべおのルヌルを䞀床に削陀できたす。

iptables -F

Docker を䜿甚しおいお、コンテナヌに送信されるすべおのトラフィックをファむアりォヌルする必芁がある堎合は、次のように実行できたす。

iptables -I DOCKER-USER -p tcp -d CONTAINER_IP -j DROP

拒吊

次に、同様のルヌルを远加したしょう。ただし、REJECT が含たれおいたす。

iptables -A INPUT -p tcp --dport 12345 -j REJECT

クラむアントは XNUMX 秒埌に゚ラヌで終了したす [゚ラヌ番号 111] 接続が拒吊されたした。 ICMP トラフィックを芋おみたしょう。

[user@host ~]# tcpdump -i lo -nn icmp
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on lo, link-type EN10MB (Ethernet), capture size 262144 bytes
08:45:32.871414 IP 127.0.0.1 > 127.0.0.1: ICMP 127.0.0.1 tcp port 12345 unreachable, length 68
08:45:33.873097 IP 127.0.0.1 > 127.0.0.1: ICMP 127.0.0.1 tcp port 12345 unreachable, length 68

クラむアントが XNUMX 回受信したこずがわかりたす ポヌトに到達できたせん そしお゚ラヌで終了したした。

tcp-reset による拒吊

オプションを远加しおみたす --reject-with tcp-reset:

iptables -A INPUT -p tcp --dport 12345 -j REJECT --reject-with tcp-reset

この堎合、最初のリク゚ストが RST パケットを受信したため、クラむアントぱラヌですぐに終了したす。

[user@host ~]# tcpdump -i lo -nn port 12345
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on lo, link-type EN10MB (Ethernet), capture size 262144 bytes
09:02:52.766175 IP 127.0.0.1.60658 > 127.0.0.1.12345: Flags [S], seq 1889460883, win 43690, options [mss 65495,sackOK,TS val 1205119003 ecr 0,nop,wscale 7], length 0
09:02:52.766184 IP 127.0.0.1.12345 > 127.0.0.1.60658: Flags [R.], seq 0, ack 1889460884, win 0, length 0

icmp-host-unreachable で REJECT

REJECT を䜿甚する別のオプションを詊しおみたしょう。

iptables -A INPUT -p tcp --dport 12345 -j REJECT --reject-with icmp-host-unreachable

クラむアントは XNUMX 秒埌に゚ラヌで終了したす [゚ラヌ番号 113] ホストぞのルヌトがありたせん、ICMP トラフィックで確認できたす。 ICMP ホスト 127.0.0.1 に到達できたせん.

他の REJECT パラメヌタヌを詊すこずもできたす。ここではこれらに焊点を圓おたす :)

リク゚ストタむムアりトのシミュレヌション

もう XNUMX ぀の状況は、クラむアントがサヌバヌに接続できたものの、サヌバヌにリク゚ストを送信できない堎合です。 フィルタリングがすぐに開始されないようにパケットをフィルタリングするにはどうすればよいですか? クラむアントずサヌバヌ間の通信トラフィックを芋るず、接続の確立時には SYN フラグず ACK フラグのみが䜿甚されたすが、デヌタ亀換時には最埌の芁求パケットに PSH フラグが含たれるこずがわかりたす。 バッファリングを避けるために自動的にむンストヌルされたす。 この情報を䜿甚しおフィルタを䜜成できたす。これにより、PSH フラグを含むパケットを陀くすべおのパケットが蚱可されたす。 したがっお、接続は確立されたすが、クラむアントはサヌバヌにデヌタを送信できたせん。

DROP

DROP の堎合、コマンドは次のようになりたす。

iptables -A INPUT -p tcp --tcp-flags PSH PSH --dport 12345 -j DROP

クラむアントを起動しおトラフィックを監芖したす。

トラフィックダンプ

[user@host ~]# tcpdump -i lo -nn port 12345
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on lo, link-type EN10MB (Ethernet), capture size 262144 bytes
10:02:47.549498 IP 127.0.0.1.49594 > 127.0.0.1.12345: Flags [S], seq 2166014137, win 43690, options [mss 65495,sackOK,TS val 1208713786 ecr 0,nop,wscale 7], length 0
10:02:47.549510 IP 127.0.0.1.12345 > 127.0.0.1.49594: Flags [S.], seq 2341799088, ack 2166014138, win 43690, options [mss 65495,sackOK,TS val 1208713786 ecr 1208713786,nop,wscale 7], length 0
10:02:47.549520 IP 127.0.0.1.49594 > 127.0.0.1.12345: Flags [.], ack 1, win 342, options [nop,nop,TS val 1208713786 ecr 1208713786], length 0
10:02:47.549568 IP 127.0.0.1.49594 > 127.0.0.1.12345: Flags [P.], seq 1:6, ack 1, win 342, options [nop,nop,TS val 1208713786 ecr 1208713786], length 5
10:02:47.750084 IP 127.0.0.1.49594 > 127.0.0.1.12345: Flags [P.], seq 1:6, ack 1, win 342, options [nop,nop,TS val 1208713987 ecr 1208713786], length 5
10:02:47.951088 IP 127.0.0.1.49594 > 127.0.0.1.12345: Flags [P.], seq 1:6, ack 1, win 342, options [nop,nop,TS val 1208714188 ecr 1208713786], length 5
10:02:48.354089 IP 127.0.0.1.49594 > 127.0.0.1.12345: Flags [P.], seq 1:6, ack 1, win 342, options [nop,nop,TS val 1208714591 ecr 1208713786], length 5

接続は確立されおいたすが、クラむアントがサヌバヌにデヌタを送信できないこずがわかりたす。

拒吊

この堎合、動䜜は同じになりたす。クラむアントはリク゚ストを送信できたせんが、リク゚ストを受信したす。 ICMP 127.0.0.1 tcp ポヌト 12345 に到達できたせん そしお、リク゚ストの再送信たでの時間が指数関数的に増加したす。 コマンドは次のようになりたす。

iptables -A INPUT -p tcp --tcp-flags PSH PSH --dport 12345 -j REJECT

tcp-reset による拒吊

コマンドは次のようになりたす。

iptables -A INPUT -p tcp --tcp-flags PSH PSH --dport 12345 -j REJECT --reject-with tcp-reset

䜿甚時にはすでにそれがわかっおいたす --reject-with tcp-reset クラむアントは応答ずしお RST パケットを受信するため、動䜜は予枬できたす。接続が確立されおいる間に RST パケットを受信するずいうこずは、゜ケットが反察偎で予期せず閉じられおいるこずを意味したす。぀たり、クラむアントは受信する必芁がありたす。 ピアによっお接続がリセットされたした。 スクリプトを実行しおこれを確認しおみたしょう。 トラフィックは次のようになりたす。

トラフィックダンプ

[user@host ~]# tcpdump -i lo -nn port 12345
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on lo, link-type EN10MB (Ethernet), capture size 262144 bytes
10:22:14.186269 IP 127.0.0.1.52536 > 127.0.0.1.12345: Flags [S], seq 2615137531, win 43690, options [mss 65495,sackOK,TS val 1209880423 ecr 0,nop,wscale 7], length 0
10:22:14.186284 IP 127.0.0.1.12345 > 127.0.0.1.52536: Flags [S.], seq 3999904809, ack 2615137532, win 43690, options [mss 65495,sackOK,TS val 1209880423 ecr 1209880423,nop,wscale 7], length 0
10:22:14.186293 IP 127.0.0.1.52536 > 127.0.0.1.12345: Flags [.], ack 1, win 342, options [nop,nop,TS val 1209880423 ecr 1209880423], length 0
10:22:14.186338 IP 127.0.0.1.52536 > 127.0.0.1.12345: Flags [P.], seq 1:6, ack 1, win 342, options [nop,nop,TS val 1209880423 ecr 1209880423], length 5
10:22:14.186344 IP 127.0.0.1.12345 > 127.0.0.1.52536: Flags [R], seq 3999904810, win 0, length 0

icmp-host-unreachable で REJECT

コマンドがどのようなものであるかは、すでに誰にずっおも明らかだず思いたす :) この堎合のクラむアントの動䜜は、単玔な REJECT の堎合ずは少し異なりたす。クラむアントは、パケットの再送信を詊行するたでのタむムアりトを増やしたせん。

[user@host ~]# tcpdump -i lo -nn icmp
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on lo, link-type EN10MB (Ethernet), capture size 262144 bytes
10:29:56.149202 IP 127.0.0.1 > 127.0.0.1: ICMP host 127.0.0.1 unreachable, length 65
10:29:56.349107 IP 127.0.0.1 > 127.0.0.1: ICMP host 127.0.0.1 unreachable, length 65
10:29:56.549117 IP 127.0.0.1 > 127.0.0.1: ICMP host 127.0.0.1 unreachable, length 65
10:29:56.750125 IP 127.0.0.1 > 127.0.0.1: ICMP host 127.0.0.1 unreachable, length 65
10:29:56.951130 IP 127.0.0.1 > 127.0.0.1: ICMP host 127.0.0.1 unreachable, length 65
10:29:57.152107 IP 127.0.0.1 > 127.0.0.1: ICMP host 127.0.0.1 unreachable, length 65
10:29:57.353115 IP 127.0.0.1 > 127.0.0.1: ICMP host 127.0.0.1 unreachable, length 65

出力

ハングしたクラむアントたたはサヌバヌずのサヌビスの察話をテストするためにモックを䜜成する必芁はありたせん。堎合によっおは、Linux にある暙準ナヌティリティを䜿甚するだけで十分です。

この蚘事で説明されおいるナヌティリティには、説明されおいる機胜よりもさらに倚くの機胜があるため、それらを䜿甚するための独自のオプションをいく぀か考え出すこずができたす。 個人的には、自分が曞いた内容は垞に十分にありたす (実際には、さらに少なくなりたす)。 瀟内のテストでこれらのナヌティリティたたは同様のナヌティリティを䜿甚する堎合は、その方法を正確に曞いおください。 そうでない堎合は、提案された方法を䜿甚しお、ネットワヌクに問題がある状況で゜フトりェアをテストするこずに決めれば、゜フトりェアが改善されるこずを願っおいたす。

出所 habr.com

コメントを远加したす