服务器测评网
我们一直在努力

如何限制Linux SSH只允许特定IP访问?

在网络安全管理中,通过Linux SSH限制IP访问是提升服务器安全性的基础且有效的手段,SSH(Secure Shell)作为远程管理服务器的核心协议,其默认开放所有IP的连接方式可能成为恶意攻击的入口,通过配置IP限制,可以仅允许特定信任的IP地址访问SSH服务,大幅降低暴力破解、未授权访问等安全风险,本文将从配置方法、高级策略、常见问题及最佳实践等方面,系统介绍Linux SSH限制IP的实现方案。

如何限制Linux SSH只允许特定IP访问?

基于SSH配置文件的IP限制

SSH服务的IP限制可通过修改SSH主配置文件/etc/ssh/sshd_config实现,这是最直接且常用的方法,具体操作分为两步:启用sshd_config中的AllowUsersAllowGroups指令,并结合hosts.allowhosts.deny实现更精细的控制。

使用AllowUsersAllowGroups

AllowUsers指令用于指定允许通过SSH登录的用户及其来源IP,格式为"用户@IP地址",仅允许用户admin从IP168.1.100user1168.1.0/24网段登录,可在sshd_config中添加:

AllowUsers admin@192.168.1.100 user1@192.168.1.0/24

若需限制特定用户组,可使用AllowGroups指令,例如仅允许sudo组用户登录:

AllowGroups sudo

配置完成后,需重启SSH服务使生效(systemctl restart sshdservice sshd restart)。

结合TCP Wrappers控制

TCP Wrappers是Linux系统自带的访问控制工具,通过/etc/hosts.allow/etc/hosts.deny文件管理基于IP的访问策略,其优先级高于sshd_config,规则遵循“先匹配即生效”原则。

  • /etc/hosts.allow中允许特定IP:
    sshd: 192.168.1.0/24, 10.0.0.5
  • /etc/hosts.deny中拒绝其他所有IP:
    sshd: ALL

    配置后需确保sshd_configUseDNSno(减少DNS查询开销),并重启SSH服务。

基于防火墙的IP限制

对于使用iptablesfirewalldnftables等防火墙工具的系统,通过规则直接过滤SSH流量是更灵活的方式,尤其适合需要动态调整策略的场景。

如何限制Linux SSH只允许特定IP访问?

使用iptables实现限制

iptables是Linux经典防火墙工具,通过添加INPUT链规则可控制SSH端口(默认22)的访问。

  • 仅允许IP168.1.1000.0.0/8网段访问SSH:
    iptables -A INPUT -p tcp --dport 22 -s 192.168.1.100 -j ACCEPT
    iptables -A INPUT -p tcp --dport 22 -s 10.0.0.0/8 -j ACCEPT
    iptables -A INPUT -p tcp --dport 22 -j DROP
  • 保存规则(CentOS/RHEL:service iptables save;Ubuntu/Debian:iptables-save > /etc/iptables/rules.v4)。

使用firewalld实现限制

firewalld是CentOS 7+、RHEL 7+及Ubuntu 18.04+的默认防火墙,支持区域(Zone)和富规则(Rich Rules)配置。

  • 将SSH服务添加到trusted区域(允许所有IP):
    firewall-cmd --permanent --zone=trusted --add-service=ssh
  • 限制特定IP访问public区域(默认区域):
    firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.1.100" service name="ssh" accept'
    firewall-cmd --permanent --zone=public --remove-service=ssh
  • 重新加载防火墙:firewall-cmd --reload

使用nftables实现限制

nftables是iptables的替代品,语法更简洁。

nft add table inet filter
nft add chain inet filter input { type filter hook input priority 0 \; }
nft add rule inet filter input tcp dport ssh ip saddr 192.168.1.100 accept
nft add rule inet filter input tcp dport ssh drop

高级IP限制策略

在基础限制之上,可通过端口变更、双因素认证、 fail2ban 等工具进一步提升SSH安全性。

更改SSH默认端口

默认端口22易受自动化攻击扫描,修改为非标准端口(如2222)可降低风险,在sshd_config中设置:

Port 2222

重启SSH服务后,需同步更新防火墙规则(如iptables -A INPUT -p tcp --dport 2222 -j ACCEPT)。

结合双因素认证(2FA)

即使IP受限,凭证泄露仍存在风险,通过Google Authenticatorpam_ssh_agent_auth等工具实现2FA,用户需同时提供密码和动态验证码,例如安装google-authenticator

如何限制Linux SSH只允许特定IP访问?

sudo apt install libpam-google-authenticator  # Ubuntu/Debian
sudo yum install google-authenticator         # CentOS/RHEL
google-authenticator  # 按提示配置

编辑/etc/pam.d/sshd,添加:

auth required pam_google_authenticator.so

使用fail2ban动态封禁恶意IP

fail2ban可实时监控日志(如/var/log/auth.log),对多次失败登录的IP实施临时封禁,安装后编辑/etc/fail2ban/jail.local

[sshd]
enabled = true
port = 22
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
bantime = 3600  # 封禁1小时

启动fail2bansystemctl start fail2ban

常见问题与解决方案

限制后无法连接,如何排查?

  • 检查sshd_config语法:sshd -t
  • 确认防火墙规则是否正确:iptables -L INPUT -nfirewall-cmd --list-all
  • 验证IP是否在允许列表中(如AllowUsershosts.allow)。
  • 查看SSH日志:/var/log/auth.log/var/log/secure

如何临时允许某IP访问?

可通过iptables添加临时规则(不保存至配置文件),

iptables -I INPUT -p tcp --dport 22 -s 203.0.113.1 -j ACCEPT

或使用firewalld的临时规则(不加--permanent)。

限制网段时如何表示?

  • CIDR表示法:168.1.0/24表示168.1.1-192.168.1.254
  • 点分十进制掩码:168.1.0/255.255.255.0(与/24等效)。

最佳实践总结

策略 说明
多重限制 结合sshd_config、防火墙、TCP Wrappers实现多层防护
定期更新规则 根据网络变化动态调整允许IP列表
日志监控 启用SSH详细日志(LogLevel VERBOSE),定期分析异常登录尝试
禁用root直接登录 sshd_config中设置PermitRootLogin no,通过普通用户sudo提权
使用密钥认证 禁用密码登录(PasswordAuthentication no),仅允许SSH密钥认证

通过以上方法,可有效构建SSH访问控制体系,在保障运维便利性的同时,显著提升服务器抗攻击能力,实际操作中需根据业务需求灵活组合策略,并定期进行安全审计与优化。

赞(0)
未经允许不得转载:好主机测评网 » 如何限制Linux SSH只允许特定IP访问?