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

基于SSH配置文件的IP限制
SSH服务的IP限制可通过修改SSH主配置文件/etc/ssh/sshd_config实现,这是最直接且常用的方法,具体操作分为两步:启用sshd_config中的AllowUsers或AllowGroups指令,并结合hosts.allow与hosts.deny实现更精细的控制。
使用AllowUsers或AllowGroups
AllowUsers指令用于指定允许通过SSH登录的用户及其来源IP,格式为"用户@IP地址",仅允许用户admin从IP168.1.100和user1从168.1.0/24网段登录,可在sshd_config中添加:
AllowUsers admin@192.168.1.100 user1@192.168.1.0/24
若需限制特定用户组,可使用AllowGroups指令,例如仅允许sudo组用户登录:
AllowGroups sudo
配置完成后,需重启SSH服务使生效(systemctl restart sshd或service 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_config中UseDNS为no(减少DNS查询开销),并重启SSH服务。
基于防火墙的IP限制
对于使用iptables、firewalld或nftables等防火墙工具的系统,通过规则直接过滤SSH流量是更灵活的方式,尤其适合需要动态调整策略的场景。

使用iptables实现限制
iptables是Linux经典防火墙工具,通过添加INPUT链规则可控制SSH端口(默认22)的访问。
- 仅允许IP
168.1.100和0.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 Authenticator或pam_ssh_agent_auth等工具实现2FA,用户需同时提供密码和动态验证码,例如安装google-authenticator:

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小时
启动fail2ban:systemctl start fail2ban。
常见问题与解决方案
限制后无法连接,如何排查?
- 检查
sshd_config语法:sshd -t。 - 确认防火墙规则是否正确:
iptables -L INPUT -n或firewall-cmd --list-all。 - 验证IP是否在允许列表中(如
AllowUsers或hosts.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访问控制体系,在保障运维便利性的同时,显著提升服务器抗攻击能力,实际操作中需根据业务需求灵活组合策略,并定期进行安全审计与优化。




