如何设置ssh不仅尝试端口22,而且每次尝试次端口?


9

为了减少日志中的噪音并稍微降低可发现性(并且在fail2ban之上,仅允许公共密钥身份验证等),我经常在设置为其他端口的服务器上更改sshd端口,例如5492。目前我将-p 5492附加到我的ssh命令中,或将每个特定服务器的端口添加到了我的中ssh_config

如果端口22不起作用,是否可以配置ssh尝试同时连接到端口22和端口5492?


1
我确实更喜欢通过模糊性来提高安全性,设置VPN以及根本没有开放到Internet的ssh端口。
Rui F Ribeiro

2
@RuiFRibeiro我同意,这并不安全。但是,它确实可以降低日志文件中的噪音。人们还可以使用端口敲门来减少登录尝试,这确实提高了安全性。
Ned64

2
@RuiFRibeiro VPN服务器比SSH服务器安全吗?
莱利

这完全取决于实现。在我以前的工作中,我定义了2个VPN条目以实现冗余,而ssh外部则没有任何存在。
Rui F Ribeiro

2
默默无闻的安全性是良好设置基础上的一个很好的附加层,尤其是当它涉及机会攻击者时。
rackandboneman '18

Answers:


11

您可以将shell脚本包装起来,ssh但是ssh它本身不会这样做。

使用bash函数的一种方法是这样(放入~/.bashrc):

function ssh() { command ssh -p 22 "$@" || command ssh -p 5492 "$@"; }

顺便提一下,建议将root保留的端口用于系统服务,例如ssh,以避免用户拥有监听端口5492的进程。否则,他们可能会在中间玩弄人并可能捕获登录数据。因此,请使用<1024的端口。


1
那是一个很好的解决方案。在港口上也很值得一提!
莱利

5
请注意,即使by所执行的命令返回非零值,即使第一个连接成功也将建立第二个连接ssh。一个简单的例子是ssh user@server false
Kusalananda

1
@Kusalananda谢谢,我已经写command了。您只是想避免递归,因为您已经猜对了。
Ned64

@Kusalananda提到的问题可以(主要)通过测试特定的退出状态来避免ssh-如果存在ssh错误(与远程命令失败相对),它将退出,状态为255。因此,它command ssh -p 22 "$@"; if [ "$?" -eq 255 ]; then command ssh -p 5492 "$@"; fi应该可以工作。
戈登·戴维森

10

ssh本身可以通过Match文档化的方式来做到这一点,ssh_config(5)尽管文档中的示例有些稀疏。如果有人希望将复杂性推入SSH配置,尽管受到ssh_config(5)语法限制的限制,并且可能需要一些摆弄才能达到期望的结果,但这种形式可能是合适的。值得注意的是,自定义端口可能无法设置,或者在上Match一次尝试中可能设置错误。这就是为什么下面在测试时将其设置两次,或将其设置为默认值,而在建立规范默认值时未设置的原因。

# here we set the defaults for the host (no port!)
Match !canonical host testhost
  CanonicalizeHostname yes
  Hostname 192.0.2.42
  IdentityFile ~/.ssh/id_blahblah
  ...
# port available?
Match canonical host 192.0.2.42 exec "is-ssh-up %h 2222"
  Port 2222
# or the default port
Match canonical host 192.0.2.42
  Port 22

is-ssh-up 仅检查给定端口上是否有响应,可能看起来像

#!/usr/bin/env expect
package require Tcl 8.5
if {[llength $argv] < 2} {
   puts stderr "Usage: is-ssh-up host port"
   exit 1
}
puts stderr "is-ssh-up: DEBUG trying $argv"
set socket [socket -async [lindex $argv 0] [lindex $argv 1]]
chan event $socket readable [list exit 0]
after 3000 [list exit 1]
vwait godot

1
.ssh / config中的if-then-else吗?我不会相信的!
Archemar

1

您可以使用的通配符功能~.ssh/config,将此条目放入列表中:

Host *
Port 5492

但这不会单独降至22。

如果将其放在末尾,则仍可以为那些需要22的主机覆盖它,方法是在其上面放置一个不同的值。(而且您始终可以在命令行上覆盖它。)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.