如何监控 smb 的连接情况

2023-05-09 01:54:08 +08:00
 sunrisewestern

如何监控 smb 的连接情况

有一 windows 电脑通过 smb 连接 linux 服务器的几个文件夹,是否可以在 linux 服务器上监控 windows 连接情况,比如是否断开连接,断开了多久之类,想要做到的是如果 windows 电脑断开连接超过 30 分钟,就拒绝下次连接。

  1. windows 电脑是客户电脑,我们没有操作权限
  2. 暂时只能用 smb 协议
  3. 服务器会在客户那边局域网运行,不能远程操控

现在的想法是通过监控 linux 上 samba 的 log ,但发现 log 里每隔几十秒就会 closed connection ,然后再 connect to service ,而且 windows 电脑断开后 log 里也不会显示。

当然可以看两次 connect to service 时间间隔是否超过 30 分钟,但不知道是否稳定.

1886 次点击
所在节点    Linux
5 条回复
lhbc
2023-05-09 02:02:01 +08:00
smbstatus
huntagain2008
2023-05-09 10:13:17 +08:00
小白问了 GPT-4 ,姑且看看也好,回答如下。

在这种情况下,您可以在 Linux 服务器上设置一些脚本和配置,以监控 Windows 电脑的连接情况并实施断开超过 30 分钟后拒绝连接的策略。以下是一个简单的解决方案:

1. 首先,确保您已在 Linux 服务器上安装了 Samba 。如果没有,可以使用以下命令安装(以 Ubuntu 为例):

```
sudo apt update
sudo apt install samba
```

2. 编辑 Samba 配置文件 `/etc/samba/smb.conf`,为您的共享文件夹添加以下选项:

```
[shared_folder]
path = /path/to/your/shared/folder
read only = no
guest ok = yes
preexec = /path/to/your/connect_script.sh %I
postexec = /path/to/your/disconnect_script.sh %I
```

这将为连接和断开连接分别指定要运行的脚本。

3. 创建一个名为 `connect_script.sh` 的脚本,用于记录连接的时间戳:

```bash
#!/bin/bash
touch "/path/to/your/connect_timestamps/$1"
```

4. 创建一个名为 `disconnect_script.sh` 的脚本,用于计算连接持续时间并实施 30 分钟限制:

```bash
#!/bin/bash
CONNECT_TIMESTAMPS_DIR="/path/to/your/connect_timestamps"
CURRENT_TIMESTAMP=$(date +%s)
CONNECT_TIMESTAMP=$(stat -c %Y "$CONNECT_TIMESTAMPS_DIR/$1")
ELAPSED_TIME=$((CURRENT_TIMESTAMP - CONNECT_TIMESTAMP))

# 30 分钟转换为秒
THIRTY_MINUTES_IN_SECONDS=$((30 * 60))

if [ $ELAPSED_TIME -gt $THIRTY_MINUTES_IN_SECONDS ]; then
# 拒绝未来的连接
iptables -A INPUT -s "$1" -j DROP
fi
```

5. 为这两个脚本设置可执行权限:

```
chmod +x /path/to/your/connect_script.sh /path/to/your/disconnect_script.sh
```

6. 重启 Samba 服务,以使更改生效:

```
sudo systemctl restart smbd
```

这个方案会在客户端连接和断开时分别调用 `connect_script.sh` 和 `disconnect_script.sh`。`disconnect_script.sh` 将计算连接持续时间,并在超过 30 分钟后拒绝来自客户端 IP 的未来连接。请注意,这个方案并不完美,如果客户端 IP 发生变化,拒绝策略可能会失效。
huntagain2008
2023-05-09 10:28:10 +08:00
Poe 只给了一次 GPT-4 机会,但是卡住了,我问了两个,又给了一个答案。这次用的是 smbstatus

要在 Linux 服务器上监控 Windows 电脑通过 SMB 连接的情况,并在断开连接超过 30 分钟后拒绝下次连接,您可以考虑以下解决方案:

1. 在服务器上安装并使用 Samba 。Samba 是一个开源的 SMB 实现,适用于 Linux 和 UNIX 系统。请根据您的 Linux 发行版安装相应的 Samba 软件包。配置 Samba 以允许客户端电脑通过 SMB 连接访问服务器上的共享文件夹。

2. 使用 `smbstatus` 命令来监控连接状态。这个命令可以显示当前 Samba 服务器上的所有活动连接。您可以编写一个脚本定期运行此命令,并分析输出以确定特定客户端的连接状态。例如:

````
#!/bin/bash

target_client="192.168.1.100" # 客户端 IP 地址
disconnect_threshold=1800 # 30 分钟,以秒为单位

while true; do
connection_info=$(smbstatus -b | grep $target_client)
if [ -z "$connection_info" ]; then
if [ -z "$disconnect_time" ]; then
disconnect_time=$(date +%s)
fi
duration=$(($(date +%s) - $disconnect_time))
if [ $duration -gt $disconnect_threshold ]; then
# 在此处添加您的拒绝连接操作,如修改 Samba 配置文件拒绝特定客户端
fi
else
unset disconnect_time
fi
sleep 60 # 每分钟检查一次
done
```

这个脚本会检查客户端连接状态,并在连接断开超过 30 分钟后执行拒绝连接的操作。您需要将 IP 地址更改为实际的客户端 IP 地址。

3. 为了拒绝特定客户端的连接,您可以编辑 Samba 配置文件(通常位于 `/etc/samba/smb.conf`)。在 `[global]` 部分添加以下内容,以阻止特定 IP 地址的客户端连接:

````
hosts deny = 192.168.1.100
```

保存更改后,您需要重新启动 Samba 服务以应用新的配置。

这个方案应该可以满足您的需求。但请注意,这并不是一种完美的解决方案,因为客户端可以更改 IP 地址或使用其他方法绕过限制。然而,作为一个基本的策略,它应该能达到您的目的。
MeteorVIP
2023-05-09 20:07:47 +08:00
@huntagain2008 #2 #3 你回答的问题我没有认真看。但,这种感觉很像以前外婆去算命问仙婆。
huntagain2008
2023-05-10 11:20:18 +08:00
#4 问 AI 找解决方案,怎么能扯到算命?小白认为用 AI 写代码修 BUG 又不是新鲜事了,今天有个帖子就是用 GPT 修的陈年 bug
让 gpt 给 oh-my-zsh 修了个陈年 bug
https://www.v2ex.com/t/938726

小白认为确实 AI 生成的代码可能存在不合适的场景,或者安全隐患,但这时首先你要能自己辨别,然后调整 prompt ,比如要避免某些安全问题,让 AI 再尝试其他路线。如果实在不合适,那就不用 AI 的答案就行,AI 就是辅助工具,用来参考即可,不要全搬。

ChatGPT 给的一个获取客户端 IP 的代码。评论区就警告他“不要随便相信 header 里面附带的 IP 变量!!!很多网站的 ip 限制就是被这种方式给骗过去的。”,所以懂的人他肯定是能辨别出来 GPT 的代码有安全问题。
https://www.v2ex.com/t/937951

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/938438

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX