在网络安全管理中,通过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访问控制体系,在保障运维便利性的同时,显著提升服务器抗攻击能力,实际操作中需根据业务需求灵活组合策略,并定期进行安全审计与优化。