You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

通过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网段的所有必要流量(或对应端口)
  • 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

火山引擎 最新活动