GNU/Linux >> Linux の 問題 >  >> Linux

ネットワークのトラブルシューティングにSSツールを使用する

はじめに:

次の記事は、インターネットアクセスから消えたり場所を移動したりした場合に参照できるように、次のサイトインから完全に1対1(完全な盗用!!)でコピーされています。
http:// www.linux-magazine.com/Issues/2015/181/Querying-Sockets-with-ss

LinuxMagazine。 2015年1月号の記事
著者:Chris Binnie

気取らないss ユーティリティは理解しやすく、入力も簡単ですが、管理ツールキットにいくつかの強力なオプションが追加されています。

いくつかのLinuxユーティリティの名前は非常に小さいため、コマンドラインにタイプミスを入力すると、予期せず起動することになります。完全に適切な略語で十分なのに、なぜわざわざ長い単語を入力するのでしょうか。 1つの小さなコマンド(名前とハードディスク上のポケットサイズのフットプリントの両方)は、 ssと呼ばれる小さなユーティリティです。 。

Ss そのフライ級クラスよりもいくつかのレベルをパンチします。システム管理者がネットワークリンクをチェックするために使用する一般的なツールのいずれかに精通している場合は、その機能が複雑すぎて頭を悩ませることはないと聞いて喜んでいただけると思います。

私たちの間で好奇心旺盛な人のために、「 ss 」の略語は、明らかに「ソケット統計」という単語の略語です。 Ss iproute2パッケージにバンドルされています。非常に珍しい理由でssが見つからない場合 Debianのようなシステムでは、次のコマンドを実行することでいつでもインストールできます:

sudo apt-get install iproute2

ソケットは、ポートとIPアドレスです。ソケットは、特定のコンピューターの特定のポート番号でリッスンしているサービスを識別するものと考えることができます。この場合のソケットペアは、クライアントIPアドレス、クライアントポート番号、サーバーIPアドレス、およびサーバーポート番号で構成されます。したがって、ソケットで情報をクエリすると、特定のIPアドレスで実行されている特定のサービスにすばやく焦点を合わせることができます。

私はUnixドメインソケットについて言及しないことを怠るでしょう。ローカルマシンで実行されているプロセス間の通信を容易にするUnixドメインソケットは、他の方法では特権がないプロセス間でリソースにアクセスするために必要なアクセス許可を有効にするなど、多くの便利な目的を果たします。
はじめに ss

ほとんどのシナリオでは、ssは通常のユーザーアカウントから実行されます。私のシステムでは、ssは / usr / sbin / ssにあります ディレクトリ。 ssの基本的な使用法から始めます。次のコマンドは、IPv4ネットワークの出力を示しています。
#ss -4
省略された出力(リスト1)は、クライアントとサーバーの通信を示しています。情報の流れの方向によっては、クライアントがサーバーになることも、その逆になることもあることに注意してください。

リスト1
基本的なss出力
State Recv-Q Send-Qローカルアドレス:ポートピアアドレス:ポート
ESTAB 0 0 192.168.0.2:37564 192.168.0.100:www
ESTAB 0 0 192.168.0.2:47592 192.168.0.156:smtp
ESTAB 0 0 192.168.0.2:ssh 192.168.0.49:64009

IPv6接続に関する情報を出力するには、-4オプションを-6に置き換えます。

リスト1を見るとわかるように、192.168.0.2はローカルマシンのIPアドレスであり、便利な/ etc / servicesユーティリティがいくつかのポート番号を名前(ssh、www、smtpなど)に変換しています。

優れたssは、TCP、UDP、ローカルUnixドメインソケット、およびリモートソケットに関する情報も提供します。後で説明するように、ssを非常に強力にするのは、接続の状態を処理する能力です。

私はよくssを使用して、コンピューターにインストールされているデーモンによって開かれているポートを照会します。 lオプションを使用して、リスニングポートを確認します(リスト2):

リスト2

リスニングポートの表示
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0128 *:ssh *:*
LISTEN 0 100 127.0.0.1: smtp *:*
LISTEN 0128 *:sunrpc *:*
LISTEN 0128 127.0.0.1:http *:*

#ss -l <​​/ code>
毎日のシステム管理ルーチン中にリスニングポートをチェックして、予期しない、潜在的に安全でないサービスが有効にされたままになっていないことを確認することをお勧めします。または、開いているポートを効果的に隠すことができない、あまり洗練されていないルートキットを確認することもできます。

いずれかのコマンド
lsof -i
netstat -tulpn

どのプロセス(PID)がポートを開いているかを把握するのに役立つため、必要に応じてそれらを強制終了できます。
オプションなしでssコマンドを実行するだけで、現在の「接続」のリストが表示されます(リスト3に示すように、これらは実際には「ソケット」であることに注意してください。

リスト3
ss装飾なし

#ss
State Recv-Q Send-Q Local Address:Port Peer Address:Port
ESTAB 0 0 192.168.0.2:37564 192.168.0.49:tcpmux
ESTAB 064192.168。 0.2:ssh 192.168.0.143:64009
ESTAB 0 0 192.168.0.2:47609 192.168.0.88:gopher

PID

lsofにアクセスできず、netstatが気に入らない場合(私は大ファンではありません)、super-duperssユーティリティは開いているポートに関連するPIDについてレポートすることもできます。どのプロセスがソケットを直接使用しているかを確認するには、-pをミックスにスローします。
#ss -p
1つの注意点は、拡張情報を取得するためにrootとしてログインする必要があることです。リスト4は、何を期待するかの例を示しています。

リスト4
ss -p
State Recv-Q Send-Qローカルアドレス:ポートピアアドレス:ポート
ESTAB 0 0 10.10.10.20:ssh 10.10.10.10:52918ユーザー:(( "sshd"、31195,3)、( "sshd"、31204,3))

この場合はsshdであるアプリケーション名から逆方向に作業すると、PID31195および31204を確認できます。 31204は非特権ユーザー(私のログインユーザー)に属しており、31195はsshdによって採用された巧妙な特権分離の結果であるように見えます。

SSHは、アクセスを制限し、ネットワークに面したSSHプロセスのchrootされたjailにサービスを制限することにより、非常に深刻なシステム上の問題を引き起こすプログラミングバグの可能性を最小限に抑えるように設計されています。この目標を達成するために、SSHは2つのプロセスを使用します。ルート所有のプロセスは、以前は使用されていなかったUIDとGIDを持つ非特権プロセスの進行状況を監視します。
詳細を確認する

ss -sを使用して、開いているソケットの数とそれらが使用しているプロトコルに関連する統計のスクリードを取得できます(リスト5)。

リスト5

ss -s
合計:201(カーネル218)
TCP:6(estab 2、closed 0、
located 0、synrecv 0、
timewait 0/0) 、ポート5
Transport Total IP IPv6
* 218 ---
RAW 0 0 0
UDP 5 5 0
TCP 6 6 0
INET 11 1 0
FRAG 0 0 0

これは最良の比較ではありませんが、次のnetstatコマンドを使用して漠然と同様の結果を得ることができます。
#netstat -tan | grep -v "Proto" | grep-v"アクティブ"| awk'{print $ 6}' | uniq -c
super ssユーティリティには、ベンチマークテストで他のネットワークツールよりも優れたパフォーマンスを発揮する習慣があることは間違いなく言及する価値があります。たとえば、広く使用されているnetstatと比較すると、ssはその結果を非常に迅速に提供します。ただし、ssは考えられるすべての質問に答えるように設計されているわけではなく、各システムコンポーネントが「1つのことをうまく行う」必要があるというUnix哲学を反映していることに注意してください。経験豊富なユーザーは、ssをnetstatなどのツールと組み合わせてから、grep、awk、sedなどのツールを使用して出力を整理することがよくあります。

たとえば、どのアプリケーションが特定のポートを拘束しているかを確認したい場合は、次のようにssをgrepとともに使用できます。
#ss | grep 58620

具体的に

次のコマンドでTCPソケットのみを確認できます:
#ss -t
または、–tcpオプションを書き出すこともできます。 -a(「すべて」の場合)スイッチを使用して詳細レベルを上げます。
#ss -t -a
そのコマンドを変更すると、UDP、Raw、およびUnixソケットを含む出力がわずかに生成されます。すべてのUDPソケットの詳細を表示するには、
#ss -u -aと入力します。
そして、すべてのRawソケットを表示するには、次のように入力します。
#ss -w -a
本当に気が遠くなるようなテキストをいくつか画面に表示する必要がある場合は、次のコマンドですべてのUnixドメインソケットを表示することを選択できます。
#ss -x -a

ssユーティリティによって提供される一見底なしのツールボックスには、DCCPソケットを監視する機能も含まれています。 DCCPは、UDPのブロードキャストタイプの機能を備えたTCPのコネクション型のエラーチェック特性を備えた、あまり一般的ではないネットワークプロトコルです。 DCCPプロトコルは、メディアストリーミングによく使用されます。次の気の利いた小さなコマンドでDCCPトラフィックを確認します:
#ss -d -a
-eオプションを使用して詳細レベルを拡張することにより、コンピューターへの接続のステータスを監視することもできます(リスト6)。

リスト6
#ss -e
State Recv-Q Send-Qローカルアドレス:ポートピアアドレス:ポート
ESTAB 0 0 192.168.0.2:ssh 192.168.0.88:58302 timer :( keepalive、40min、0)ino:2184870 sk:ffff880138d26700
ESTAB 0 0 192.168.0.2:48246 192.1680.56:ntp timer:(keepalive、105min、0)ino:2187726 sk:ffff880138d2748

リスト6は、接続上のキープアライブの現在のステータスに関する洞察を提供するタイマーオプションを示しています。この機能は、キープアライブを使用する傾向があるHTTPやSSHなどのサービスに役立ちます(「キープアライブノート」というタイトルのボックスを参照)。リスト7は、netstat-toコマンドを使用した同様の出力を示しています。

キープアライブノート

キープアライブパケットには通常、接続で使用されている現在の番号より1つ少ないシーケンス番号に設定されたTCPACKがあります。そのようなパケットからナッジを受信するマシンは、正しいシーケンス番号で応答するだけで、フランケンシュタインは冗談を言って、それが実際に生きていることを発表します。

これらのタイプのパケットは空の場合があり、通常は3つの関連パラメーターがあります。再試行パラメータは、接続のもう一方の端がゴーストを放棄したという結論に達する前に、パケットを送信する回数を宣言します。時間設定はチェックの頻度として構成され、最後に間隔によって、応答が受信されない場合に送信される2つのパケット間の時間の長さが決まります。

カーネル内では、 / proc として知られ、愛されている目を見張るような疑似ファイルシステムでこれらの値を編集することにより、これらの設定を変更できます。 。この場合、1つのファイルは / proc / sys / net / ipv4 / tcp_keepalive_time 、次のように編集できます:
#echo 75> / proc / sys / net / ipv4 / tcp_keepalive_intvl
#echo 9> / proc / sys / net / ipv4 / tcp_keepalive_probes
リスト7
#netstat -to
ProtoRecv-QSend-Qローカルアドレス外部アドレス状態タイマー
tcp0 0 host-one:48340 host-four:45358 ESTABLISHED keepalive(6830.00 / 0/0)
tcp 0 64 host-two:ssh host-three:58302 ESTABLISHED on(0.45 / 0/0)

Netstatでは、用途の広いwatchコマンドを追加して、リアルタイムの更新を確認することもできます。
#watch netstat -to
これは緊密な呼びかけですが、この場合、netstatはその出力を簡潔かつ簡潔に保ち、ssユーティリティの出力と同じように見えることを認めなければなりません。
ソースと宛先
次のコマンドを使用すると、特定のIPアドレスを対象とした宛先(dst)を持つソケットに関する情報を検索できます。
#ss dst 192.168.0.1
逆に、srcオプションを使用すると、ソケットのソース側の情報が明らかになることを考えると、大きな飛躍はありません。
#ss src 192.168.0.2
便利ですね?この構文は、急いでいる場合でも覚えやすく、停止中に辛辣な上司が首から息を吸っている日を節約できます。
アドレスの呼び出しで、CIDRネットワーク表記を使用することもできます。
#ss dst 192.168.0.1/24
最後にコロンを追加すると、非常に特定のポートと非常に広いIPアドレス範囲を同時に確認できます:
#192.168.0.1/24:53 >
トラフィックが多く、ポートが開いている状況では、この機能に本当に感謝しています。たとえば、このオプションを使用すると、1つの簡単なssコマンドで/ 24サブネット全体のすべてのDNS関連アクティビティを監視できます。
正規表現
DNS名とIPアドレスに加えて、正規表現を使用することもできます。 ss構文の(正規表現)演算子。この小さなナゲットを見てください:
#ss dport!=:53
このコマンドは、DNSポート53の宛先dportを除外します。
ある程度の健全性を維持し、数字だけを見るのを避ける必要がある場合は、ポートを/ etc/services形式に変換することもできます。
#ss 192.168.0.1:http
感動する準備ができている場合は、大なり記号、小なり記号、以下などを含めることもできます。
#ss dport> :53
他の特殊文字も可能ですが、特殊文字をエスケープする必要がある場合もあります。 eq(等しい)、ne(等しくない)、gt(より大きい)、le(より小さい)などのアルファベットの同等物も機能します。マイレージは、ssユーティリティのバージョンによって異なる場合があります。

接続状態

–queryを使用できます または-A ソケットテーブルをダンプするためのクエリの追加。魔法の言葉の自動バインドは、ソケットが接続されているエフェメラルポートをチェックします。静かなシステムであっても、出力のスクリードに備えてください。出力の短縮バージョンをリスト8に示します。

リスト8

#ss -a -A all autobound
01 u_str ESTAB 0 0 * 11984 * 0
02 u_str ESTAB 0 0 * 11996 * 0
03 u_str ESTAB 0 0 * 12003 * 0
04 u_str ESTAB 0 0 * 12005 * 0
05 u_str ESTAB 0 0 * 12010 * 0

TCP状態でフィルタリングすることもできます。たとえば、次のコマンドはsFTPトラフィックをフィルタリングします。
#ss state connected dport =:sftp
sFTPポートに関して「現在」として扱われるものはすべてすぐに表示されます。
ブール演算子を使用すると、コマンドをもう少し複雑にすることができます。
#ss(sport =: ftpまたはdport=:http)
ssを使用して、確立された、syn-sent、syn-recv、fin-wait-1、fin-wait-2、time-wait、closed、 close-wait、last-ack、listen、closeing。

TCP状態パラメーターを使用すると、非常に強力なクエリを実行できます。たとえば、FIN–WAIT–1状態をチェックすると、アプリケーションが接続の側を閉じたかどうかを識別できますが、リモートホストはその側を閉じていないため、マシンの貴重なポートが拘束されます。

ss -o state fin-wait-1'(sport =\
:ftpまたはsport =:http)' \
dst 10.10.3.3/24:22
>
Sso It Ends

ss ユーティリティは、ネットワークを非常に詳細に照会するのに役立つ強力なツールです。 Ssは、手動クエリと自動クエリの両方で非常に高いパフォーマンスを発揮し、一般的なコマンドを実行するために必要なキーストロークはごくわずかです。

この小さいながらも英雄的なツールは、システム管理者の筋肉を曲げるのに役立ちます。管理ツールキットの能力を高めたい場合は、日常業務でより複雑なコマンドのいくつかを練習してみてください。


Linux
  1. 5Linuxネットワークのトラブルシューティングコマンド

  2. Nutty –Ubuntu用のネットワーク診断ツール

  3. ネットワークのトラブルシューティングに tcpdump コマンドを使用する例

  1. トラブルシューティングツールとしてsystemdの使用を開始します

  2. LinuxでMongooseを使用してESP8266のネットワークアプリケーションを開発する

  3. ネットワーク診断用の10のLinuxコマンド

  1. 自動化のためのBashの使用

  2. AnsiblePlaybookの6つのトラブルシューティングスキル

  3. ルーターサーバーを通過するすべてのネットワークアクティビティをログに記録するためにTcpdumpを使用しますか?