当然,私有子网中的东西之所以在私有子网中,是因为它不应该从互联网访问。
但是...我相信你有你的理由,所以接下来是:
首先,不能通过简单的连接、使用、删除方式实现此操作,因为每个子网都只有一个默认路由,它指向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协议。 这也意味着您应该能够传递大量的流量,尽管使用微型设备。
完成后,丢弃微型实例,您的网络就恢复正常了。