通过 IP 地址限制对特定客户端的 SSH 访问

Ran*_*mar 41 linux firewall sshd

我们如何允许某些私有 IP 通过 SSH 登录(RSA 密钥对)进入 Linux 服务器?

seb*_*sth 69

您可以通过配置TCP 包装器 或使用iptables过滤网络流量(防火墙)来限制哪些主机可以连接。如果要根据客户端 IP 地址使用不同的身份验证方法,请改为配置 SSH 守护程序(选项 3)。

选项 1:使用 IPTABLES 过滤

iptables 规则按顺序评估,直到第一次匹配。

例如,允许来自 192.168.0.0/24 网络的流量,否则丢弃流量(到端口 22)。的DROP,如果你的iptables默认策略配置为不需要的规则DROP

iptables -A INPUT -p tcp --dport 22 --source 192.168.0.0/24 -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j DROP
Run Code Online (Sandbox Code Playgroud)

您可以在丢弃规则之前添加更多规则以匹配更多网络/主机。如果你有很多网络或主机地址,你应该使用ipset模块。还有iprange模块允许使用任意范围的 IP 地址。

iptables 在重新启动后不是持久的。您需要配置一些机制来在启动时恢复 iptables。

iptables仅适用于 IPv4 流量。具有 ssh 侦听 IPv6 地址的系统可以使用ip6tables.

选项 2:使用 TCP 包装器

注意:这可能不是现代发行版的选项,因为从OpenSSH 6.7 中删除了对 tcpwrappers 的支持

您还可以配置哪些主机可以使用 TCP 包装器进行连接。使用 TCP 包装器,除了 IP 地址之外,您还可以在规则中使用主机名。

默认情况下,拒绝所有主机。

/etc/hosts.deny

sshd : ALL
Run Code Online (Sandbox Code Playgroud)

然后在 hosts.allow 中列出允许的主机。例如允许网络192.168.0.0/24localhost

/etc/hosts.allow

sshd : 192.168.0.0/24
sshd : 127.0.0.1
sshd : [::1]
Run Code Online (Sandbox Code Playgroud)

选项 3:SSH 守护进程配置

您可以在 sshd_config 中配置 ssh 守护程序以根据客户端地址/主机名使用不同的身份验证方法。如果您只想阻止其他主机连接,则应改用 iptables 或 TCP 包装器。

首先删除默认身份验证方法:

PasswordAuthentication no
PubkeyAuthentication no
Run Code Online (Sandbox Code Playgroud)

然后Match Address在文件末尾的a 之后添加所需的身份验证方法。放置Match在文件的结尾是重要的,因为所有它后配置线被放置在条件块内,直到下一个Match线。例如:

Match Address 127.0.0.*
    PubkeyAuthentication yes
Run Code Online (Sandbox Code Playgroud)

其他客户端仍然可以连接,但登录将失败,因为没有可用的身份验证方法。

匹配参数和允许的条件配置选项记录在 sshd_config 手册页中。匹配模式记录在ssh_config 手册页中

  • 此外, ,sshd_config 可以使用 AlowUsers 指令设置过滤,并且也可以使用“来自 IP 或子网”来设置authorized_keys 以进行过滤。 (3认同)
  • 请注意,`sshd` 必须链接到 `libwrap` 才能使 TCP 包装器工作(参见例如 [此处](https://www.thegeekdiary.com/understanding-tcp-wrappers-in-linux/))并且支持tcpwrappers/libwrap 从 [OpenSSH in v.6.7](https://lwn.net/Articles/615173/) 中删除。在许多现代系统上,选项 2 可能不再有效。 (2认同)

ton*_*ioc 21

这里有一些额外的 SSH 守护进程配置来扩展以前的答案:

  • 使用文件中的AllowUsers选项添加用户过滤sshd_config

    AllowUsers johndoe@192.168.1.* admin2@192.168.1.* otherid1 otherid2
    
    Run Code Online (Sandbox Code Playgroud)

    这使得输入johndoeAdmin2的只是从192.168.1.*地址和otherid1otherid2从任何地方。

  • 将 ssh 密钥或基于 ca 的密钥限制为.ssh/authorized_keys给定用户主目录文件中的一组地址:

    from="192.168.1.*,192.168.2.*" ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABA...etc...mnMo7n1DD useralias
    
    Run Code Online (Sandbox Code Playgroud)

    在此示例中,用户别名的公钥仅对给定地址有效。

  • 就我而言,sshd 中的白名单比使用 iptables/ufw 更好。防火墙无法跟上流量。我们只需要锁定 ssh,因此将 AllowUsers 子句添加到 /etc/ssh/sshd_config 是一个更轻量级的解决方案。否则,您必须不断调整您的防火墙。您还必须对防火墙进行压力/负载测试,并且很难预测真实的网络流量模式。 (6认同)
  • 第二种方法很棒,因为它是最小的,谢谢。对于其他人的小提示,即使在单个显式地址的情况下,双引号也是必需的。 (3认同)

小智 6

如果您不介意安装 UFW(简单防火墙):

sudo ufw allow from 192.168.1.0/24 to any port 22
Run Code Online (Sandbox Code Playgroud)

编辑:如前所述,最好只使用密钥而不是密码进行身份验证,这可以通过编辑来完成/etc/ssh/sshd_config

sudo ufw allow from 192.168.1.0/24 to any port 22
Run Code Online (Sandbox Code Playgroud)