当我在可用区us-east-1a中启动Amazon EC2 CentOS 7服务器时,会自动为服务器分配eth0上的主私有IP地址,例如172.31.8.244/20和172.31的网关。 .0.1。如果我然后在eth1上附加第二个接口,我可以指定地址,该地址需要在172.31.0.0/20子网内(或者一个子网将在该子网内自动分配给我)。 Eth1将与eth0具有相同的网关。让我们说我被分配了172.31.12.121/20。我在eth0和eth1上使用相同的安全组,它只允许SSH和一切。
问题是,当我尝试从不同的服务器SSH到eth0时,它工作正常。但是当我尝试SSH到eth1时,我得到了超时。 ip addr
和ip route
表明两个接口都已启动且路由正确。我甚至可以本地SSH到eth1,/ var / log / secure日志显示正确的条目,就像我连接到eth1的eth0一样。我需要做什么才能从不同的服务器连接到任一接口?
答案 0 :(得分:5)
问题是不对称路由。对eth1的请求出现在eth1中,并且出去了eth0。在eth0上发出的回复具有与请求中不同的IP地址,因此它在客户端被删除。解决方案是设置允许响应通过eth1路由的规则。
首先,确保您已经创建了服务器的AMI,因为如果您在以下步骤中输入错误的内容,您可能会丢失与服务器的所有连接,并且无法执行任何操作,只能从Amazon控制台网页重新启动它。
首先在单独的表中为每个接口设置默认路由:
ip route add default via 172.31.0.1 dev eth0 tab 1
ip route add default via 172.31.0.1 dev eth1 tab 2
要检查这些是否已正确添加,请使用:
ip route show table 1
ip route show table 2
现在,您需要添加规则,根据源IP地址使用不同的表:
ip rule add from 172.31.8.244/32 tab 1
ip rule add from 172.31.12.121/32 tab 2
您可以使用以下方法检查所有规则:
ip rule
您现在应该可以从客户端计算机连接到任一IP地址。您还可以使用SSH的bind
选项从此服务器上的任一接口连接到客户端计算机:
ssh centos@client_ip_address -i mykey.pem (uses the default, eth0)
ssh -b 172.31.12.121 centos@client_ip_address -i mykey.pem (uses eth1)
ssh -b 172.31.8.244 centos@client_ip_address -i mykey.pem (uses eth0)
您可以使用两个接口连接到同一可用区中的其他EC2服务器,并且对于分配了公共IP的任何接口,您可以连接到外部世界或同一VPC中的其他EC2服务器,甚至如果他们在不同的可用区域。
但是,如果要连接到同一VPC但不同可用区域的其他EC2服务器,该怎么办?换句话说,服务器位于同一数据中心。问题是私有IP地址被屏蔽为20位,这限制了您到一个可用区。因此,对于数据中心us-east-1,您有:
us-east-1a: 172.31.0.0/20
us-east-1b: 172.31.16.0/20
us-east-1d: 172.31.48.0/20
us-east-1e: 172.31.32.0/20
要跨一个VPC和一个数据中心的可用区域进行连接,您需要一个16位掩码。 ip addr
会显示:
inet 172.31.12.121/20 brd 172.31.31.255 scope dynamic eth1
如果losf -n | egrep 172.31.12.121
显示该地址未被使用,您可以添加新掩码并删除旧掩码。请注意,广播地址必须在掩码更改的同时更改:
ip addr add 172.31.12.121/16 dev eth1 brd 172.31.255.255
ip addr del 172.31.12.121/20 dev eth1
现在,您应该能够从可用区A中的EC2服务器连接到可用区B中的另一台主机,只要它们位于同一个VPC中,即使它们没有公共IP地址。
<强>疑难解答:强>
如果您遇到问题,请尝试重置这两个界面,这将删除您所做的任何手动操作。首先将/etc/sysconfig/network-scripts/ifcfg-eth0
复制到/etc/sysconfig/network-scripts/ifcfg-eth1
,然后修改第二个文件,将DEVICE
从eth0
更改为eth1
。然后在/etc/sysconfig/network
添加一行代表GATEWAYDEV=eth0
。最后,运行/etc/init.d/network restart
(不,它不应该断开你)。然后从上面的命令开始。