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>
<=</td>
<td>
le</td>
<td>
小于或等于某个端口号</td>
</tr>
<tr>
<td>
>=</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>
></td>
<td>
gt</td>
<td>
大于某个端口号</td>
</tr>
<tr>
<td>
<</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 \< 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]