AWS - 使用EIP访问私有子网中的实例

14
我想使用EIP访问私有子网中的几个实例。有什么方法吗?虽然听起来没有什么意义,但让我详细说明一下。
我有一个包含2个子网的VPC。 1. 192.168.0.0/24(公共子网)已连接EIP。 2. 192.168.1.0/24(私有子网)。
为了使私有实例能够对Internet进行出站访问,这两者之间有一个NAT实例。正如所述,一切都很好,如此处所述。
但是现在,暂时需要直接通过EIP从Internet访问私有子网中的实例。是否可以通过为特定实例设置新的路由表来实现此目的?还是其他方法? 以下是限制: 1. 私有子网上的任何实例都不能有任何停机时间。 2. 因此不用说,我不能创建新的子网并将这些实例移动到那里。
它应该很简单——附加、使用和删除。 目前我唯一拥有的另一种方式是在iptables上进行某种端口转发,从公共子网上的实例(具有EIP)到私有子网上的任何实例。但是这看起来很混乱。 有其他方法吗?
4个回答

23

当然,私有子网中的东西之所以在私有子网中,是因为它不应该从互联网访问。

但是...我相信你有你的理由,所以接下来是:

首先,不能通过简单的连接、使用、删除方式实现此操作,因为每个子网都只有一个默认路由,它指向igw对象(公共子网)或NAT实例(私有子网)。如果您将弹性IP绑定到私有子网中的某台机器上,则入站流量将到达该实例,但出站回复流量将被路由回NAT实例,后者会舍弃或篡改它,因为您无法对称地通过NAT进行路由,这就是此处发生的情况。

如果您的服务是TCP服务(如http、远程桌面等),则以下是一种短期的hackery方法,可以非常好地工作并避免iptables的麻烦,并仅暴露您需要的特定服务:

在公共子网中启动一个新的micro实例,其中包含ubuntu 12.04 LTS、EIP和适当的安全组,以允许入站Internet流量到达所需端口。允许自己访问该新实例的ssh。允许该机器访问内部机器。然后:

$ sudo apt-get update
$ sudo apt-get upgrade 
$ sudo apt-get install redir

假设您希望将传入的端口80流量发送到私有实例上的端口80:

$ sudo redir --lport=80 --cport=80 --caddr=[private instance ip] --syslog &

完成。 您将在系统日志中拥有每个连接和断开连接的端口号和传输字节数的日志记录。 缺点是,如果您的私有主机正在查看连接机器的IP,则始终会看到私有网络实例的内部IP。

只需在绑定到端口1024以下的端口时使用sudo运行它,因为只有root可以绑定到较低的端口号。 要停止它,请找到pid并杀死它,或者使用sudo killall redir命令。

这个漂亮小巧的redir实用程序在用户空间中执行其操作,使其比iptables更简单(我认为)。 它在指定的--lport端口上设置一个侦听套接字。 对于每个入站连接,它都会分叉自身,建立到--caddr--cport的出站连接,并将两个数据流连接在一起。 它不知道流内部发生了什么,因此应该适用于几乎所有TCP协议。 这也意味着您应该能够传递大量的流量,尽管使用微型设备。

完成后,丢弃微型实例,您的网络就恢复正常了。


4
根据您的需求,您可能需要直接将静态路由放到互联网网关。例如,如果您知道要允许流量的互联网源,则可以将路由 x.x.x.x/32 -> igw 放入您的私有路由表中。因为您的实例已连接 EIP,所以它将能够到达 igw,并且指向该目的地的流量将按照应有的路径流出而非 NAT。
我已经使用过这个技巧几次来进行短期访问。显然,这是一种短期解决方法,不适用于生产环境,并且仅在您知道互联网流量来自何处时才有效。

2

0

1-使用临时EC2实例中的redir工具来连接到NAT私有子网。对于此选项,请考虑它是最不具侵入性的。可以通过创建系统服务使其持久化,以便在重新启动时再次创建套接字。 2-静态路由表 这需要对AWS VPC有中高级知识,并根据情况可能需要处理AWS Route 53。 3-VPN: 这可能意味着需要处理Amazon IGW以及一些额外的步骤。

对我而言,最好的解决方案是1加上不同的端口映射,在AWS 53中创建DNS记录,安全组限制。要求相反:为了让某些用户每天都能访问并在某个时刻能够停止EC2实例,需要保持连接。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接