的手册页ss
说:
FILTER := [ state TCP-STATE ] [ EXPRESSION ]
有关过滤器的详细信息,请查看官方文档(Debian 软件包 iproute-doc)。
这意味着什么?我在 下找不到任何东西/usr/share/doc/iproute2-doc/
。
$ ls /usr/share/doc/iproute2-doc/ss.html
ls: cannot access '/usr/share/doc/iproute2-doc/ss.html': No such file or directory
$ ls /usr/share/doc/iproute2-doc/
actions changelog.Debian.gz copyright examples README README.decnet README.devel README.distribution.gz README.iproute2+tc README.lnstat
该文档是否也在线可供浏览?
谢谢。
答案1
文档可用在 Debian 9 软件包中但在以后的版本中被删除因为它已经过时了。联机帮助页现在应该是完整的文档。 (但是关于过滤器的细节并没有太多可说的。)
答案2
FILTER := [ state STATE-FILTER ] [ EXPRESSION ]
Please take a look at the official documentation for details regarding filters.
STATE-FILTER
STATE-FILTER allows to construct arbitrary set of states to match. Its syntax is sequence of keywords state and exclude fol‐
lowed by identifier of state.
Available identifiers are:
All standard TCP states: established, syn-sent, syn-recv, fin-wait-1, fin-wait-2, time-wait, closed, close-wait, last-
ack, listening and closing.
all - for all the states
connected - all the states except for listening and closed
synchronized - all the connected states except for syn-sent
bucket - states, which are maintained as minisockets, i.e. time-wait and syn-recv
big - opposite to bucket
...
ss -o state established '( dport = :ssh or sport = :ssh )'
Display all established ssh connections.
ss -o state fin-wait-1 '( sport = :http or sport = :https )' dst 193.233.7/24
List all the tcp sockets in state FIN-WAIT-1 for our apache to network 193.233.7/24 and look at their timers.
所以
ss [options] [ FILTER ]
可以扩展到
ss [options] [ state STATE-FILTER ] [ EXPRESSION ]
选项在哪里
[-hVHnraloempiKsZNb460tudwxS] [-f FAMILY] [-A QUERY] [-D FILE] [-D FILE]
STATE-FILTER 是其中之一
established, syn-sent, syn-recv, fin-wait-1, fin-wait-2, time-wait, closed, close-wait, last-ack, listening, closing, all, connected, synchronized, bucket, big
我们可以推断从示例中可以看出 EXPRESSION 是一个列表ip 规则选择器s。
SELECTOR := [ not ] [ from PREFIX ] [ to PREFIX ] [ tos TOS ] [ fwmark FWMARK[/MASK] ] [ iif STRING ] [ oif STRING ] [ pref NUMBER ] [ l3mdev ] [ uidrange NUMBER-NUMBER ] [ ipproto PROTOCOL ] [ sport [ NUMBER | NUMBER-NUMBER ] ] [ dport [ NUMBER | NUMBER-NUMBER ] ] [ tun_id TUN_ID ]
答案3
我想知道同样的事情,其他提供源链接的答案和评论非常有帮助。
整体FILTER
语法仍然有点令人困惑,但基于 Linode 的一个示例,该示例展示了如何检查高于安全(需要 root)范围的端口和源代码,我能够组合一个“复杂”过滤器来检查打开的端口一个特定的范围。
所有这三个示例在功能上都是等效的:
ss -a -t '( dport geq :5900 and dport leq :5999 or sport geq :5900 and sport leq :5999 )'
ss -a -t '( dport >= :5900 and dport <= :5999 or sport >= :5900 and sport <= :5999 )'
ss -a -t '( dport >= :5900 & dport <= :5999 | sport >= :5900 & sport <= :5999 )'
在这种情况下,我正在寻找的端口与 VNC 相关,因为 Hashicorp 的 Vagrant 和 Packer 工具(以及它们与之交互的虚拟化工具,如 Virtualbox/VMware/libvirt)将自动分配此范围内的端口用于虚拟机器启动了“无头”,这样您就可以与虚拟机控制台交互,而无需发送原始击键。
让我困惑的部分是,在源代码中它有GEQ
andLEQ
但实际的过滤器语法要求它们是小写或符号表示>=
或<=
,而在源代码中您可以看到eq
被定义为小写。
另一个偷偷摸摸/令人困惑的事情是,=
所有eq
的==
工作都是为了平等。
答案4
这可能有帮助
SS 实用程序:快速介绍
阿列克谢·库兹涅托夫,[email protected]
一些负数,2001 年 9 月 20 日
ss
是另一个研究套接字的实用程序。从功能上来说,它并不比netstat
与一些 perl/awk 脚本结合使用更好,尽管它确实更快,但还不足以使其变得更好。 :-) 所以,现在就停止阅读本文,不要浪费时间。嗯,当然,它提出了一些功能,当前的 netstat 仍然无法做到,但肯定很快就会做到。
1. 为什么?
/proc
不幸的是,接口不足。当插座数量足够大时,netstat
甚至简单地cat /proc/net/tcp/
只会引起痛苦和诅咒。在linux-2.4中,这种情况变得更糟:即使套接字数量很小,读取/proc/net/tcp/
也足够慢。
该实用程序提供了一种新方法,应该可以很好地扩展。我不打算在这里描述技术细节,而是集中于命令的描述。唯一重要的事情是加载模块并不是一个坏主意tcp_diag
,它可以在 目录中
Modules
找到iproute2
。如果你不这样做,这ss
将起作用,但它会回落/proc
并变得缓慢,比如netstat
,好吧,还快一点(参见“一些数字”部分)。
2.旧闻
最简单的形式ss
相当于 netstat,但有一些小偏差。
ss -t -a
转储所有 TCP 套接字ss -u -a
转储所有 UDP 套接字ss -w -a
转储所有 RAW 套接字ss -x -a
转储所有 UNIX 套接字
选项-o
显示 TCP 计时器状态。选项-e
显示一些扩展信息。等等等等等等 看来netstat所有与socket相关的选项都支持了。虽然不是 AX.25 和其他奇怪的东西。 :-) 如果有人愿意,他可以支持 decnet 和 ipx。 iproute2 libutils 中已经提供了对它们的一些基本支持,我很高兴看到这些新成员。
然而,标准功能有点不同:
第一个:-a
状态中没有选项套接字
TIME-WAIT
,并且SYN-RECV
也会被跳过。我认为这是更合理的默认值。
第二:UNIX套接字的格式不同。它与tcp/udp重合。尽管标准内核仍然不允许查看已连接的 UNIX 套接字的写/读队列和对等地址,但是存在执行此操作的补丁。
第三种:默认情况下仅转储 TCP 套接字,而不是所有类型。
下一个:默认情况下它不解析数字主机地址(如ip
)!使用选项启用解析-r
。默认情况下会解析服务名称,通常存储在本地文件中。此外,如果服务数据库不包含对端口的引用,ss
则查询 system
rpcbind
。 RPC 服务以前缀rpc.
服务解析可以通过选项抑制-n
。
它不接受“长”选项(我不喜欢它们,抱歉)。因此,地址族是通过族标识符给出的,该选项-f
遵循 iproute2 约定。大多数情况下,它是为了允许选项解析器正确解析地址,但作为副作用,它实际上限制了转储到仅支持给定系列的套接字。-A
还支持选项后跟要转储的套接字表列表。从逻辑上讲,socket表的id与_address_系列的不同,这是另一个不兼容的点。因此,id 是all
, tcp
, udp
,
raw
, inet
, unix
, packet
,之一
netlink
。看?嗯,inet
只是缩写tcp|udp|raw
,不难猜测它packet
允许查看数据包套接字。实际上,还有一些其他缩写,feunix_dgram
仅选择数据报 UNIX 套接字。
下:嗯,我还是不知道。 :-)
3. 是时候讨论新功能了。
它是套接字列表的内置过滤。
3.1 按州过滤。
ss
允许使用关键字
state
和exclude
,后跟一些状态标识符来过滤套接字状态。
状态标识符是标准 TCP 状态名称(未列出,如果您已经不知道它们,它们对您来说毫无用处)或缩写:
all
- 对于所有州bucket
- 对于 TCP 微型套接字 (TIME-WAIT|SYN-RECV
)big
- 除迷你插座外的所有connected
- 未关闭且未聆听synchronized
- 连接和未连接SYN-SENT
Fe 转储所有 tcp 套接字,除了SYN-RECV
:
ss exclude SYN-RECV
如果state
或exclude
指令均不存在,则状态过滤器默认为all
with 选项-a
或 to all
,不包括监听、syn-recv、time-wait 和关闭的套接字。
3.2 按地址和端口过滤。
选项列表可能包含地址/端口过滤器。它是布尔表达式,由布尔运算
or
、and
、not
和谓词组成。实际上,布尔运算的所有名称都被吃掉了:
&
、&&
、|
、||
、!
,但不要忘记 unix shell 赋予这些符号的特殊含义,并在从命令行使用时正确转义它们。
谓词可能有以下几种:
- A. 地址/端口匹配,其中根据掩码检查地址,端口为通配符或精确端口。它是以下之一:
dst prefix:port src prefix:port src unix:STRING src link:protocol:ifindex src nl:channel:pid
前缀和端口都可以不存在或替换为
*
,表示通配符。 UNIX 套接字使用更强大的方案通过 shell 通配符来匹配套接字名称。另外,如果地址族从上下文中显而易见(使用选项-x
或 with-f unix
或 withunix
关键字),则可以省略前缀 unix: 和 link:铁
dst 10.0.0.1 dst 10.0.0.1: dst 10.0.0.1/32: dst 10.0.0.1:*
是等价的,表示套接字连接到主机 10.0.0.1 上的任何端口
dst 10.0.0.0/24:22
连接到网络 10.0.0.0...255 上的端口 22 的套接字。
请注意,端口与地址之间用冒号分隔,这会给 IPv6 地址带来麻烦。一般来说,我们将最后一个冒号解释为分割端口。为了允许给出 IPv6 地址,可以使用类似于 IPv6 HTTP URL 中使用的技巧:
dst [::1]
套接字是否连接到任意端口上的 ::1
另一种方式是
dst ::1
128/。 / 有助于理解冒号是 IPv6 地址的一部分。现在我们可以为
dst 10.0.0.1
: 添加另一个别名dst [10.0.0.1]
。 :-)地址可以是 DNS 名称。在这种情况下,将查找所有地址(在所有地址族中,如果不受选项
-f
或特殊地址前缀inet:
,的限制inet6
),结果表达式将or
覆盖所有地址。 - B、端口表达式:
dport >= :1024 dport != :22 sport < :32000
ETC。
所有关系:
<
,>
,=
,>=
,=
,==
,!=
,eq
,ge
,lt
,ne
... 使用您更喜欢的变体,但不要忘记在命令行中键入特殊字符时转义它们。 :-)请注意,端口号在语法上与情况 A 一致!你甚至可以添加一个IP地址,但它不会参与比较,除了
==
和!=
,它们相当于AFe类型的相应谓词dst 10.0.0.1:22
相当于dport eq 10.0.0.1:22
并且not dst 10.0.0.1:22
相当于dport neq 10.0.0.1:22
- C、关键字
autobound
。它与本地系统上自动绑定的套接字匹配。
4. 例子
FIN-WAIT-1
1. 列出apache 到网络 193.233.7/24 的 所有处于状态的 tcp 套接字,并查看它们的计时器:ss -o state fin-wait-1 \( sport = :http or sport = :https \) \ dst 193.233.7/24
哎呀,忘了说缺少逻辑运算相当于
and
。- 2. 好吧,现在看看剩下的......
ss -o excl fin-wait-1 ss state fin-wait-1 \( sport neq :http and sport neq :https \) \ or not dst 193.233.7/24
请注意,我们必须做二党卫军号召这样做。状态匹配始终与地址/端口匹配相连接。这样做的原因纯粹是技术性的:ss 在解析地址之前快速跳过不匹配的状态,并且我认为快速跳过时间等待和 syn-recv 套接字的能力比逻辑通用性更重要。
- 3. 那么,让我们看看所有使用自动绑定端口的套接字:
ss -a -A all autobound
- 4.最终找到所有连接到本地X服务器的本地进程:
ss -xp dst "/tmp/.X11-unix/*"
请原谅,这不适用于当前内核,需要修补。但我们仍然可以看看服务器端:
ss -x src "/tmp/.X11-unix/*"
5.返回地面:真手动
5.1 命令参数
参数的一般格式ss
是:
ss [ OPTIONS ] [ STATE-FILTER ] [ ADDRESS-FILTER ]
OPTIONS
OPTIONS
是单字母选项的列表,使用常见的 UNIX 约定。
-h
- 显示帮助页面-?
——当然是一样的-v
,-V
- 打印版本ss
并退出-s
- 打印摘要统计数据。此选项不会解析从各种来源获取摘要的套接字列表。当套接字数量如此巨大以至于解析/proc/net/tcp
很痛苦时,它非常有用。-D FILE
- 不显示任何内容,仅FILE
在应用过滤器后转储有关 TCP 套接字的原始信息。如果使用FILE
的话-
stdout
。-F FILE
- 从 读取过滤器的延续FILE
。的每一行都FILE
被解释为单个命令行选项。如果使用FILE
的话-
stdin
。-r
- 尝试解析数字地址/端口-n
- 不要尝试解析端口-o
- 显示一些可选信息,fe TCP 计时器-i
- 显示一些特定于 TCP 的信息(RTO、拥塞窗口、慢启动阈值等)-e
- 显示更多可选信息-m
- 显示有关套接字使用的内存的扩展信息。它仅在tcp_diag
启用时可用。-p
- 显示拥有套接字的进程列表-f FAMILY
- 用于解析地址的默认地址族。此外,此选项还限制列出支持给定地址族的套接字。目前支持以下系列:unix
、inet
、inet6
、link
、netlink
。-4
- 别名-f inet
-6
- 别名-f inet6
-0
- 别名-f link
-A LIST-OF-TABLES
- 要转储的套接字表列表,以逗号分隔。可理解以下标识符:all
,inet
,tcp
,udp
,raw
,unix
,packet
,netlink
,unix_dgram
,unix_stream
,packet_raw
,packet_dgram
。-x
- 别名-A unix
-t
- 别名-A tcp
-u
- 别名-A udp
-w
- 别名-A raw
-a
- 显示所有状态的套接字。默认情况下 ,状态LISTEN
、TIME-WAIT
和中的套接字会被跳过。SYN_RECV
CLOSE
-l
- 仅显示处于状态的插座LISTEN
STATE-FILTER
STATE-FILTER
允许构造任意一组状态来匹配。其语法是关键字序列state
,exclude
后跟状态标识符。可用的标识符有:
- 所有标准 TCP 状态:
established
、syn-sent
、syn-recv
、fin-wait-1
、fin-wait-2
、time-wait
、closed
、close-wait
、last-ack
和listen
。closing
all
- 对于所有州connected
listen
- 除和之外的所有州closed
synchronized
connected
-除以下 所有州syn-sent
bucket
- 状态,作为迷你套接字维护,即time-wait
和syn-recv
。big
- 与相反bucket
ADDRESS_FILTER
ADDRESS_FILTER
是带有and
, or
and运算的布尔表达式not
,在 C 风格 fe 中可以缩写为&
,
&&
。
谓词检查本地和远程套接字地址。谓词有以下几种:
dst ADDRESS_PATTERN
- 匹配远程地址和端口src ADDRESS_PATTERN
- 匹配本地地址和端口dport RELOP PORT
- 将远程端口与数字进行比较sport RELOP PORT
- 将本地端口与数字进行比较autobound
- 检查套接字是否绑定到临时端口
RELOP
<=
是、等的一部分>=
。==
为了使其在 unix shell 中使用更方便,还接受类似 FORTRAN 字母的符号等le
。gt
的格式和语义ADDRESS_PATTERN
取决于地址族。
inet
-ADDRESS_PATTERN
由 IP 前缀组成,后面可以选择冒号和端口。如果前缀或端口部分缺失或替换为*
,则表示通配符匹配。inet6
- 与 相同inet
,仅前缀指的是 IPv6 地址。与冒号不同,inet
冒号变得不明确,因此允许使用方案,就像在 URL 中使用的那样,其中地址由...ss
支持 。[
]
unix
-ADDRESS_PATTERN
是 shell 样式的通配符。packet
- 格式看起来像inet
,仅保留接口索引而不是端口,并且仅保留链路层协议 ID 而不是地址。netlink
- 格式看起来像inet
,只保留套接字 pid 而不是端口,并且保留 netlink 通道而不是地址。
PORT
ADDRESS_PATTERN
在语法上与通配符地址部分相同。当然,对于 UNIX 套接字来说它是未定义的。
5.2 环境变量
ss
允许使用各种环境变量更改信息源:
PROC_SLABINFO
覆盖/proc/slabinfo
PROC_NET_TCP
覆盖/proc/net/tcp
PROC_NET_UDP
覆盖/proc/net/udp
- ETC。
变量PROC_ROOT
允许更改所有/proc/
层次结构的根。
变量TCPDIAG_FILE
规定打开一个文件而不是请求内核转储有关 TCP 套接字的信息。
/proc/
当通过电子邮件接收通常在 中找到的文件转储时,此选项主要用于调查错误报告。
5.3 输出格式
六列。第一个是Netid
,它表示套接字类型和传输协议,当它不明确时:tcp
、udp
、raw
、
u_str
是 的缩写unix_stream
,u_dgr
对于 UNIX 数据报套接字、nl
netlinkp_raw
以及p_dgr
原始和数据报包套接字。此列是可选的,如果过滤器选择唯一的网络 ID,它将被隐藏。
第二列是State
。此处显示套接字状态。这些名称是标准 TCP 名称,但 除外UNCONN
,这对于 TCP 来说是不可能发生的,但对于其他类型的未连接套接字来说是正常的。同样,该列可以隐藏。
然后两列(Recv-Q
和Send-Q
)显示排队等待接收和发送的数据量。
最后两列显示套接字的本地地址和端口及其对等地址(如果套接字已连接)。
如果给出了 options-o
或-e
,-p
则选项不会显示在固定位置,而是以空格对分隔:
option:value
。如果 value 不是单个数字,则它将显示为值列表,括在(
...中)
并用逗号分隔。铁
timer:(keepalive,111min,0)
是 TCP 计时器的典型格式(选项-o
)。
users:((X,113,3))
是典型的用户列表(选项-p
)。
6.一些数字
好吧,让我们使用pidentd
一个工具ibench
来衡量它的性能。这里是每秒 30 个请求。没什么可测试的,速度太慢了。好的,让我们使用 Patches 目录中的 patch 来修补 pidentd。此后,它每秒处理大约 4300 个请求,并成为使用大量 timewait 桶污染套接字表的方便工具。
因此,每个测试从具有 30000 个套接字的污染表开始,然后通过管道将表完全转储到 wc 并测量时间的变化:
结果:
netstat -at
- 15.6 秒ss -atr
,但没有tcp_diag
- 5.4 秒ss -atr
与tcp_diag
- 0.47 秒
暂无评论。尽管注释是必要的,但大多数时间都tcp_diag
浪费在内核内部,并且网络完全被阻止。超过10秒,是的。tcp_diag
在 100 毫秒的系统时间内执行相同的工作。