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

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

例如:sshd 配置为仅侦听 wlan0。所以。除了检查 sshd_config 之外,我如何检查守护进程正在侦听哪个接口? netstat可以吗?如何? (操作系统:openwrt或scientific 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          
#

答案1

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

考虑ifconfig/netstat等已弃用,所以你应该使用(作为root)

ss -nlput | grep sshd

显示包含字符串的正在运行的程序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))

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

  1. *:22
    监听每个可用 IPv4 地址的端口 22
  2. :::22
    监听每个可用 IP 地址的端口 22(我不写 IPv6,因为 IP 是 IPv6RFC 6540
  3. 127.0.0.1:6010
    监听 IPv4 地址 127.0.0.1 (localhost/loopback) 和端口 6010
  4. ::1:6010
    监听 IP 地址 ::1(完整表示法为 0:0:0:0:0:0:0:1,也是 localhost/loopback)和端口 6010

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

ip -4 a
# or "ip -4 address"
# or "ip -4 address show"

或 IP 地址(覆盖 2。)

ip -6 a
# or "ip -6 address
# or "ip -6 address show

(如果您不添加 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

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

并在脚本中:

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

(替换“127.0.0.1”)

答案2

使用lsof(以 root 身份):

# 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)

iproute2也可以ss做到这一点(作为 root):

# 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))

...最后,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  

答案3

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

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

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

您没听错:如果您有两个接口(例如eth0eth1),具有两个不同的 IP 地址(例如 192.0.2.1eth0和 198.51.100.1 eth1),并且您告诉应用程序绑定到 192.0.2.1,则该应用程序仍将侦听两个接口,但仅当目标 IP 为 192.0.2.1 时才会响应。因此,如果接口上的路由表已正确定义,则该接口上的某人eth1可以通过接口上的 192.0.2.1 地址(但不能通过 198.51.100.1)访问您的应用程序eth1

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

答案4

也可以使用 netstat 但具体参数是:

netstat -lp -i wlan0

相关内容