AWS 放错在Private子网的机器如何用公网IP连进去

今天面试了一下,面试官问到AWS的子网问题,来说说AWS的最佳实践:

首先是VPC的划定,然后就是三个public子网,三个private子网,都是一个zone分布在a、b、c三个不同机房

来保证最大冗余性,然后pub子网通过IGW来出公网,那Private子网就通过NAT出公网。

但是,但是,但是:

如果你把一台EC2服务器一开始就放错了子网,放到了private子网里,然后上面又跑了重要的服务,无法迁移,无法重启,而且整个vpc里只有这一台ec2,其它东西都是aws的服务或者市场的服务又或者fargate、lambda之类的无服务器,这时候你想进去调试,那就麻烦大了

那能不能给这台private的机器加上公网ip来当作跳板机直接访问呢?

答案是肯定的,可以。

但是又来了,如果这么配置了,你要对路由非常的熟悉,因为随后发生错乱的情况可能需要你手动添加路由,最麻烦的不是配置网卡,而是配置路由!

做法如下:

一、动态添加弹性ip到这个ec2的第二个网卡

二、配置网络

 1# vi /etc/netplan/50-cloud-init.yaml
 2
 3# This file is generated from information provided by the datasource.  Changes
 4# to it will not persist across an instance reboot.  To disable cloud-init's
 5# network configuration capabilities, write a file
 6# /etc/cloud/cloud.cfg.d/99-disable-network-config.cfg with the following:
 7# network: {config: disabled}
 8network:
 9    ethernets:
10        enX0:
11            addresses:
12              - 10.0.132.169/20 #The private IP address of primary ENI
13            nameservers:
14              addresses:
15                - 10.0.0.2
16            routes:
17             - to: 0.0.0.0/0
18               via: 10.0.128.1 # Default gateway, you can find it using** ip r** command
19               table: 1001 
20             - to: 10.0.132.169
21               via: 0.0.0.0
22               scope: link
23               table: 1001
24            routing-policy:
25             - from: 10.0.132.169
26               table: 1001
27            dhcp4: no
28            dhcp6: false
29            match:
30                macaddress: 06:36:82:ef:39:39
31            set-name: enX0
32        enX1:
33            addresses:
34              - 10.0.3.176/20 #The private IP address of primary ENI
35            gateway4: 10.0.0.1
36            nameservers:
37              addresses:
38                - 8.8.8.8
39                - 1.1.1.1
40            routes:
41             - to: 0.0.0.0/0
42               via: 10.0.0.1 # Default gateway, you can find it using** ip r** command
43               table: 1002 
44             - to: 10.0.3.176
45               via: 0.0.0.0
46               scope: link
47               table: 1002
48            routing-policy:
49             - from: 10.0.3.176
50               table: 1002
51             - from: 120.116.111.99
52               table: 1002             
53            dhcp4: no
54            dhcp6: false
55            match:
56                macaddress: 06:29:c3:b2:c5:f9
57            set-name: enX1
58    version: 2
59    
60    
61netplan apply

详细解释一下,enX0是private子网的网卡,enX1是弹性IP的网卡,注意,即使是弹性IP,也是个内网地址,这两个IP呢,都有各自独立的网关,第二个网卡还有自己的DNS。这就容易发生错乱了,因为缺省路由走第一个网卡,那如果从第二个网卡的公网IP入,出的时候走第一张网卡,那就有意思了。

所以哪来回哪,每个网卡的第二个路由,都是自己走自,策略路由的第一跳,也是自己走自己。

然后第二个网卡的第二条策略路由,是指定的,本质意思其实是从120.116.111.99访问弹性公网IP的wireguard数据包,回程的时候强制指定走第二个网卡。

痛苦吧!

而且这台EC2作为跳板机,需要代理访问AWS中各种服务,这样就麻烦了,那数据包究竟要从哪个网卡出去,你必须非常清楚,如果走错了,你就必须手动增加路由表

从第一张网卡是aws的dns服务器,是可以访问到各种aws的内网endpoint的解析地址的,第二张网卡由于是公网dns服务器,所以不行;另外第一张网卡是缺省路由;务必谨记这两点。

1ip route show table all
2ip rule show
3
4ip rule show table 1001
5ip rule show table 1002
6
7# 手动新增路由
8ip rule add from 120.116.111.99 table 1002
9ip rule add to   120.116.111.99 table 1002

存在即合理,AWS本质也是魔改了LInux的各种软件和服务。


安装轻量级的Docker Registry:zot
comments powered by Disqus