我是服务器管理的新手,为防火墙编写了一个 IPTables 脚本。我非常关心我的服务器的安全性,因此我对经常从使用防火墙的人那里读到的一些东西感到疑惑,那就是限制进入服务器的 SSH 连接的来源。
问题在于我的服务器是我租用的远程服务器,作为一个从家里和工作地点连接到服务器的人,我没有理由相信我的家庭和工作 IP 会永远保持不变。所以,如果我将 SSH 源限制在我的服务器上,那么如果我家里的 IP 发生变化怎么办?如果我去其他国家/地区并想访问我的服务器怎么办?我经常出差。
听起来我好像错过了一些东西......所以你们能解释一下解决这个问题的有效方法吗?
问题是:如何才能限制 SSH 连接的来源而不限制我自己对服务器的访问?
感谢您的一切努力。
答案1
Iptables 不是解决此问题的正确工具,因为它仅限于通过简单参数(例如源或目标地址、端口、协议等)进行过滤。
您应该按照此处所述设置 SSH 公钥身份验证Ubuntu 文档 HowtTo,然后强制使用此 PK 身份验证Linux.org 操作指南。
您可以通过阻止来自您不打算前往的国家/地区的源 IP 地址的 SSH 来增强此功能。但是,坚定的攻击者可能会在几乎任何国家/地区都有攻击点,因此这种方法的好处有限。
答案2
正如@Jonathan Ben-Avraham 的回答一样,首先要做的是禁用密码访问并切换到公钥仅有的。当然,这要求你不要丢失私钥:将备份保存在安全的地方。
您应该采取的第二种方法是限制传入的 SSH 连接数。添加一条 iptables 规则,如下所示
iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW \
-m hashlimit --hashlimit-above 1/min --hashlimit-mode srcip \
--hashlimit-name ssh --hashlimit-burst 5 -j REJECT
这个想法是,您可以(尝试)登录五次,但随后您将被冻结一分钟。这不会给授权用户带来不便,但破解脚本会尝试网络上流传的每个密码(或私钥)以寻找匹配项,这将被非常有效地阻止。
您可能还想添加双因素身份验证。此链接https://www.digitalocean.com/community/articles/how-to-protect-ssh-with-two-factor-authentication很好地描述了这个过程;基本上,你安装 libpam-google-authenticator 包,添加auth required pam_google_authenticator.so
到/etc/pam.d/sshd
,在你的手机上安装 Google Authenticator 或 androidtoken 应用程序,google-authenticator
在你的服务器上运行以进行设置,然后重新启动 ssh 服务。(这实际上是通用 TOTP(RFC 6238),与 Google 无关,据我所知也不会与他们对话。)
答案3
如果您无法限制需要连接到 ssh 服务器的源地址的范围,请查看以下链接。Poet knocking 基本上允许您根据客户端发送的数据包序列动态打开端口(维基百科会告诉您更多信息)
因此,除非您使用正确的代码敲开防火墙的门,否则端口将保持关闭状态。
恕我直言,这不是我所说的优雅的解决方案,并且需要客户端,但这似乎符合您的需求。