如何实现仅允许VPN连接用户通过AWS VPN安全SSH访问内网Linux主机
如何实现仅允许VPN连接用户通过AWS VPN安全SSH访问内网Linux主机
这个需求核心就是把SSH访问的权限牢牢锁在AWS VPN的网段范围内,结合你的场景(主机在路由器后、有静态公网/私网IP),我给你一步步拆解实现步骤:
1. 先确认AWS VPN的私网网段
首先你得从AWS控制台或者VPN配置文件里拿到AWS VPN分配给你的客户网关/虚拟私有网关的CIDR网段,比如常见的像10.0.0.0/24——这个是后续所有限制规则的核心,只有来自这个网段的流量才允许访问SSH。
2. 配置路由器的端口转发(DNAT)+ 源IP限制
因为你的Linux主机在路由器后面,公网静态IP是挂在路由器上的,所以需要做端口转发把公网的22端口映射到内网主机的22端口,但绝对不能开放给所有公网IP:
- 登录你的路由器管理界面,找到「端口转发」或「DNAT规则」选项
- 添加一条规则:
- 源IP范围:填写你刚才拿到的AWS VPN CIDR(比如
10.0.0.0/24) - 外部端口:22
- 内部地址:你的Linux主机静态私网IP(比如
192.168.1.100) - 内部端口:22
- 源IP范围:填写你刚才拿到的AWS VPN CIDR(比如
- 保存规则并重启路由器生效
3. 加固Linux主机本地防火墙
即使路由器做了限制,主机本地再加一层防火墙限制会更安全,这里分两种常用防火墙工具说明:
用ufw(Ubuntu/Debian系常用)
# 先允许AWS VPN网段访问SSH sudo ufw allow from 10.0.0.0/24 to any port 22 # 拒绝其他所有SSH请求 sudo ufw deny 22 # 启用ufw(如果之前没开的话) sudo ufw enable
用iptables(通用Linux防火墙)
# 允许VPN网段的SSH流量 sudo iptables -A INPUT -p tcp -s 10.0.0.0/24 --dport 22 -j ACCEPT # 拒绝其他所有SSH流量 sudo iptables -A INPUT -p tcp --dport 22 -j DROP # 保存规则(避免重启失效,不同系统命令略有不同) # Ubuntu/Debian: sudo netfilter-persistent save # CentOS/RHEL: sudo service iptables save
4. 可选:提升SSH本身的安全性
为了进一步降低风险,建议禁用SSH密码登录,只允许密钥登录:
- 编辑SSH配置文件:
sudo nano /etc/ssh/sshd_config - 找到并修改以下配置:
PasswordAuthentication no PubkeyAuthentication yes - 重启SSH服务生效:
sudo systemctl restart sshd
最后验证配置
- 先连接上AWS VPN,然后尝试SSH:
ssh 你的主机用户名@路由器公网静态IP,应该能正常登录 - 断开VPN后再尝试SSH,应该会出现超时或者连接被拒绝的情况,这就说明规则生效了
备注:内容来源于stack exchange,提问作者Roronoa Zoro
相关产品推荐
相关产品推荐

