通过 OpenVPN 服务器访问 ELB 后面的实例

通过 OpenVPN 服务器访问 ELB 后面的实例

我想通过 openvpn 服务器将流量重定向到某些特定域(dev.mydomain.com、admin.mydomain.com、jira.mydomain.com 等),这些域托管在某些 ec2 机器上,并且位于某些 ELB 后面(每个 ELB 有 2 个 AZ - 所以它有 2 个公共 IP),并且这些域通过 route53 进行管理。

在我的 VPN 服务器配置中

push "route 54.72.xxx.xyz 255.255.255.255 10.8.0.1 1" # dev.mydomain.com
push "route 54.72.xxx.xyz 255.255.255.255 10.8.0.1 1" # 2nd IP for dev.mydomain.com
....

对于每个域。不幸的是,这些 AWS ELB IP 也在不时变化,我必须手动更新我的服务器配置。

您知道这个问题的解决办法吗?

答案1

解决这个问题主要有两种方法:

  1. 保持公众可访问开发行政吉拉并且仅可选择通过 VPN 路由流量。这似乎就是您现在正在做的事情。您必须不断将主机名重新解析为 IP,因为您知道 IP 偶尔会发生变化。

    • 一种方法是push route不时更新服务器配置行,例如使用cron

      在你的openvpn.conf 在服务器上添加一行使其从单独的文件读取额外的配置:

      dev tun
      server ...
      config /etc/openvpn/elb-routes.inc # <- This file gets updated automatically
      

      然后创建一个计划任务每小时运行一次此脚本:

      #!/bin/bash -e
      
      # Resolve each of the ELB_HOSTNAMES below and update the server config
      
      ELB_HOSTNAMES="dev.mydomain.com admin.mydomain.com jira.mydomain.com"
      for ELB_HOSTNAME in ${ELB_HOSTNAMES}; do
          for ELB_IP in $(host -t A ${ELB_HOSTNAME} | awk '/has address/{print $NF}'); do
          echo "push \"route ${ELB_IP} 255.255.255.255 vpn_gateway 1\""
          done
      done > /etc/openvpn/elb-routes.inc
      
      systemctl reload openvpn.service
      

      它将更新推送路线使用/etc/openvpn/elb-routes.incELB 的最新 IP,这样您始终可以获得正确的路由。

      你甚至可以更进一步,将这个脚本连接到CloudWatch 事件每次 ELB IP 发生变化时都会创建它,以便立即更新:)


    • 另一个选择是客户端上的 ELB 主机名到 IP 解析。 要做到这一点消除来自服务器配置的命令push route,并在客户端连接时动态创建路由。

      为此,创建一个openvpn 启动脚本在客户端上每次连接到 VPN 时都会调用此方法:

      script-security 2
      up /etc/openvpn/up.sh
      

      然后/etc/openvpn/up.sh您可以解析 ELB 的当前 IP 并创建适当的路由:

      #!/bin/bash
      # Resolve each of the ELB_HOSTNAMES below and insert route through the VPN
      
      ELB_HOSTNAMES="dev.mydomain.com admin.mydomain.com jira.mydomain.com"
      for ELB_HOSTNAME in ${ELB_HOSTNAMES}; do
          for ELB_IP in $(host -t A ${ELB_HOSTNAME} | awk '/has address/{print $NF}'); do
              ip route add $ELB_IP via $route_vpn_gateway dev $dev
          done
      done
      

      请注意,您将需要host来自bind9-host(Ubuntu) 或bind-utils(Fedora) 软件包的命令。

      现在,每次启动 OpenVPN 连接时,它都会运行此脚本,解析主机名,并运行如下命令:

      # IPs for dev.mydomain.com ...
      ip route add 52.65.12.34 via $route_vpn_gateway dev $dev
      ip route add 13.211.56.78 via $route_vpn_gateway dev $dev
      

      有关更多信息OpenVPN 启动/关闭脚本检查OpenVPN 手册页,即--up--script-security和的部分Environmental variables


  2. 另一个在我看来更好的选择是限制访问开发行政吉拉仅限 VPN并且根本不允许没有 VPN 的访问。

    这不是你在问题中要求的,但它可能是一个不错的选择增强安全性- 没有 VPN 的人将无法访问这些受限制的主机。

    要做到这一点,只需将 ELB 更改为方案:内部- 这将只为他们提供私有 IP 地址(例如来自 172.31.0.0/16 范围),并且假设您的 VPN 配置为将所有流量从您的客户端路由到 172.31.0.0/16,您将只能访问开发行政吉拉通过 VPN。

    ELB 方案:内部


希望这些方法能对你有用:)

相关内容