如何发现 sshd 的域和 https 连接尝试?

如何发现 sshd 的域和 https 连接尝试?

我正在运行我的sshd(8)正在听domainhttps端口。 (这些端口上还有什么可以运行?:)

显然,真正的 DNS(当回退到 TCP 时)和 HTTPS 客户端可能会尝试连接到侦听这些端口的 SSH 服务器。如何了解从 DNS/TCP 和 HTTPS/TCP 客户端收到的连接尝试次数?例如,是否有某种模式可供我搜索服务器日志,以查找与 SSH 服务器通信的 DNS/TCP 客户端或 HTTPS/TCP 客户端所特有的模式?有没有一些网络工具可以轻松地显示这一点?

我已经链接了 OpenBSD/etc/servicessshd以上版本,所以我显然主要对如何在 OpenBSD 上执行此操作感兴趣。但如果有一种跨平台的方法来执行此操作,并且不特定于任何单一操作系统,请包含它。

答案1

您可以添加基于内容的防火墙规则来分析传入连接的前几个字节。例如,在Linux下,使用iptables:

iptables -N notssh
iptables -A input -p tcp --dport 443 -m string --algo bm --from 0 --to 7 ! --string SSH-2.0 -j notssh

规则上的计数器notssh提供了该规则自建立以来或自使用 重置计数器以来触发的次数iptables -Z notssh。还有一个针对个人规则的计数器。

这会错误地计算 TCP 连接的第一个数据包包含少于 7 个字节的 SSH 协议的连接,但这种情况在实践中很少见。

答案2

TCP 客户端上的 DNS 可以通过以下方式进行模拟dig(1)像这样(我们明确使用端口,22因为domain端口可能不会在盒子本身上转换):

dig @example.org -p22 +tcp example.org

或者像这样

dig @example.org -p22 axfr example.org

它似乎会导致以下条目/var/log/authlog

Jan 10 15:08:41 example sshd[21075]: Did not receive identification string from 64.124.xxx.xx
Jan 10 15:08:51 example sshd[22052]: Did not receive identification string from 64.124.xxx.xx
Jan 10 15:09:01 example sshd[24980]: Did not receive identification string from 64.124.xxx.xx

而 https、

curl https://example.org:22/

似乎会产生以下条目(尽管每次尝试的条目数似乎因不同的浏览器而异):

Jan 10 15:25:06 example sshd[9203]: Bad protocol version identification '\\026\\003\\001' from 64.124.xxx.xx

似乎某些 HTTPS 连接尝试也以少一个字符结束:

Bad protocol version identification '\\026\\003' from

我们可以确定所有其他可能的变化:

% fgrep " sshd[" /var/log/authlog | cut -d" " -f7-12 | grep ^Bad | sort | uniq -c | sort -rn | head
 351 Bad protocol version identification '\\026\\003\\001' from
 110 Bad protocol version identification '\\026\\003\\001\\001E\\001' from
  91 Bad protocol version identification '\\026\\003\\002' from
  63 Bad protocol version identification '\\026\\003\\001\\001=\\001' from
  52 Bad protocol version identification '\\026\\003\\001\\002' from
  44 Bad protocol version identification '\\026\\003\\003' from
  21 Bad protocol version identification '\\026\\003\\001\\001?\\001' from
  16 Bad protocol version identification '\\026\\003\\001\\001B\\001' from
  13 Bad protocol version identification '\\026\\003\\001\\0017\\001' from
  10 Bad protocol version identification '\\026\\003' from

我们还可以看到可能的请求数量domain

% fgrep " sshd[" /var/log/authlog | cut -d" " -f7-12 | grep ^Did | sort | uniq -c
 227 Did not receive identification string from

答案3

这是一个更复杂的解决方案,但你可以尝试sslh ssl/ssh 多路复用器但我想你必须手动添加对 DNS 数据包的检查,并且sslh如果你需要原始客户端的地址(view在 DNS、allow/denyWeb 服务器和from=ssh 中authorized_keys),则必须在透明模式下进行配置

相关内容