SS 实用程序:快速介绍

SS 实用程序:快速介绍

的手册页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)将自动分配此范围内的端口用于虚拟机器启动了“无头”,这样您就可以与虚拟机控制台交互,而无需发送原始击键。

让我困惑的部分是,在源代码中它有GEQandLEQ但实际的过滤器语法要求它们是小写或符号表示>=<=,而在源代码中您可以看到eq被定义为小写。

另一个偷偷摸摸/令人困惑的事情是,=所有eq==工作都是为了平等。

答案4

这可能有帮助

https://www.apt-browse.org/browse/ubuntu/trusty/main/all/iproute2-doc/3.12.0-2/file/usr/share/doc/iproute2-doc/ss.html


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允许使用关键字 stateexclude,后跟一些状态标识符来过滤套接字状态。

状态标识符是标准 TCP 状态名称(未列出,如果您已经不知道它们,它们对您来说毫无用处)或缩写:

  • all - 对于所有州
  • bucket - 对于 TCP 微型套接字 ( TIME-WAIT|SYN-RECV)
  • big - 除迷你插座外的所有
  • connected - 未关闭且未聆听
  • synchronized- 连接和未连接SYN-SENT

Fe 转储所有 tcp 套接字,除了SYN-RECV

   ss exclude SYN-RECV

如果stateexclude指令均不存在,则状态过滤器默认为allwith 选项-a 或 to all,不包括监听、syn-recv、time-wait 和关闭的套接字。

3.2 按地址和端口过滤。

选项列表可能包含地址/端口过滤器。它是布尔表达式,由布尔运算 orandnot和谓词组成。实际上,布尔运算的所有名称都被吃掉了: &&&|||!,但不要忘记 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 ::1128/。 / 有助于理解冒号是 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-11. 列出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- 用于解析地址的默认地址族。此外,此选项还限制列出支持给定地址族的套接字。目前支持以下系列:unixinetinet6linknetlink
  • -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- 显示所有状态的套接字。默认情况下 ,状态LISTENTIME-WAIT和中的套接字会被跳过。SYN_RECVCLOSE
  • -l- 仅显示处于状态的插座LISTEN

STATE-FILTER

STATE-FILTER允许构造任意一组状态来匹配。其语法是关键字序列stateexclude后跟状态标识符。可用的标识符有:

  • 所有标准 TCP 状态: establishedsyn-sentsyn-recvfin-wait-1fin-wait-2time-waitclosedclose-waitlast-acklistenclosing
  • all- 对于所有州
  • connectedlisten- 除和之外的所有州closed
  • synchronizedconnected-除以下 所有州syn-sent
  • bucket- 状态,作为迷你套接字维护,即 time-waitsyn-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 字母的符号等legt

的格式和语义ADDRESS_PATTERN取决于地址族。

  • inet-ADDRESS_PATTERN由 IP 前缀组成,后面可以选择冒号和端口。如果前缀或端口部分缺失或替换为*,则表示通配符匹配。
  • inet6- 与 相同inet,仅前缀指的是 IPv6 地址。与冒号不同,inet冒号变得不明确,因此允许使用方案,就像在 URL 中使用的那样,其中地址由...ss支持 。[]
  • unix-ADDRESS_PATTERN是 shell 样式的通配符。
  • packet- 格式看起来像inet,仅保留接口索引而不是端口,并且仅保留链路层协议 ID 而不是地址。
  • netlink- 格式看起来像inet,只保留套接字 pid 而不是端口,并且保留 netlink 通道而不是地址。

PORTADDRESS_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,它表示套接字类型和传输协议,当它不明确时:tcpudprawu_str是 的缩写unix_streamu_dgr对于 UNIX 数据报套接字、nlnetlinkp_raw以及p_dgr原始和数据报包套接字。此列是可选的,如果过滤器选择唯一的网络 ID,它将被隐藏。

第二列是State。此处显示套接字状态。这些名称是标准 TCP 名称,但 除外UNCONN,这对于 TCP 来说是不可能发生的,但对于其他类型的未连接套接字来说是正常的。同样,该列可以隐藏。

然后两列(Recv-QSend-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 -atrtcp_diag - 0.47 秒

暂无评论。尽管注释是必要的,但大多数时间都tcp_diag浪费在内核内部,并且网络完全被阻止。超过10秒,是的。tcp_diag 在 100 毫秒的系统时间内执行相同的工作。

相关内容