例如: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 地址和端口的组合:
*:22
监听每个可用 IPv4 地址的端口 22:::22
监听每个可用 IP 地址的端口 22(我不写 IPv6,因为 IP 是 IPv6RFC 6540)127.0.0.1:6010
监听 IPv4 地址 127.0.0.1 (localhost/loopback) 和端口 6010::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
接口。
您没听错:如果您有两个接口(例如eth0
和eth1
),具有两个不同的 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