我有一个在 Centos7 服务器上运行的 java 程序,该程序使用 JSch 库在另一台 Centos7 服务器上不断“跟踪”文件,以运行 ssh exec 进程,从而在目标机器上运行 shell 脚本。
最近我们遇到了一个问题,它停止从文件获取数据,而任何日志中都没有显示任何类型的断开连接(这是一个静默问题,因此看起来就像没有数据可获取一样)。
最终我发现问题是由于停止并启动了防火墙守护进程而导致的,重新启动后数据停止流动。如果您随后停止防火墙守护进程,数据流将恢复,但除此之外,唯一的解决方案是在启动防火墙守护进程后重新启动 Java 程序本身。
要在没有 Java 代码的情况下重现该问题,请执行以下操作:
- 有两个 Centos7 实例,其中一个可以 ssh 到另一个
- 在第一台机器(运行软件的机器)上打开两个终端
- 确保firewalld守护进程已在运行(
systemctl status firewalld
/systemctl start firewalld
) - 在第二个终端上运行 ssh exec 命令,如下所示(使用所需的任何凭据):
ssh -t user@second-server watch -n 1 date
- 你现在将看到当前时间在该终端上每秒更新一次,但正在目标服务器上运行
- 在第一个终端上停止firewalld(
systemctl stop firewalld
) - 在第一个终端上再次启动firewalld(
systemctl start firewalld
) - 您会注意到第二个终端中的日期/时间已停止更新
- 在第一个终端上再次停止firewalld(
systemctl stop firewalld
) - 您应该会在第二个终端上看到日期/时间更新恢复
我尝试在firewalld中打开最高级别的调试输出(--debug=10
在/etc/sysconfig/firewalld
配置文件中),并启用所有被拒绝的请求的日志记录(firewall-cmd --set-log-denied=all
),但是日志中没有任何内容表明它正在做什么来中断正在进行的ssh执行会话。
有什么方法可以配置firewalld 以使其不会中断正在进行的 ssh exec 会话?