如何正确配置EC2实例仅允许本人公网IP访问SSH
核心结论
你列的三个IP里,只有控制台「我的IP」自动填充的公网地址是SSH访问时AWS能识别到的你的真实源地址,剩下两个都是内网地址,配到公网访问规则里完全无效。
三个IP的具体属性
192.168.1.233:本地WiFi分配的局域网私网IP,仅在你当前连接的本地内网生效。流量经过家里路由器做NAT转换后,这个地址不会出现在发往AWS的公网报文里,加到允许列表没有任何作用。157.100.197.222/32:你当前上网出口的公网IP,是EC2收到你的SSH请求时,报文头里携带的真实源地址,这是你唯一需要添加到允许规则的个人地址。172.31.30.243:EC2实例自身在VPC内的私网IP,是实例的地址,不是你的访问源地址,加到入站允许规则属于匹配对象完全错误。
之前配置异常的原因
- 无效规则占比太高:你把两个完全不会作为访问源的内网IP加到允许列表,实际生效的只有公网IP这一条规则。如果填充这个公网IP时你开了代理/VPN,或者运营商临时给你分配的IP已经变动,就会直接匹配到拒绝规则,导致连接失败。
- 忽略网络ACL的无状态特性:安全组是有状态防火墙,主动发起的连接对应的回包会自动放行;但网络ACL是无状态的,只加入站允许规则、不配置对应出站放行规则的话,SSH的回包会被直接拦截。
- 规则优先级逻辑错误:网络ACL按规则号从小到大匹配,命中即执行。如果你之前配置的全量拒绝规则序号比新加的三条允许规则序号小,会直接命中拒绝规则,根本不会走到后面的允许逻辑。
- 你之前配置「拒绝/8、/16、/24网段SSH、允许其余所有来源」时能正常连接,本质是你写的这些网段都是私网CIDR段,公网过来的SSH流量源IP本来就不属于这些私网段,自然会命中后续的允许规则,不代表你的规则配置逻辑正确。
正确配置方法
优先使用安全组做SSH访问控制(推荐,配置简单不易出错)
安全组是实例级的有状态防火墙,做SSH源限制不需要配置双向规则:
- 删除原有安全组中放行
0.0.0.0/0访问22端口的规则 - 新增入站规则:允许TCP协议22端口,源地址填写
157.100.197.222/32,其余所有来源访问22端口默认被拒绝 - 不需要额外调整出站规则,有状态特性会自动放行当前SSH连接的回包
如有合规要求必须同时配置网络ACL
网络ACL是子网级的无状态防火墙,必须同时配置入站、出站双向规则:
- 入站规则(按规则号从小到大排列,小序号规则优先匹配):
- 规则号100:允许TCP协议22端口,源地址为
157.100.197.222/32 - 规则号200:拒绝TCP协议22端口,源地址为
0.0.0.0/0 - 其余业务需要的入站规则按序号往后排列即可
- 规则号100:允许TCP协议22端口,源地址为
- 出站规则(必须配置,否则SSH回包无法返回你的本地设备):
- 规则号100:允许TCP协议,目的端口范围为
1024-65535,目的地址为157.100.197.222/32 - 其余业务需要的出站规则按序号往后排列即可
- 规则号100:允许TCP协议,目的端口范围为
注意:如果你使用的是家庭宽带动态公网IP,每次重启路由器后出口公网IP可能发生变动,届时需要更新规则中配置的IP地址,否则会无法连接实例。不要将192.168.0.0/16、172.16.0.0/12、10.0.0.0/8这类私网地址段添加到公网访问的允许规则中,这类地址不会在公网路由,添加后没有任何实际作用。
内容的提问来源于stack exchange,提问作者eitan
相关产品推荐
相关产品推荐

