好吧,我已经为这个难题绞尽脑汁好几天了。我有一个 VPC 设置,带有一个公共子网和一个私有子网。当然,NAT 已经到位。我可以从 SSH 连接到公共子网中的实例,以及 NAT。我甚至可以从公共实例通过 SSH 连接到私有实例。我更改了私有实例上的 SSHD 配置,以接受端口 22 和任意端口号 1300。这很好用。
但我需要进行设置,以便我可以使用 1300 端口号直接连接到私有实例。
ssh -i keyfile.pem [email protected] -p 1300
而 1.2.3.4 应该将其路由到内部服务器 10.10.10.10。
现在我听说 iptables 可以完成这项工作,所以我继续研究并尝试使用它进行一些路由。这些是我在公共实例(不是 NAT)上设置的规则。我不想为此使用 NAT,因为 AWS 显然会在您设置 NAT 实例时预先配置它们,而且我听说使用 iptables 可能会搞砸它。
*filter
:INPUT ACCEPT [129:12186]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [84:10472]
-A INPUT -i lo -j ACCEPT
-A INPUT -i eth0 -p tcp -m state --state NEW -m tcp --dport 1300 -j ACCEPT
-A INPUT -d 10.10.10.10/32 -p tcp -m limit --limit 5/min -j LOG --log-prefix "SSH Dropped: "
-A FORWARD -d 10.10.10.10/32 -p tcp -m tcp --dport 1300 -j ACCEPT
-A OUTPUT -o lo -j ACCEPT
COMMIT
# Completed on Wed Apr 17 04:19:29 2013
# Generated by iptables-save v1.4.12 on Wed Apr 17 04:19:29 2013
*nat
:PREROUTING ACCEPT [2:104]
:INPUT ACCEPT [2:104]
:OUTPUT ACCEPT [6:681]
:POSTROUTING ACCEPT [7:745]
-A PREROUTING -i eth0 -p tcp -m tcp --dport 1300 -j DNAT --to-destination 10.10.10.10:1300
-A POSTROUTING -p tcp -m tcp --dport 1300 -j MASQUERADE
COMMIT
因此,当我在家尝试此操作时,它只是超时。没有连接被拒绝的消息或任何其他消息。而且我似乎找不到有关丢包的任何日志消息。
我的安全组和 ACL 设置允许在两个子网和 NAT 上在这些端口上进行双向通信。我不知所措。我做错了什么?
答案1
供后人参考,这是一个 5 步过程。堡垒主机是指面向公众的服务器,您需要加强它以抵御潜在攻击,并且您的连接将通过它传输到您的私有子网内的服务器。
步骤 1:启用 IP 转发(堡垒主机)
通过 SSH 连接到堡垒主机并在提示符下执行以下命令:
echo 1 > /proc/sys/net/ipv4/ip_forward
第 2 步:修改 IP 表(堡垒主机)
通过 SSH 连接到堡垒主机并在提示符下执行以下命令:
sudo iptables -t nat -A PREROUTING -p tcp -m tcp --dport {PUBLIC_SSH_PORT} -j DNAT --to-destination {PRIVATE_IP_ADDRESS}:22
sudo iptables -t nat -A POSTROUTING -p tcp -m tcp --dport {PUBLIC_SSH_PORT} -j MASQUERADE
在哪里:
- {公共 SSH 端口}你计划通过堡垒主机上的哪个端口进行连接
- {私有 IP 地址}是您计划连接的私有子网中的服务器地址
有关这些配置含义的详细信息,您可以在命令提示符下运行以下命令来查看手册页:
man iptables
man iptables-extensions
步骤 3:配置安全组(Amazon AWS 控制台)
登录到您的 Amazon AWS 控制台并导航到安全组仪表板。编辑分配给堡垒主机的安全组并添加:
- 自定义 TCP 规则允许入站和出站连接{公共 SSH 端口}无论你从哪个 IP 地址进行连接
- 自定义 TCP 规则允许入站和出站连接所有交通往返于私有服务器的安全组(在自定义 IP 字段中输入安全组 ID) - 您可以将其限制为仅限 SSH 流量,但如果您需要访问其他正在运行的服务和服务器,这是最简单的配置
编辑分配给您的私人服务器的安全组并添加:
- 自定义 TCP 规则允许入站和出站连接所有交通往返于堡垒主机的安全组(在自定义 IP 字段中输入安全组 ID) - 您可以将其限制为仅限 SSH 流量,但如果您需要访问其他正在运行的服务和服务器,这是最简单的配置
步骤 4:禁用源/目标检查(Amazon AWS 控制台)
登录您的 Amazon AWS 控制台并导航到实例仪表板。单击您刚刚配置为转发连接的堡垒主机。从操作菜单中禁用源/目标检查。这是唯一需要禁用源/目标检查的设备。
步骤 5:使配置持久化(跨服务器重启)
修改/etc/sysctl.conf
文件,更新以下行(将 0 改为 1):
# Controls IP packet forwarding
net.ipv4.ip_forward = 1
保存iptables
配置(到/etc/sysconfig/iptables
),以便在启动时重新加载:
sudo service iptables save
最后,确保它iptables
在启动时启动:
sudo chkconfig iptables on
笔记:您无需设置和配置单独的 Amazon NAT 实例即可获得对私有服务器的 SSH 访问权限。如果您计划管理私有子网内各种设备的 Internet 访问,NAT 实例是理想的选择。
答案2
您是否已禁用源/目标检查?
默认情况下,AWS 将检查网络流量的来源和目的地,因此实例必须是其发送或接收的任何流量的最终目的地。要将流量从一个实例路由到另一个实例,您需要禁用此检查:
http://docs.aws.amazon.com/AmazonVPC/latest/UserGuide/VPC_NAT_Instance.html#EIP_Disable_SrcDestCheck
另一个潜在的问题是,没有在内核级别启用路由,具体方法如下:
echo 1 > /proc/sys/net/ipv4/ip_forward