我想仅允许某些主机通过 SSH 连接到我的服务器,并拒绝其余主机并显示友好的错误消息。系统的授权用户通常不是技术人员,他们通过 Filezilla 访问此系统。
我以为我可以使用 TCP Wrappers 来做到这一点,但是当我将下面的内容输入到我的客户端时hosts.deny
,客户端只会收到错误消息“ssh_exchange_identification:远程主机关闭连接”
sshd : ALL \
: twist /bin/echo "Sorry, but your host is not allowed to connect to this server." \
: deny
我偶然发现一个脚本,SSH 扭曲,这似乎解决了这个问题,但我在客户端上看到同样的错误。
不管怎样,我在 RHEL 6.1 上用 OpenSSH 5.3p1 进行测试。
答案1
SSH Twist 看起来有点像黑客,而且我无法保证它适用于所有sshd
版本——它对于在会话建立期间可以发送什么做出了不一定正确的假设。
这有点丑陋,但你可以做这样的事情sshd_config
:
Match Host allowedhost1
Match Host allowedhost2
# one for each host (or hostname pattern or address range) permitted
# no commands in them, just the match entries
# this just makes sure they don't fall into the following catch-all
Match Host *
Banner /etc/ssh/refuse_msg
DenyUsers *
答案2
类似于geekosaur的回答,我最终想到了以下解决方案:(我需要的消息不是针对不同的主机,而是针对不同的用户,但原理应该是相同的。)
Match User *,!user1,!user2,!root
Banner /etc/ssh/refuse_msg
ForceCommand echo
我没有让 ForceCommand 与多个“Match”行一起工作(就像 geekosaur 的回答一样),因为它总是使用 ForceCommand,可能是因为没有选项“ForceCommand off”。
手册页说,Match-Section 中的第一个语句“获胜”,但由于之前的 Match-Statements 不包含 Banner 或 ForceCommand,因此使用了末尾的语句。对于 Banner,我可以使用“Banner /dev/null”,但 ForceCommand 中没有任何内容可以输入...