Shell脚本如何修改SSH默认端口:自动化安全配置完整指南
目录导读
为什么需要修改SSH默认端口?
SSH(安全外壳协议)默认监听22端口,这使其成为黑客暴力破解和端口扫描的首要目标,据统计,全球超过80%的自动化扫描工具会优先探测22端口,将SSH端口修改为非标准端口(如2222、9922等),能显著降低被自动化攻击的风险。

手动修改SSH配置繁琐且容易出错:需要编辑/etc/ssh/sshd_config文件,还要处理防火墙规则、SELinux策略等,使用Shell脚本可以自动化完成这些操作,提升效率、减少人为失误。
手动修改SSH端口的基础操作
在编写脚本之前,先回顾手动流程:
- 备份配置文件:
sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak - 编辑配置文件:找到
#Port 22,改为Port 2222(或你选择的其他端口) - 添加防火墙规则(以firewalld为例):
sudo firewall-cmd --permanent --add-port=2222/tcp - 重启SSH服务:
sudo systemctl restart sshd - 保持当前SSH会话打开,新开终端测试新端口连接,确认成功后再关闭旧会话。
容易出错的地方:忘记防火墙规则、SELinux阻止端口、语法错误导致SSH服务无法启动。
Shell脚本自动化修改SSH端口
基础脚本编写
以下是一个自动修改端口的Shell脚本(change_ssh_port.sh):
#!/bin/bash
# 默认配置
NEW_PORT=${1:-2222} # 允许通过参数指定端口,默认为2222
SSHD_CONFIG="/etc/ssh/sshd_config"
BACKUP_FILE="${SSHD_CONFIG}.backup.$(date +%Y%m%d%H%M%S)"
# 检查是否以root运行
if [ "$EUID" -ne 0 ]; then
echo "错误:请以root权限运行此脚本"
exit 1
fi
echo "开始修改SSH端口为: $NEW_PORT"
# 1. 备份配置文件
cp "$SSHD_CONFIG" "$BACKUP_FILE"
echo "配置文件已备份至: $BACKUP_FILE"
# 2. 修改端口配置
sed -i "s/^#Port 22/Port $NEW_PORT/" "$SSHD_CONFIG"
sed -i "s/^Port 22/Port $NEW_PORT/" "$SSHD_CONFIG"
# 如果文件中没有Port行,则追加
grep -q "^Port" "$SSHD_CONFIG" || echo "Port $NEW_PORT" >> "$SSHD_CONFIG"
# 3. 验证配置文件语法
sudo sshd -t
if [ $? -ne 0 ]; then
echo "SSH配置语法错误!恢复备份..."
cp "$BACKUP_FILE" "$SSHD_CONFIG"
exit 1
fi
# 4. 配置防火墙(支持firewalld和iptables)
if command -v firewall-cmd &>/dev/null; then
firewall-cmd --permanent --add-port=${NEW_PORT}/tcp
firewall-cmd --reload
elif command -v iptables &>/dev/null; then
iptables -I INPUT -p tcp --dport $NEW_PORT -j ACCEPT
iptables-save > /etc/sysconfig/iptables
fi
# 5. 重启SSH服务
systemctl restart sshd
echo "SSH端口已修改为:$NEW_PORT"
echo "请保持当前会话打开,另开终端进行测试!"
echo "测试命令:ssh -p $NEW_PORT 用户名@服务器IP"
使用方法:
sudo chmod +x change_ssh_port.sh sudo ./change_ssh_port.sh 2222 # 将端口改为2222
增强版脚本:备份与回滚
在实际生产环境,还需要考虑:
- 检测SELinux:如果SELinux开启,需要添加端口对应策略
- 自动回滚:如果用户连接失败,提供一键恢复
以下增加SELinux处理与回滚功能:
#!/bin/bash
# ...(保留前面备份、修改、防火墙部分)
# 处理SELinux
if command -v getenforce &>/dev/null; then
if [ "$(getenforce)" != "Disabled" ]; then
semanage port -a -t ssh_port_t -p tcp $NEW_PORT 2>/dev/null
if [ $? -ne 0 ]; then
semanage port -m -t ssh_port_t -p tcp $NEW_PORT
fi
fi
fi
# 创建回滚脚本
cat > /tmp/rollback_ssh_port.sh << EOF
#!/bin/bash
cp "$BACKUP_FILE" "$SSHD_CONFIG"
systemctl restart sshd
echo "已恢复到原始配置"
EOF
chmod +x /tmp/rollback_ssh_port.sh
echo "如需回滚,请运行:sudo /tmp/rollback_ssh_port.sh"
批量修改多台服务器的脚本
对于上百台服务器,可以通过SSH远程执行脚本,在控制机上创建batch_change.sh:
#!/bin/bash
SERVER_LIST="servers.txt" # 每行一个IP或域名
NEW_PORT=${1:-2222}
SSH_USER="your_user"
SSH_KEY="/path/to/private_key"
while IFS= read -r server; do
echo "正在处理: $server"
ssh -i "$SSH_KEY" -o StrictHostKeyChecking=no "$SSH_USER@$server" \
"bash -s" < change_ssh_port.sh "$NEW_PORT" &
done < "$SERVER_LIST"
wait
echo "批量修改完成!"
优化提示:在~/.ssh/config中为被管理服务器预配置旧端口连接参数,避免连接失败。
常见问题与问答(FAQ)
Q1:修改端口后无法连接SSH怎么办?
答:保持原会话不要关闭,检查:
- 防火墙是否放行新端口:
sudo firewall-cmd --list-all - SELinux是否阻止:
sudo ausearch -m avc -ts recent - SSH服务状态:
sudo systemctl status sshd - 配置语法:
sudo sshd -t
Q2:脚本报错“sed: -i may not be used with stdin”怎么解决?
答:在MacOS或FreeBSD的sed中,-i参数需要跟扩展名,将sed -i改为sed -i ''即可,本文脚本针对Linux,如果跨平台可增加判断。
Q3:修改端口后还需要做什么安全措施?
答:
- 配置密钥认证并禁用密码登录
- 使用fail2ban限制暴力破解
- 只允许特定IP访问SSH端口(通过防火墙或/etc/hosts.allow)
- 更改SSH端口只是基础防御,不能替代强密码或密钥
Q4:能否使用脚本同时修改多个端口?
答:SSH配置只支持一个监听端口(可以配置多个Port行,但会带来兼容性问题),推荐使用单个非标准端口,并配合防火墙限制。
安全须知与最佳实践
- 测试环境先行:在备份脚本或测试服务器上验证后,再用于生产环境
- 保留备用连接方式:如果可能,同时保留本机控制台或带外管理(如IPMI)以防万一
- 端口选择策略:避免使用临时端口或已注册端口(如8080、3306),建议使用1024-49151之间的高位端口,并确保没有被其他服务占用
- 日志监控:修改后检查
/var/log/secure或/var/log/auth.log,观察新端口是否正常接收连接 - 自动化与合规:使用脚本时添加日志记录功能,保留修改记录以满足审计要求
通过以上Shell脚本,你可以在几分钟内安全地将SSH端口修改为任意指定值,大大提升服务器的初始安全性,配合密钥登录和fail2ban等工具,能够有效防御大多数自动化攻击,安全配置是一个系统工程,端口修改只是第一步。