雄鹰胡哥 發表於 2023-7-9 00:00:00

linux ss命令详解

<p>
        ss 是 socket statistics 的缩写。ss 命令可以用来获取 socket 统计信息,它显示的内容和 netstat 类似。但 ss 的优势在于它能够显示更多更详细的有关 tcp 和连接状态的信息,而且比 netstat 更快。当服务器的 socket 连接数量变得非常大时,无论是使用 netstat 命令还是直接 cat /proc/net/tcp,执行速度都会很慢。ss 命令利用到了 tcp 协议栈中 tcp_diag。tcp_diag 是一个用于分析统计的模块,可以获得 linux 内核中第一手的信息,因此 ss 命令的性能会好很多。</p>
<p>
        <strong>常用选项</strong></p>
<p>
        -h, --help 帮助<br>
        -v, --version 显示版本号<br>
        -t, --tcp 显示 tcp 协议的 sockets<br>
        -u, --udp 显示 udp 协议的 sockets<br>
        -x, --unix 显示 unix domain sockets,与 -f 选项相同<br>
        -n, --numeric 不解析服务的名称,如 "22" 端口不会显示成 "ssh"<br>
        -l, --listening 只显示处于监听状态的端口<br>
        -p, --processes 显示监听端口的进程(ubuntu 上需要 sudo)<br>
        -a, --all 对 tcp 协议来说,既包含监听的端口,也包含建立的连接<br>
        -r, --resolve 把 ip 解释为域名,把端口号解释为协议名称</p>
<p>
        <strong>常见用例</strong></p>
<p>
        如果不添加选项 ss 命令默认输出所有建立的连接(不包含监听的端口),包括 tcp, udp, and unix socket 三种类型的连接:</p>
<p>
        <img title="linux ss命令详解" alt="linux ss命令详解" src="https://zhuji.jb51.net/uploads/img/202305/b8517b73834a18de8ae1f01af6f0727b.jpg"></p>
<p>
        查看主机监听的端口</p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlighterbash" id="highlighter_679122">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="bash plain">$ ss -tnl</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
</div>
<p>
        <img title="linux ss命令详解" alt="linux ss命令详解" src="https://zhuji.jb51.net/uploads/img/202305/9f6218cdeda25e8a1c6c5459ae97a542.jpg"></p>
<p>
        通过 -r 选项解析 ip 和端口号</p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlighterbash" id="highlighter_313886">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="bash plain">$ ss -tlr</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
</div>
<p>
        <img title="linux ss命令详解" alt="linux ss命令详解" src="https://zhuji.jb51.net/uploads/img/202305/a1c7c2b7d66e7b4a4d66fb1821b3cc78.jpg"></p>
<p>
        <strong>使用 -p 选项查看监听端口的程序名称</strong></p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlighterbash" id="highlighter_168787">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="bash plain">$ </code><code class="bash functions">sudo</code> <code class="bash plain">ss -tlp</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
</div>
<p>
        <img title="linux ss命令详解" alt="linux ss命令详解" src="https://zhuji.jb51.net/uploads/img/202305/2fe31dd1a91be277998347f757fbc892.jpg"></p>
<p>
        最后一列就是运行的程序名称。还可以通过 grep 继续过滤:</p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlighterbash" id="highlighter_786813">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="bash plain">$ </code><code class="bash functions">sudo</code> <code class="bash plain">ss -tlp | </code><code class="bash functions">grep</code> <code class="bash functions">ssh</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
</div>
<p>
        <img title="linux ss命令详解" alt="linux ss命令详解" src="https://zhuji.jb51.net/uploads/img/202305/33a9f6056dcb8d0a26e4ea7d28f0b48a.jpg"></p>
<p>
        <strong>查看建立的 tcp 连接</strong></p>
<p>
        -a --all 对 tcp 协议来说,既包含监听的端口,也包含建立的连接</p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlighterbash" id="highlighter_92755">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="bash plain">$ ss -tna</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
</div>
<p>
        <img title="linux ss命令详解" alt="linux ss命令详解" src="https://zhuji.jb51.net/uploads/img/202305/b50ed20b4800d4de6cc0e1bb61a8d751.jpg"></p>
<p>
        <strong>显示更多的信息</strong></p>
<p>
        -o, --options 显示时间信息<br>
        -m, --memory 显示 socket 使用的内存<br>
        -i, --info 显示更多 tcp 内部的信息</p>
<p>
        <img title="linux ss命令详解" alt="linux ss命令详解" src="https://zhuji.jb51.net/uploads/img/202305/dd3be795728435e03e9a51143fff1495.jpg"></p>
<p>
        <strong>显示概要信息</strong></p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlighterbash" id="highlighter_248747">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="bash plain">$ ss -s</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
</div>
<p>
        <img title="linux ss命令详解" alt="linux ss命令详解" src="https://zhuji.jb51.net/uploads/img/202305/eadff84aad6cbad7e08fcc1d66b27bc8.jpg"></p>
<p>
        <strong>dst/src dport/sport 语法</strong></p>
<p>
        可以通过 dst/src/dport/sprot 语法来过滤连接的来源和目标,来源端口和目标端口。</p>
<p>
        匹配远程地址和端口号</p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlighterbash" id="highlighter_967113">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                        <div class="line number2 index1 alt1">
                                                                2</div>
                                                        <div class="line number3 index2 alt2">
                                                                3</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="bash plain">$ ss dst 192.168.1.5</code>
</div>
                                                                <div class="line number2 index1 alt1">
                                                                        <code class="bash plain">$ ss dst 192.168.119.113:http</code>
</div>
                                                                <div class="line number3 index2 alt2">
                                                                        <code class="bash plain">$ ss dst 192.168.119.113:443</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
</div>
<p>
        匹配本地地址和端口号</p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlighterbash" id="highlighter_366938">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                        <div class="line number2 index1 alt1">
                                                                2</div>
                                                        <div class="line number3 index2 alt2">
                                                                3</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="bash plain">$ ss src 192.168.119.103</code>
</div>
                                                                <div class="line number2 index1 alt1">
                                                                        <code class="bash plain">$ ss src 192.168.119.103:http</code>
</div>
                                                                <div class="line number3 index2 alt2">
                                                                        <code class="bash plain">$ ss src 192.168.119.103:80</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
</div>
<p>
        将本地或者远程端口和一个数比较</p>
<p>
        可以使用下面的语法做端口号的过滤:</p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlighterbash" id="highlighter_551968">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                        <div class="line number2 index1 alt1">
                                                                2</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="bash plain">$ ss dport </code><code class="bash functions">op</code> <code class="bash plain">port</code>
</div>
                                                                <div class="line number2 index1 alt1">
                                                                        <code class="bash plain">$ ss sport </code><code class="bash functions">op</code> <code class="bash plain">port</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
</div>
<p>
        op 可以代表以下任意一个:</p>
<p>
         </p>
<table border="0"><tbody>
<tr>
<td>
                                &lt;=</td>
                        <td>
                                le</td>
                        <td>
                                小于或等于某个端口号</td>
                </tr>
<tr>
<td>
                                &gt;=</td>
                        <td>
                                ge</td>
                        <td>
                                大于或等于某个端口号</td>
                </tr>
<tr>
<td>
                                ==</td>
                        <td>
                                eq</td>
                        <td>
                                等于某个端口号</td>
                </tr>
<tr>
<td>
                                !=</td>
                        <td>
                                ne</td>
                        <td>
                                不等于某个端口号</td>
                </tr>
<tr>
<td>
                                &gt;</td>
                        <td>
                                gt</td>
                        <td>
                                大于某个端口号</td>
                </tr>
<tr>
<td>
                                &lt;</td>
                        <td>
                                lt</td>
                        <td>
                                小于某个端口号</td>
                </tr>
</tbody></table>
<p>
         </p>
<p>
        下面是一个简单的 demo(注意,需要对尖括号使用转义符):</p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlighterbash" id="highlighter_453446">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                        <div class="line number2 index1 alt1">
                                                                2</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="bash plain">$ ss -tunl sport lt 50</code>
</div>
                                                                <div class="line number2 index1 alt1">
                                                                        <code class="bash plain">$ ss -tunl sport \&lt; 50</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
</div>
<p>
        <img title="linux ss命令详解" alt="linux ss命令详解" src="https://zhuji.jb51.net/uploads/img/202305/81d4b2ee059c531197e312042489b3e4.jpg"></p>
<p>
        <strong>通过 tcp 的状态进行过滤</strong></p>
<p>
        ss 命令还可以通过 tcp 连接的状态进程过滤,支持的 tcp 协议中的状态有:<br>
        established<br>
        syn-sent<br>
        syn-recv<br>
        fin-wait-1<br>
        fin-wait-2<br>
        time-wait<br>
        closed<br>
        close-wait<br>
        last-ack<br>
        listening<br>
        closing</p>
<p>
        除了上面的 tcp 状态,还可以使用下面这些状态:</p>
<p>
         </p>
<table border="0"><tbody>
<tr>
<td>
                                all</td>
                        <td>
                                列出所有的 tcp 状态。</td>
                </tr>
<tr>
<td>
                                connected</td>
                        <td>
                                列出除了 listening 和 closing 之外的所有 tcp 状态。</td>
                </tr>
<tr>
<td>
                                synchronized</td>
                        <td>
                                列出除了 syn-sent 之外的所有 tcp 状态。</td>
                </tr>
<tr>
<td>
                                bucket</td>
                        <td>
                                列出 maintained 的状态,如:time-wait 和 syn-recv。</td>
                </tr>
<tr>
<td>
                                big</td>
                        <td>
                                列出和 bucket 相反的状态。</td>
                </tr>
</tbody></table>
<p>
         </p>
<p>
        使用 ipv4 时的过滤语法如下:</p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlighterbash" id="highlighter_827109">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="bash plain">$ ss -4 state filter</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
</div>
<p>
        使用 ipv6 时的过滤语法如下:</p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlighterbash" id="highlighter_892455">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="bash plain">$ ss -6 state filter</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
</div>
<p>
        下面是一个简单的例子:</p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlighterbash" id="highlighter_323738">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="bash plain">$ ss -4 state listening</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
</div>
<p>
        <img title="linux ss命令详解" alt="linux ss命令详解" src="https://zhuji.jb51.net/uploads/img/202305/660a9ee88b15441f1be4fedd4ad9210a.jpg"></p>
<p>
        <strong>同时过滤 tcp 的状态和端口号</strong></p>
<p>
        (注意下面命令中的转义符和空格,都是必须的。如果不用转义符,可以使用单引号)</p>
<p>
        下面的命令显示所有状态为 established 的 ssh 连接:</p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlighterbash" id="highlighter_159381">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="bash plain">$ ss -4n state listening</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
</div>
<p>
        下面的两种写法是等价的,要有使用 \ 转义小括号,要么使用单引号括起来:</p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlighterbash" id="highlighter_395458">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                        <div class="line number2 index1 alt1">
                                                                2</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="bash plain">$ ss -4n state listening \( dport = :</code><code class="bash functions">ssh</code> <code class="bash plain">\)</code>
</div>
                                                                <div class="line number2 index1 alt1">
                                                                        <code class="bash plain">$ ss -4n state listening </code><code class="bash string">'( dport = :ssh )'</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
</div>
<p>
        <img title="linux ss命令详解" alt="linux ss命令详解" src="https://zhuji.jb51.net/uploads/img/202305/da8813930130ee9e066115a6a618b718.jpg"></p>
<p>
        只是最后的结果稍微让人有些意外,不仅显示了监听的端口,也显示了通过 22 端口建立的连接。</p>
<p>
        下面我们显示所有状态为 established 的 http 连接:</p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlighterbash" id="highlighter_201470">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                        <div class="line number2 index1 alt1">
                                                                2</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="bash plain">$ ss -4n state listening \( dport = :</code><code class="bash functions">ssh</code> <code class="bash plain">\)</code>
</div>
                                                                <div class="line number2 index1 alt1">
                                                                        <code class="bash plain">$ ss -4n state listening </code><code class="bash string">'( dport = :ssh )'</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
</div>
<p>
        <img title="linux ss命令详解" alt="linux ss命令详解" src="https://zhuji.jb51.net/uploads/img/202305/6b65841e1075f9f0e9ff33124ad8a064.jpg"></p>
<p>
        下面的命令列出所有连接到 22 端口的连接和对 22 端口的监听:</p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlighterbash" id="highlighter_664318">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="bash plain">$ ss state all dport = :22</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
</div>
<p>
        <img title="linux ss命令详解" alt="linux ss命令详解" src="https://zhuji.jb51.net/uploads/img/202305/418b7260df4057b3e5ca303f0a0fc35f.jpg"></p>
<p>
        下面是一个来自 ss man page 的例子,它列举出处于 fin-wait-1状态的源端口为 80 或者 443,目标网络为 193.233.7/24 所有 tcp 套接字:</p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlighterbash" id="highlighter_106801">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="bash plain">$ ss state fin-wait-1 </code><code class="bash string">'( sport = :http or sport = :https )'</code> <code class="bash plain">dst 193.233.7</code><code class="bash plain">/24</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
</div>
<p>
        <strong>总结</strong></p>
<p>
        由于性能出色且功能丰富,ss 命令可以用来替代 netsate 命令成为我们日常查看 socket 相关信息的利器。其实抛弃 netstate 命令已经是大势所趋,有的 linux 版本默认已经不再内置 netstate 而是内置了 ss 命令。</p>
<p>
        以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。</p>
<p>
        原文链接:http://www.cnblogs.com/sparkdev/p/8421897.html</p>
頁: [1]
查看完整版本: linux ss命令详解