2014年11月27日星期四

亚马逊aws配置多个公网ip的问题

公司的服务器切换到亚马逊aws服务器, 我们的服务需两个公网ip, 在aws上申请到了两个公网ip, 并且配置成功。
aws服务器使用的是内网ip通过NAT转换成公网ip的方式.
映射关系如下:
$public_ip1 ---> $private_ip1 ----> eth0
$public_ip2 ---> $private_ip2 ----> eth1
但是使用过程发现只有一个公网可以通。
当黙认网关设置在eth0上时,$public_ip1可以通, $public_ip2不通;当黙认网关设置在eth1上时$public_ip2可以通,$public_ip1不通。
于是我做了如下操作:
把黙认网关设置在eth0上, 在公网ip为123.123.123.123的机器上ping $public_ip2,然后在服务器上使用ip route show cache查看路由表缓存,发现服务器到123.123.123.123的路由走的是eth0, 也就是说$public_ip2接收到的数据包,返回的时候走的是eth0,源ip会被NAT成$public_ip1, 所以会$public_ip2不通。
问题的原因已经明白了,现在要做的就是怎样让从eth1进入的数据包从eth1返回,eth0接收到的数据包从eth0返回。
这里我使用Linux的iproute2功能,让eth0eth1查找不同的路由表
先执行如下命令,添加两条路由表别名
echo 200 t_eth0 >> /etc/iproute2/rt_tables
echo 201 t_eth1 >> /etc/iproute2/rt_tables
然后在路由表中添加路由规则
ip route add default via $gw_eth0 dev eth0 table t_eth0
ip route add default via $gw_eth1 dev eth1 table t_eth1
再添加路由查找规则
ip rule add from $private_ip1 table t_eth0
ip rule add from $private_ip2 table t_eth1
以上规则的意思是,当源ip为$private_ip1时,查路由表t_eth0,在表t_eth0中,黙认走eth0; 当源ip为$private_ip2时,查路由表t_eth1,表t_eth1中,黙认走eth1
这样设置之后,不管黙认网关设置在哪个网卡上,两个公网ip都可以通了。