我有一个 Web 服务,在 AWS ELB 后面有几台 EC2 服务器。据我了解,ELB 端点不可能有静态 IP,因为它是基于 DNS 的负载平衡解决方案,这是 ELB 团队做出的设计决定。
然而,我们整合的第三方合作伙伴之一由于其内部基础设施限制而需要我们服务器的 IP(是的,我知道)。
经过一番研究,我计划在静态 IP 后面准备一个 SSL 直通反向代理,并将请求传递到我们的 ELB 端点。此服务器将仅由该客户端使用。我可能会使用 HAProxy,因为代理服务器需要动态解析 ELB 的 IP。
优点:
- AWS ELB 背后的基础设施没有任何变化。
- 无需额外的 SSL 认证。
缺点:
- 引入单点故障,但只影响该客户端。
- 客户需要自己为我们的域名分配IP,或者我们设置另一个域名指向此服务器。
- 以前没有设立过此类储备代理的经验。
这是我在不改变基础设施的情况下想出的唯一方法,我想听听您的意见,如果您处于这种情况,您会怎么做?
答案1
最后,我采用了 TCP SSL 直通反向代理解决方案,这是我的 HAProxy 配置:
global
log /dev/log local0
log /dev/log local1 notice
chroot /var/lib/haproxy
stats socket /run/haproxy/admin.sock mode 660 level admin
stats timeout 30s
user haproxy
group haproxy
daemon
defaults
timeout connect 10s
timeout client 1m
timeout server 1m
option tcplog
log-format %ci:%cp\ [%t]\ %ft\ %b/%s/%si\ %Tw/%Tc/%Tt\ %B\ %ts\ %ac/%fc/%bc/%sc/%rc\ %sq/%bq
log global
resolvers dns
nameserver google 8.8.8.8
# pass 80 port request to AWS ELB
listen http-proxy
bind *:80
mode tcp
server elb my.elb.amazonaws.com:80 check resolvers dns
# pass 443 port request to AWS ELB
listen https-proxy
bind *:443
mode tcp
server elb my.elb.amazonaws.com:443 check resolvers dns
一些解释:
- 代理监听来自端口 80 和 443 的连接,然后传递到 ELB 端点。
- HAProxy 将使用我指定的 DNS 动态解析 IP
- 使用 TCP 模式,因此无需为代理创建额外的 SSL 认证
我做了一些测试并且效果良好。
然而我确实注意到了一个缺点(或者只是不知道如何解决它)
- 由于处于 TCP 模式,无法将真实客户端 IP 放入 HTTP 标头
如果您想允许某些 IP 访问某些服务,这可能会导致问题。
答案2
如果成本不是问题,Akamai 的客户端访问控制 (CAC) 提供静态 IP 地址解决方案。虽然价格昂贵,但效果应该不错。
如果您想自己构建,您可以构建两个具有弹性 IP 的实例(并将这两个 IP 地址提供给第三方合作伙伴),然后使用 Route53 进行健康检查以避免 SPoF。