![路由 + iptables?(ELB + NAT 网关)](https://linux22.com/image/707673/%E8%B7%AF%E7%94%B1%20%2B%20iptables%EF%BC%9F%EF%BC%88ELB%20%2B%20NAT%20%E7%BD%91%E5%85%B3%EF%BC%89.png)
我有一组相同的 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 网关,请按照上述建议更改子网上的默认路由。