我遇到过这样一种情况,我们需要将在 MuleSoft 的 CloudHub 中运行的 Mule ESB 流连接到 Amazon AWS Redshift 集群。这不是开箱即用的。我在下面概述了创建代理服务器的步骤。 这个 Gist 中 也提供了我所做的原始文章。
概述
以下是使用 Amazon AWS EC2 实例在 MuleSoft CloudHub 和 Amazon AWS Redshift 之间创建和配置代理所需的步骤。
问题
EC2 和 Redshift 实例配置为支持巨型帧(以太网接口的 MTU 为 9001)。但是,端点之间的某些路由器具有标准以太网 MTU 大小 (1500),这导致无法与公布的 TCP MSS 大小 (8961) 进行通信。出现此问题的原因是 PATH MTU 发现过程依赖于 ICMP,特别是 Type 3 Code 4 / Fragmentation Needed),目前在 Redshift 上所有 ICMP 流量都被拒绝(无论安全组配置如何)。
MuleSoft CloudHub 使用标准以太网 MTU (1500),默认情况下无法连接到 RedShift 集群。以下步骤记录了如何使用 EC2 实例创建轻量级 IP 代理。
配置详情
-
使用以下条件在与 RedShift 集群相同的可用区 (AZ) 中创建一个 AWS 实例:
-
AMI:
Ubuntu Server 14.04 LTS (HVM), SSD Volume Type - ami-d05e75b8
(或类似的) -
实例类型:
t2.micro
- 初始性能测试表明这是足够的,因为代理不是 CPU/RAM 密集型。
- 实例详细信息:接受默认值或根据 VPC 配置进行修改
-
标记实例:
cloudhub-redshift-proxy
-
配置安全组:
- 限制 SSH 访问受信任的 IP 范围
-
为将访问 Redshift 集群的每个静态 CloudHub IP 添加自定义 TCP 规则
-
协议:
TCP
-
端口范围:
5439
(默认 RedShift 端口) -
自定义 IP(使用 CIDR 表示法):
xxxx/32
(例如 54.127.64.101/32)
-
协议:
-
AMI:
- 启动实例,并选择一个现有的 SSH 密钥对,以允许您通过 SSH 连接到该实例。
-
禁用源/目标检查
- 从 EC2 实例列表中选择实例
- 选择操作 > 网络 > 更改源/目标。查看
- 单击是,禁用按钮
-
启动实例后,使用公共 DNS/IP 连接到实例:
ssh ubuntu@server.eu-west-1.compute.amazonaws.comssh ubuntu@54.152.137.105
-
启用 IP 数据包转发
-
在 vi 或 vim 中打开
/etc/sysctl.conf
# sudo vi /etc/sysctl.conf
-
取消注释以下行:
net.ipv4.ip_forward = 1
- 保存文件
-
使用以下命令应用更改:
# sudo sysctl -p
-
在 vi 或 vim 中打开
-
应用 iptables 规则进行 TCP MSS 调整(假设使用默认的 RedShift 端口 5439) a.输入以下两个命令
sudo iptables -A PREROUTING -t mangle -p tcp --sport 5439 --tcp-flags SYN,RST SYN -j TCPMSS --set-mss 1460sudo iptables -A PREROUTING -t mangle -p tcp --dport 5439 --tcp-flags SYN,RST SYN -j TCPMSS --set-mss 1460
-
将 NAT 从“代理”转换为 RedShift 集群 IP(
RS_IP
是集群 IP 地址,LOCAL_IP
是“代理”主机的eth0
接口的 IP 地址)-
您将需要 EC2 代理实例的私有 IP。您可以通过查看 AWS 实例详细信息或在 SSH 会话的命令行中键入
ifconfig
并查看eth0
设备来找到它。 - 您还需要 RedShift 集群的 IP。
-
输入以下命令,将
RS_IP
替换为集群 IP,并将LOCAL_IP
替换为eth0
的 EC2 私有/本地 IP:sudo iptables -t nat -A PREROUTING -p tcp -d LOCAL_IP --dport 5439 -j DNAT --to-destination RS_IP
示例:sudo iptables -t nat -A PREROUTING -p tcp -d 171.25.2.35 --dport 5439 -j DNAT --to-destination 54.102.36.165
-
输入以下命令:
sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
-
您将需要 EC2 代理实例的私有 IP。您可以通过查看 AWS 实例详细信息或在 SSH 会话的命令行中键入
- 注销 SSH 会话。代理已配置。