tcpdump -XvvennSs 0 -i eth0 tcp[20:2]=0x4745 または tcp[20:2]=0x4854
0x4745は「GET」の最初の2文字「GE」です。
0x4854は「HTTP」の最初の2文字「HT」です。
説明: 通常の状況では: 通常の TCP 接続には 3 つの段階があります: 1. TCP スリーウェイ ハンドシェイク; 2. データ送信; 3. TCP 4 回のウェーブ
いくつかのコンセプトが含まれています:
- SYN: (シーケンス番号を同期、シーケンス番号を同期)
- ACK: (確認番号、確認番号)
- FIN:(終了フラグ、FINish)
TCP スリーウェイ ハンドシェイク (OPEN の作成)
- クライアントはサービスとの TCP 接続を確立するリクエストを開始します。ここでは SYN(J) を示します。
- クライアントから作成リクエストを受信した後、サーバーは 2 つのメッセージを返します: SYN(K) + ACK(J+1)
- クライアントはサーバーから ACK 情報を受信し、正常に検証された後 (J および J+1)、メッセージ ACK(K+1) を返します。
- サーバーはクライアントの ACK 情報検証 (K および K+1) を正常に受信すると、情報を返さなくなり、データ通信段階に入ります。
データ通信
- クライアント/サーバーの読み取り/書き込みパケット
TCP 4ウェイハンドシェイク(クローズフィニッシュ)
- クライアントはクローズ要求を開始し、メッセージ FIN(M) を送信します。
- メッセージを受信したサーバーは、まずメッセージを受信したことを示す ACK (M+1) を返します。
- サーバーは閉じる準備ができる前に、最終的に FIN(N) メッセージをクライアントに送信して、クライアントを閉じる準備ができているかどうかを尋ねます。
- サーバーから送信されたメッセージを受信した後、クライアントは確認メッセージ ACK(N+1) を返します。
- 最後に、サーバーとクライアントの両方が確認されると、それぞれが対応する TCP 接続を閉じるかリサイクルします。
詳細なステータスの説明 (および Linux 関連のパラメータ調整)
- SYN_SEND
- クライアントは、open メソッドを通じてサーバーへの接続を試行します。つまり、TCP スリーウェイ ハンドシェイクがアップロードされています...再アップロードのキャンセルの最初のステップの後、クライアントのステータスに注意してください
- sysctl -w net.ipv4.tcp_syn_retries = 2 , クライアントとして SYN パケットの再試行回数を設定できます, デフォルトは 5 回 (約 180 秒). プリンシパルからの引用: 再試行は 2 回のみ, 最新のネットワークで十分です
- SYN_RECEIVED
- サービスが作成リクエストの SYN を受け入れた後、つまりTCP スリーウェイ ハンドシェイクがアップロード中... ACK パケットを送信する前に、再アップロードのキャンセルのステップ 2
- サーバーの状態に注意 通常15程度は正常ですが、大きすぎる場合はSYN_FLOODによる攻撃の疑いがあります
- sysctl -w net.ipv4.tcp_max_syn_backlog=4096 、この状態で待機中のキューの数を設定します。デフォルトは 1024 です。増やすと syn-flood を適切に防ぐことができます。man 7 を参照してください。tcp がアップロードしています... に再アップロードします。キャンセル
- sysctl -w net.ipv4.tcp_syncookies=1 、 syncookie を開き、syn バックログ キューが不十分な場合に syn リンクを一時的にスワップアウトするメカニズムを提供します
- sysctl -w net.ipv4.tcp_synack_retries = 2, サーバーが ACK パケットを返すための再試行回数として、デフォルトは 5 回 (約 180 秒) です。プリンシパルからの引用: わずか 2 回の再試行、最新のネットワークで十分です
- 設立
- クライアントがサーバーからACKパケットを受信した後の状態で、一定時間以内にACKを送信するとサーバーは確立されます。
- sysctl -w net.ipv4.tcp_keepalive_time = 1200、デフォルトは 7200 秒 (2 時間)、システムは、net.ipv4.tcp_keepalive_probes * net.ipv4.tcp_keepalive_intvl = デフォルトの 11 分を超える場合、アイドル状態のリンクのハートビート チェックを実行します。 、対応する TCP リンクを終了し、ハートビート チェックの頻度を適切に調整できます。
- 現在のオンライン監視警告: 600、重大: 800
- FIN_WAIT1
- FIN リクエストの送信後、つまりTCP 4 ウェイ ハンドシェイクをアクティブに終了するパーティは、アップロード中です...再アップロードのキャンセルの最初のステップ
- CLOSE_WAIT
- 受動的に閉じられたパーティは、クライアントから FIN を受信した後、TCP 4 ウェイ ハンドシェイク中にアップロードしています...再アップロードして2 番目のステップをキャンセルします
- FIN_WAIT2
- アクティブにクローズするパーティは、パッシブにクローズするパーティから ACK を受信した後、つまりTCP 4 ウェイ ハンドシェイクをアップロードしています...再アップロードとキャンセルの 2 番目のステップ
- sysctl -w net.ipv4.tcp_fin_timeout=30 を使用すると、パッシブなクローズ パーティが FIN を返した後のタイムアウト期間を設定して、リンクを効果的にリサイクルし、syn フラッドを回避できます。
- LASK_ACK
- 受動的に閉じられた側は、ACK を送信してから一定時間後に FIN 要求を開始します (クライアントがそれを受信したことを確認するため)。つまり、TCP 4 ウェイ ハンドシェイクはアップロード中です...再アップロードのキャンセルの 3 番目のステップ
- TIME_WAIT
- アクティブにクローズする側は、パッシブ クローズの FIN パケットを受信した後、ACK を送信します。つまり、TCP 4 ウェイ ハンドシェイクがアップロードされています...再アップロード キャンセルの 4 番目のステップ
- sysctl -w net.ipv4.tcp_tw_recycle = 1 , 打开快速回收TIME_WAIT,NAT (ネットワーク アドレス変換) を使用するときに問題が発生するため、このオプションを有効にすることはお勧めできません
- sysctl -w net.ipv4.tcp_tw_reuse =1、TIME_WAIT リンクをすぐにリサイクルして再利用します。tw_recycle と競合するようです。再利用できない場合はリサイクルしますか?
- net.ipv4.tcp_max_tw_buckets: time_wait 状態の最大接続数。デフォルトは 180000 です。
関連手順:
- パッシブなクロージング パーティから FIN リクエストを受信した後、アクティブなクロージング パーティは相手への ACK の送信に成功した後、状態を FIN_WAIT2 から TIME_WAIT に変更し、MSL (最大セグメント寿命、MSL はデータグラムの時間) の 2 倍待つ必要があります。インターネットワークに存在する可能性があります) この時間が経過すると、両方の当事者がステータスを CLOSED に変更して接続を閉じることができます。現在、RHEL で TIME_WAIT 状態を維持する時間は 60 秒です
- keepAlive 戦略は、3 ウェイ ハンドシェイクと 4 ウェイ クローズを効果的に回避できます。
その他のネットワークの重要なパラメータ
net.ipv4.tcp_rmem パラメータ
- デフォルト: 最小=4096 デフォルト=87380 最大=4194304
net.ipv4.tcp_wmem パラメータ
- デフォルト: 最小=4096 デフォルト=16384 最大=4194304
tcpdump
Tcpdump は、Linux システムに付属するパケット キャプチャ ツールです。主にコマンド ラインを使用します。オンライン サーバー キャプチャ操作により適しています。Windows または ubuntu の場合は、いくつかのグラフィカル ツールを選択できます。Ubuntu では、wireshark の使用をお勧めします。インストール方法は非常に簡単で、sudo aptを実行するだけです。
コマンドライン形式:
tcpdump [ -adeflnNOpqStvx ] [ -c 番号 ] [ -F ファイル名 ] [ -i ネットワーク インターフェイス ] [ -r ファイル名 ] [ -s snaplen ] [ -T タイプ ] [ -w ファイル名 ] [式 ]
共通パラメータ:
-l は標準出力をバッファリングします。
-n はネットワーク アドレスを名前に変換しません。
-c 指定された数のパケットを受信した後、tcpdump は停止します;
-i は監視するネットワーク インターフェイスを指定します; (指定されていない場合、デフォルトのネットワーク カードで監視される可能性があります。特定の IP にバインドされたネットワーク カードを指定する必要があります) )
-w 直接 パッケージはファイルに書き込まれますが、分析や出力はされません;
-s は記録されたパッケージのサイズを指定します、一般的な -s 0 は最大値 65535 を表し、Linux 伝送最小単位 MTU の半分です。 1500あれば十分
-X パッケージデータデータを直接出力します。デフォルトでは設定されておらず、-w でファイルを指定することによってのみ出力できます。
一般的な表現:
- タイプに関するキーワード (主にホスト、ネット、ポートなど)
- 伝送方向のキーワードには主に src 、 dst 、dst または src、dst、src が含まれます。
- プロトコル キーワード(主に fddi、ip、arp、rarp、tcp、udp およびその他のタイプを含む)
- 論理演算、否定演算は「not ' '! 」、演算は 'and'、'&&'、または演算は 'or'、'||'
- その他の重要なキーワードは次のとおりです: ゲートウェイ、ブロードキャスト、少ない、大きい
実際の例:
1. HTTPパケットキャプチャ(パッケージデータを端末上に直接出力)
tcpdump tcp port 80 -n -X -s 0 は出力にポート 80 を指定します
2. http パッケージ データの指定されたファイルを出力パッケージにキャプチャします
tcpdump tcp ポート 80 -n -s 0 -w /tmp/tcp.cap
対応する/tmp/tcp.capは基本的にhttpヘッダーやコンテンツ情報などの情報を肉眼で見ることができます。
3. パイプの流れを組み合わせる
tcpdump tcp ポート 80 -n -s 0 -X -l | grep xxxx
これにより、パケットの文字列一致フィルタリングがリアルタイムで可能になります。
4. mod_proxy リバースプロキシパケットキャプチャ
オンライン サーバー apache+jetty、Apache mod_proxy を介したリバース プロキシ、80 Apache ポート、7001 Jetty ポート
Apache ポート データ キャプチャ: tcpdump tcp port 80 -n -s 0 -X -i eth0 注: eth0 ネットワーク インターフェイスを指定します。
Jetty ポート データ キャプチャ: tcpdump tcp port 7001 -n -s 0 -X -i lo 注: ループバック ネットワーク インターフェイスを指定します。
5. 特定の IP ホストのみを監視する
tcpdump tcp ホスト 10.16.2.85 およびポート 2100 -s 0 -X
TCP 式を組み合わせて使用する必要があります。IP アドレスのみをリッスンするホスト命令は次のとおりです。
チップ:
1. tcpdump (コマンド) + Wireshark (グラフィカル) と組み合わせ可能
操作します:
-
- サーバー上で tcpdump -w /tmp/tcp.cap を実行して、出力外部ファイルを指定します
- scp /tmp/tcp.cap ファイルをローカルにコピーします
- Wireshark & Wiresharkを起動する
- [ファイル] -> [開く] でコピーしたファイルを開き、パケット分析に使用できるようにします。
- 残りはとても便利です
tcpdump -i eth0 tcp[20:2]=0x4745 or tcp[20:2]=0x4854 -vvv
13:45:34.199147 IP (tos 0x0, ttl 64, id 40098, offset 0, flags [DF], proto TCP (6), length 3545)
host-11-11-35-35.65530 > 11.18.11.18.http: Flags [P.], cksum 0x8c84 (incorrect -> 0x1d14), seq 2648134490:2648137995, ack 3508301428, win 15, length 3505: HTTP, length: 3505
GET /static/js/chunk-55fc74fe.31902c3d.js HTTP/1.0
Host: zb.ik.com
X-Real-IP: 11.22.162.12
X-Forwarded-For: 11.22.162.12
Connection: close
sec-ch-ua: "Google Chrome";v="105", "Not)A;Brand";v="8", "Chromium";v="105"
sec-ch-ua-mobile: ?0
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36
sec-ch-ua-platform: "macOS"
Accept: */*
Sec-Fetch-Site: same-origin
Sec-Fetch-Mode: no-cors
Sec-Fetch-Dest: script
Referer: https://zb.ik.com/
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
Cookie: www.likecs.com|t_331182531_|tuguan; areaId=1;
X-Jdlb-Client-Port: 5604
J-Forwarded-For: 10.0.16.131
X-Original-To: 178.20.36.249