如何检查守护程序在哪个接口上侦听?


28

例如: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          
#

Answers:


37

(您可能必须将软件包安装ip在openwrt上(v12 /姿态调整)

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

ss -nlput | grep sshd

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

  • -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是RFC 6540的 IPv6 )
  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

以开头inetinet6显示这些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”)


您的意思是没有确切的方法可以确定守护程序在哪个接口上侦听,因为它只能由IP地址确定?
加斯科·彼得

是的,正确。您(或我)可以扩展我发布的脚本,使其可以执行之前的步骤……
Oluf Lorenzen 2013年

1
SO_BINDTODEVICE呢?
PavelŠimerda'16

20

使用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)

iproute2ss也可以这样做(作为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(作为根):

# 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
具体来说,*:ssh0.0.0.0:22表示它正在通配符接口(即所有接口)上侦听。喜欢host-eth1:ssh10.0.0.4:22表示正在某个特定界面上进行监听
无用的

等待一分钟..我以为这是个好答案:D但没有,它没有接口..我怎么发现程序仅在给定的接口上监听?还是这个问题没有解决方案?:O
gasko peter 2012年

@gaskopeter您可以从显示的ip地址中查看界面(192.168.1.5a.lan在您的问题中)。如果*在此位置有一个,则它将在所有接口上侦听(*:ssh在sr_的答案中)。
Philipp Wendler 2013年

@Useless:仅在BSD系统上如此。
BatchyX

@BatchyX怎么回事?我至少在Arch Linux和Debian上可以看到Useless所说的话。
x-yuri 2015年

9

据我所知,您不能这样做(在BSD系统上,Finkregh的解决方案很好用)。可能是有可能的,但您不在乎,因为大多数应用程序都监听每个接口,即使绑定到IP地址也是如此。

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

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

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

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


-1

同样使用netstat,但具体参数为:

netstat -lp -i wlan0

1
您能再解释一下该命令的输出吗?:D
加斯科·彼得

老实说,我不知道。我不得不man netstat。我建议的区别在于更改运行的“查询”以显式指定您要检查的接口。
frogstarr78

“ netstat -lp -i wlan0”和“ netstat -i”在我的Ubuntu系统上给出了相同的响应
Bruce Barnett 2015年

1
netstat -i将列出接口,而不是侦听端口,-1表示不能反映实际情况的答案
Mikko Rantalainen
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.