通过OpenVPN路由流量到VPC子网:可连接OpenVPN实例私有IP但无法访问其他服务器
通过OpenVPN路由流量到VPC子网:可连接OpenVPN实例私有IP但无法访问其他服务器
兄弟,我来帮你捋捋这个问题,你现在能连上OpenVPN实例的私有IP,但没法访问同VPC里的其他私有EC2,对吧?咱们一步步排查解决:
第一步:确保VPN服务器开启IP转发
这是流量能从VPN服务器转发到其他机器的基础,Linux系统下操作如下:
- 临时开启:执行
echo 1 > /proc/sys/net/ipv4/ip_forward,重启后会失效 - 永久生效:编辑
/etc/sysctl.conf,找到net.ipv4.ip_forward=1这一行,去掉前面的注释符号,然后执行sysctl -p让配置立即生效
第二步:配置OpenVPN推送路由和NAT规则
你已经加了 push "route 10.21.0.0 255.255.0.0" 到OpenVPN配置里,这个是对的,它会告诉客户端把VPC网段的流量都发往VPN服务器。接下来需要设置NAT,让这些流量以VPN服务器的私有IP作为源IP发出,这样目标EC2的安全组只需要信任VPN服务器的IP就行:
- 执行iptables命令(把
[你的VPN客户端网段]换成你OpenVPN配置里的客户端地址池,比如常见的10.8.0.0/24):iptables -t nat -A POSTROUTING -s [你的VPN客户端网段] -d 10.21.0.0/16 -j MASQUERADE - 要永久保存iptables规则:Ubuntu系统用
netfilter-persistent save,CentOS用service iptables save
第三步:检查VPC的路由表和安全组设置
这部分是VPC内部连通性的关键:
- 路由表:确认VPN服务器所在子网的路由表中,有到
10.21.0.0/16的路由,目标设为local(同一VPC内默认是互通的,但如果是自定义路由表得确认) - 安全组:
- 目标私有EC2的安全组:要允许来自VPN服务器私有IP(或者整个
10.21.0.0/16网段)的对应流量,比如SSH的22端口、业务端口等 - VPN服务器的安全组:除了允许VPN客户端的连接(比如UDP 1194端口),还要允许出站到
10.21.0.0/16网段的所有必要流量(或对应端口)
- 目标私有EC2的安全组:要允许来自VPN服务器私有IP(或者整个
- NACLs:如果自定义了网络访问控制列表,要确保允许VPN服务器到目标EC2的入站/出站流量,以及反向的响应流量(默认NACL是允许所有的,所以如果没改可以跳过)
第四步:验证客户端路由和连通性
最后来确认客户端和整个链路的情况:
- 连接VPN后,在客户端上查看路由表:Windows用
route print,Linux/macOS用ip route,确认10.21.0.0/16的路由是不是指向VPN的虚拟网卡(比如tun0)的IP - 先在VPN服务器上ping目标EC2的私有IP,如果能通,说明VPC内部没问题,问题大概率在VPN的转发或NAT;如果不通,先解决VPN服务器到目标EC2的连通性(检查安全组、路由表)
- 客户端ping目标EC2时,可以在VPN服务器上用
tcpdump抓包验证:tcpdump -i tun0 icmp看客户端流量有没有到VPN,tcpdump -i eth0 icmp看VPN有没有把流量发往目标EC2,以及有没有响应回来
备注:内容来源于stack exchange,提问作者AlexLordThorsen




