CentOS6服务器SSH远程连接配置及权限管理常见问题包括连接被拒绝用户无权限访问如何处理
今天咱们来聊聊CentOS6服务器上SSH远程连接那些事儿。我见过太多人在这上面栽跟头,有时候服务器明明开机了,就是连不上;有时候连上了又被踢出来,说权限不够。别急,今天我把这些坑都给你填平。
为什么连不上?先看最基础的
首先,你得确认几件事,别一上来就瞎折腾配置文件。
服务器开机了吗? 这听起来像废话,但真有人对着黑屏的机器修SSH。你可以通过VMware控制台或者物理机的显示器确认一下。
IP地址变了没? 有时候DHCP重新分配,IP地址换了,你还用旧的连,当然找不到人。在服务器上运行:
ifconfig | grep "inet addr"
或者
ip addr show
看看现在的IP是什么。
端口对吗? SSH默认是22端口,但有些人会改。你可以检查服务器上监听的是什么端口:
netstat -tlnp | grep sshd
输出类似这样:
tcp 0 0 0.0.0.0:2222 0.0.0.0:* LISTEN 1234/sshd
这里端口是2222,那你客户端就要用 ssh -p 2222 user@ip 来连接。
连接被拒绝,常见原因分析
防火墙问题
这是最常见的”拦路虎”。CentOS6默认用iptables,如果iptables没放行22端口,外头的人根本敲不开门。
# 查看当前iptables规则
iptables -L -n -v
# 如果看到22端口没有规则,需要添加
iptables -I INPUT -p tcp --dport 22 -j ACCEPT
# 保存规则
service iptables save
# 重启iptables生效
service iptables restart
如果你不太熟悉iptables,也可以临时停掉防火墙来测试(测试完记得重新开启):
service iptables stop
测试连上了,再回来把规则配好,别一直开着空门。
SELinux拦路
CentOS6默认开启SELinux,它是个强力保镖,有时候太勤快会误杀好人。SSH相关的策略不对,也会把你拦在外面。
# 查看SELinux状态
getenforce
如果输出是Enforcing,可以临时切换到宽容模式测试:
setenforce 0
这时候再尝试连接,如果能连上,说明是SELinux的问题。你要做的就是调整策略,而不是一直开着宽容模式。
# 查看SELinux日志,找SSH相关的拒绝记录
grep "sshd" /var/log/audit/audit.log | grep denied
# 如果找到相关拒绝,可以生成策略
grep "sshd" /var/log/audit/audit.log | grep denied | audit2allow -M myssh
semodule -i myssh.pp
SSH服务根本没启动
有时候服务压根就没跑起来。
# 查看sshd状态
service sshd status
# 如果没启动,启动它
service sshd start
# 设置为开机自启
chkconfig sshd on
用户无权限访问,怎么解决
连上了但说没权限,这就更让人头疼了。咱们一个一个排查。
用户是否存在
最简单的可能:你要登的账号压根不存在。
# 查看/etc/passwd里有没有这个用户
grep "用户名" /etc/passwd
# 如果不存在,创建用户
useradd -m -s /bin/bash 用户名
passwd 用户名
SSH允许哪些用户登录
SSH配置里可能明确规定只允许某些用户或某些用户组登录。
# 编辑SSH配置
vi /etc/ssh/sshd_config
找到这几个关键配置项:
# 只允许指定用户登录(注释掉表示不限制)
# AllowUsers user1 user2
# 只允许指定用户组登录(注释掉表示不限制)
# AllowGroups wheel sshusers
# 拒绝指定用户
# DenyUsers baduser
比如你想让admin用户能登录,就加一行:
AllowUsers admin
改完之后记得重启SSH:
service sshd restart
密码问题
有时候就是密码记错了,或者大小写搞混了。你可以先在其他终端用su切换到那个用户试试密码对不对。
如果用户从来没有设置过密码,passwd命令会提示你设置:
passwd 用户名
密钥认证配置
现在很多地方用密钥认证代替密码登录。如果服务器配置了只允许密钥登录,你用密码当然登不上去。
# 查看SSH配置中认证方式
grep -i "PubkeyAuthentication\|PasswordAuthentication" /etc/ssh/sshd_config
输出可能类似:
PubkeyAuthentication yes
PasswordAuthentication no
这说明只允许密钥登录。你得把公钥放到服务器上:
# 在客户端生成密钥(如果没有的话)
ssh-keygen -t rsa -b 4096
# 把公钥拷贝到服务器
ssh-copy-id 用户名@服务器IP
如果ssh-copy-id用不了,手动操作也行:
# 在服务器上确保.ssh目录存在
mkdir -p /home/用户名/.ssh
chmod 700 /home/用户名/.ssh
# 把你本地的公钥内容追加到authorized_keys
echo "你的公钥内容" >> /home/用户名/.ssh/authorized_keys
chmod 600 /home/用户名/.ssh/authorized_keys
注意权限别搞错,.ssh目录要700,authorized_keys要600,否则OpenSSH会忽略它。
用户是否在允许登录的组里
有些系统配置了PermitRootLogin或者限制某些用户只能通过特定组登录。
# 查看用户属于哪些组
groups 用户名
# 查看wheel组有哪些人(wheel组通常有sudo权限)
getent group wheel
如果你想让用户有sudo权限,把他加到wheel组:
usermod -aG wheel 用户名
连接超时和断开的处理
有时候不是被拒绝,而是连了之后很快断开,或者一直超时。
网络层面的问题
# 在客户端测试端口是否通
telnet 服务器IP 22
# 或者用nc
nc -vz 服务器IP 22
如果telnet显示连接失败,说明网络层面就被拦住了,回到前面防火墙那块排查。
SSH服务器负载过高
服务器太忙的时候,SSH也可能响应不过来。你可以去服务器上看下负载:
uptime
top
如果CPU或者内存已经爆满,先解决资源问题,SSH自然就正常了。
客户端连接参数
有时候是客户端这边的问题,可以试试指定参数:
# 延长超时时间
ssh -o ServerAliveInterval=60 -o ServerAliveCountMax=3 用户名@IP
# 或者指定协议版本
ssh -1 用户名@IP
一些实用的小技巧
测试SSH配置有没有语法错误
改完sshd_config之后,别急着重启,先检查配置:
sshd -t
如果有错误,它会告诉你哪一行出了问题,比盲目重启省心多了。
开启调试模式
连接不上的时候,开启调试模式能看到详细过程:
# 客户端调试(数字越大越详细,1-3)
ssh -v 用户名@IP
ssh -vv 用户名@IP
ssh -vvv 用户名@IP
输出的信息里会告诉你哪一步卡住了,是密钥不对、密码错误、还是服务器拒绝了连接。
查看服务器端的日志
服务器端的日志是排查问题的金矿:
# 查看SSH相关日志
tail -f /var/log/secure
# 或者查看syslog
tail -f /var/log/messages
另一个终端尝试连接,然后在日志里观察记录,基本什么问题都能看出来。
备份配置文件
改任何东西之前先备份,这是好习惯:
cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
cp /etc/ssh/sshd_config /etc/ssh/sshd_config.$(date +%Y%m%d)
总结
CentOS6的SSH连接问题,说到底就几条路:
- 网络不通 —— 检查防火墙、端口、路由
- 服务没开 —— 启动sshd,设置开机自启
- SELinux拦路 —— 调整策略或临时切宽容模式排查
- 用户不对 —— 检查用户是否存在、密码对不对
- 权限配置 —— 查看AllowUsers、AllowGroups等配置
- 密钥没配 —— 确保公钥在authorized_keys里,权限正确
大多数问题,用ssh -vvv连一下,再看/var/log/secure的日志,基本就能定位了。排查的时候一步一步来,别一次性改太多东西,否则出了问题都不知道是哪里引起的。
