路由 + iptables?(ELB + NAT 网关)

路由 + iptables?(ELB + NAT 网关)

我有一组相同的 amazon linux ec-2 前端 Web 服务器,它们通过 Elastic Load Balancer (ELB) 提供其 Web 内容。

它们每个都有一个公共 IP,因此当它们连接到 www 中的外部服务时,它们的 IP 会被记录为几个不同的 IP。

我希望这些服务器继续通过 ELB 提供其 Web 内容,但使用其单一弹性 IP 通过 NAT 网关连接到外界。

这是我所做的:

1)在与 ec2 机器相同的子网(是它的 ip)中创建 NAT 网关10.0.1.100+ 为其分配一个弹性 ip。2)

route add -host ifconfig.co gw 10.0.1.100 dev eth0
route add -host otherservice gw 10.0.1.100 dev eth0
...

现在curl ifconfig.co返回 NAT 网关的外部弹性 IP,这很棒:),但是我需要所有流量都通过 NAT 网关,除了通过 ELB 的流量。

更新:以下是我为完成任务所做的事情:1)删除了到 ifconfig.co 和其他服务的自定义路由;

2)创建第二个子网10.0.200.0/24;

3)将 NAT 网关作为默认网关添加到其路由表中;

4)将以下行添加到 /etc/rc.d/rc.local 以便在启动时运行它们:

for f in /proc/sys/net/ipv4/conf/*/rp_filter; do echo 0 > $f; done
echo 1 > /proc/sys/net/ipv4/route/flush
if [ -z "`cat /etc/iproute2/rt_tables | grep '^200'`" ] ; then echo "200 nat" >> /etc/iproute2/rt_tables; fi
ip route add default via 10.0.200.1 dev eth1 table nat
ip rule add fwmark 0x1 table nat
ip2addr=$(ip addr | grep 'state UP' -A2 | tail -n1 | awk '{print $2}' | cut -f1  -d'/')
iptables -A OUTPUT -t mangle -o eth0 -p tcp --dport 80 -j MARK --set-mark 1
iptables -A POSTROUTING -t nat -o eth1 -p tcp --dport 80 -j SNAT --to $ip2addr
iptables -A OUTPUT -t mangle -o eth0 -p tcp --dport 443 -j MARK --set-mark 1
iptables -A POSTROUTING -t nat -o eth1 -p tcp --dport 443 -j SNAT --to $ip2addr

答案1

ELB 与您的 Web 服务器位于同一网络上。从 Web 服务器的角度来看,所有 Web 请求似乎都来自负载均衡器。由于负载均衡器位于同一网络上,因此无需复杂的路由。

只需在每个 Web 服务器上向 NAT 网关添加一个默认路由即可。或者,如果您希望子网上的所有服务器都使用 NAT 网关,请按照上述建议更改子网上的默认路由。

相关内容