如何检查守护进程正在侦听哪个接口?

gas*_*ter 34 daemon netstat

例如:sshd 配置为仅侦听 wlan0。所以。除了检查 sshd_config 之外,我如何检查守护进程是否正在侦听什么接口?netstat 可以吗?如何?(操作系统:openwrt 或 science linux 或 openbsd)

更新:

我认为 sshd 可能仅限于一个接口......但没有......(192.168.1.5 在 wlan0 上......)

# grep ^ListenAddress /etc/ssh/sshd_config 
ListenAddress 192.168.1.5:22
# 
# lsof -i -n -P
COMMAND     PID USER   FD   TYPE  DEVICE SIZE/OFF NODE NAME
sshd      23952 root    3u  IPv4 1718551      0t0  TCP 192.168.1.5:22 (LISTEN)
#
# ss -lp | grep -i ssh
0      128              192.168.1.5:ssh                           *:*        users:(("sshd",23952,3))
# 
# netstat -lp | grep -i ssh
tcp        0      0 a.lan:ssh                   *:*                         LISTEN      23952/sshd          
#
Run Code Online (Sandbox Code Playgroud)

小智 48

(您可能需要ip在 openwrt(v12 / 姿态调整)上安装该软件包

ifconfig/netstat 等被认为已弃用,因此您应该使用(作为 root)

ss -nlput | grep sshd
Run Code Online (Sandbox Code Playgroud)

显示包含字符串的sshd正在运行的程序正在侦听的 TCP/UDP 套接字

  • -n
    没有名称解析端口
  • -l
    仅监听套接字
  • -p
    显示进程正在监听
  • -u
    显示 udp 套接字
  • -t
    显示 tcp 套接字

然后你得到一个这样的列表:

tcp    LISTEN     0      128                    *:22                    *:*      users:(("sshd",3907,4))
tcp    LISTEN     0      128                   :::22                   :::*      users:(("sshd",3907,3))
tcp    LISTEN     0      128            127.0.0.1:6010                  *:*      users:(("sshd",4818,9))
tcp    LISTEN     0      128                  ::1:6010                 :::*      users:(("sshd",4818,8))
Run Code Online (Sandbox Code Playgroud)

有趣的是第 5 列显示了 IP 地址和端口的组合:

  1. *:22
    在每个可用的 IPv4 地址上侦听端口 22
  2. :::22
    在每个可用的 IP 地址上侦听端口 22(我不写 IPv6,因为 IP 是 IPv6 per RFC 6540
  3. 127.0.0.1:6010
    侦听 IPv4 地址 127.0.0.1(本地主机/环回)和端口 6010
  4. ::1:6010
    侦听 IP 地址 ::1(0:0:0:0:0:0:0:1 完整表示法,也是本地主机/环回)和端口 6010

然后,您想知道哪些接口具有 IPv4 地址(涵盖 1)。

ip -4 a
# or "ip -4 address"
# or "ip -4 address show"
Run Code Online (Sandbox Code Playgroud)

或 IP 地址(涵盖 2)

ip -6 a
# or "ip -6 address
# or "ip -6 address show
Run Code Online (Sandbox Code Playgroud)

(如果您不添加 IP ( -6) 或 IPv4 ( -4)选项,两者都会显示)

您还可以查看输出并搜索例如127.0.0.1或任何其他 IP/IPv4 地址

# here a demo where i show all addresses of the device "lo" (loopback)
ip a show dev lo
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
Run Code Online (Sandbox Code Playgroud)

inet和开头的行inet6显示这些 IP 绑定到此接口,每个接口可能有许多这样的行:

he-ipv6: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1480 qdisc noqueue state UNKNOWN
    link/sit 192.0.2.1 peer 192.0.2.3
    inet6 2001:db8:12::1/64 scope global
       valid_lft forever preferred_lft forever
    inet6 2001:db8::2/64 scope global
       valid_lft forever preferred_lft forever
    inet6 fe80::1111:1111/128 scope link
       valid_lft forever preferred_lft forever
Run Code Online (Sandbox Code Playgroud)

并在脚本中:

address="127.0.0.1"
for i in $(grep ':' /proc/net/dev | cut -d ':' -f 1 | tr -d ' ') ; do
        if $(ip address show dev $i | grep -q "${address}") ; then
                echo "${address} found on interface ${i}"
        fi
done
Run Code Online (Sandbox Code Playgroud)

(替换“127.0.0.1”)


sr_*_*sr_ 22

使用lsof(作为根):

# lsof -i -n -P
COMMAND    PID        USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
sshd      3028        root    3u  IPv4   7072      0t0  TCP *:22 (LISTEN)
sshd      3028        root    4u  IPv6   7074      0t0  TCP *:22 (LISTEN)
Run Code Online (Sandbox Code Playgroud)

iproute2ss能做到这一点,太(根):

# ss -lp
State      Recv-Q Send-Q      Local Address:Port          Peer Address:Port   
LISTEN     0      128                    :::ssh                     :::*        users:(("sshd",3028,4))
LISTEN     0      128                     *:ssh                      *:*        users:(("sshd",3028,3))
Run Code Online (Sandbox Code Playgroud)

...最后,netstat(以 root 身份):

# netstat -lp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 *:ssh                   *:*                     LISTEN      3028/sshd  
Run Code Online (Sandbox Code Playgroud)

  • 具体来说,`*:ssh` 或 `0.0.0.0:22` 表示它正在侦听通配符接口(即所有这些)。像`host-eth1:ssh`或`10.0.0.4:22`这样的东西意味着它正在监听那个特定的接口 (4认同)

Bat*_*hyX 10

据我所知,你不能(除了在 BSD 系统上,Finkregh 的解决方案工作正常)。这可能是可能的,但您不在乎,因为大多数应用程序都会侦听每个接口,即使绑定到 IP 地址也是如此。

在 linux(和 openwrt)上,应用程序仅在特定接口上侦听的唯一方法是 SO_BINDTODEVICEsocket 选项。很少有应用程序真正支持这一点,因为它是特定于操作系统的。那,或者他们使用数据包套接字,但那是用于低级协议(如 dhcp 服务器)。

在使用弱主机模型的 linux 上,默认情况下每个应用程序都会侦听每个接口,即使将套接字绑定到 IP 地址也是如此。唯一的例外是绑定到 127.0.0.1 时,这可确保应用程序仅侦听lo接口。

你没听错:如果你有两个接口(比如eth0eth1)有两个不同的 IP 地址(比如 192.0.2.1 foreth0和 198.51.100.1 for eth1)并且你告诉应用程序绑定到 192.0.2.1,应用程序仍然会监听两个接口,但仅当目标 IP 为 192.0.2.1 时才会响应。因此,eth1接口上的某个人,如果其路由表被适当定义,则可以通过接口上的 192.0.2.1 地址(但不能通过 198.51.100.1)访问您的应用程序eth1

假设绑定到 IP 地址与绑定到网络接口相同在 Linux 上是完全错误的。如果这让您感到困扰,请使用策略路由和/或iptables.