例如: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-t然后你得到一个这样的列表:
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 地址和端口的组合:
*:22:::22127.0.0.1:6010::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)
iproute2的ss能做到这一点,太(根):
# 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)
Bat*_*hyX 10
据我所知,你不能(除了在 BSD 系统上,Finkregh 的解决方案工作正常)。这可能是可能的,但您不在乎,因为大多数应用程序都会侦听每个接口,即使绑定到 IP 地址也是如此。
在 linux(和 openwrt)上,应用程序仅在特定接口上侦听的唯一方法是 SO_BINDTODEVICEsocket 选项。很少有应用程序真正支持这一点,因为它是特定于操作系统的。那,或者他们使用数据包套接字,但那是用于低级协议(如 dhcp 服务器)。
在使用弱主机模型的 linux 上,默认情况下每个应用程序都会侦听每个接口,即使将套接字绑定到 IP 地址也是如此。唯一的例外是绑定到 127.0.0.1 时,这可确保应用程序仅侦听lo接口。
你没听错:如果你有两个接口(比如eth0和eth1)有两个不同的 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.
| 归档时间: |
|
| 查看次数: |
107261 次 |
| 最近记录: |