AWS EC2实例UserData安装Redis后无法SSH连接的问题
问题排查与修复方案
你的脚本存在几个关键问题,直接导致实例无法正常连接,核心问题集中在iptables规则操作、sed命令语法这两部分,具体分析和修复如下:
1. 无效的iptables规则删除命令
脚本里的sudo iptables -D INPUT <rule_number>是占位符,实际执行时bash无法识别<rule_number>,会直接报错中断脚本执行,这会导致后续iptables配置保存操作失败,甚至让系统iptables规则处于异常状态,影响SSH连接。
修复方式:
通过命令动态匹配并删除阻断6379端口的规则,替换原硬编码命令:
# 动态查找并删除所有阻断6379端口的INPUT规则 sudo iptables -S INPUT | grep "dport 6379" | awk '{print $2 " " $1 " " $3 " " $4 " " $5 " " $6}' | while read -r line; do sudo iptables -D INPUT $line done
2. sed命令的引号转义错误
脚本里使用了HTML转义的"包裹sed表达式,bash无法识别该转义字符,会导致sed命令执行失败,Redis的绑定地址、保护模式配置未被修改,直接影响远程连接。
修复方式:
直接用单引号或双引号包裹sed替换表达式:
# 修改Redis绑定地址为允许所有远程连接 sudo sed -i 's/bind 127.0.0.1/bind 0.0.0.0/g' /etc/redis/redis.conf # 关闭Redis保护模式 sudo sed -i 's/protected-mode yes/protected-mode no/g' /etc/redis/redis.conf
3. iptables配置目录可能不存在
执行iptables-save > /etc/iptables/rules.v4前,需确保/etc/iptables目录存在,否则会报错中断脚本。
修复方式:
添加目录创建命令:
# 确保iptables配置目录存在 sudo mkdir -p /etc/iptables
完整修复后的UserData脚本
#cloud-boothook #!/bin/bash # 更新软件包列表 sudo apt update -y # 安装Redis服务 sudo apt install -y redis-server # 修改Redis绑定地址为允许所有远程连接 sudo sed -i 's/bind 127.0.0.1/bind 0.0.0.0/g' /etc/redis/redis.conf # 关闭Redis保护模式 sudo sed -i 's/protected-mode yes/protected-mode no/g' /etc/redis/redis.conf # 重启Redis服务生效配置 sudo systemctl restart redis-server sudo systemctl enable redis-server # 可选:设置Redis开机自启 # 确保iptables配置目录存在 sudo mkdir -p /etc/iptables # 动态查找并删除所有阻断6379端口的INPUT规则 sudo iptables -S INPUT | grep "dport 6379" | awk '{print $2 " " $1 " " $3 " " $4 " " $5 " " $6}' | while read -r line; do sudo iptables -D INPUT $line done # 保存iptables配置 sudo iptables-save > /etc/iptables/rules.v4
额外验证步骤
- 实例启动后,通过SSH连接执行
sudo systemctl status redis-server,确认Redis服务正常运行 - 执行
netstat -tulpn | grep redis,确认Redis监听地址为0.0.0.0:6379 - 在本地执行
redis-cli -h <EC2实例公网IP>,测试远程连接是否正常
内容的提问来源于stack exchange,提问作者Luiz Ardezzoni
相关产品推荐
相关产品推荐

