我正在尝试设置端口转发,以便特定的IP (例如1.2.3.4/32)可以通过一个堡垒(例如,5.5.5.5:2222)向应用服务器(10.3.3.3:22)发送SSH。堡垒和应用服务器运行在亚马逊的VPC中,只有堡垒暴露在互联网上。
我在堡垒上使用了以下规则(在开始工作之前,我忽略了源IP ):
iptables -t nat -A PREROUTING -p tcp -i eth0 --dport 2222 -j DNAT --to 10.3.3.3:22
但是当我试图连接时,我没有得到任何回应。
在堡垒上运行tcpdump显示流量已经通过,所以我想我是在访问应用服务器的VPC安全组,而不是它的端口22。我认为这是因为虽然堡垒拥有访问应用服务器上的端口22的权限,但IP 1.2.3.4没有。
所以,我的问题是:我设置数据包的方式是自动更改数据包的源IP,使它们看起来来自堡垒,还是包含原始源IP,在本例中是1.2.3.4?
如果包在转发后确实包含1.2.3.4作为源IP,我如何将源地址更改为堡垒的源地址?
我想特别对于SSH,我可以设置SSH隧道,但我也需要一个类似的解决方案来允许在几个不同的应用服务器上访问端口443。
我现在也尝试用以下方法添加SNAT:
iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source 10.2.2.2
但是它仍然不起作用(10.2.2.2是堡垒的内部IP )。
发布于 2013-08-14 11:33:35
所以,我的问题是:我设置数据包的方式是自动更改数据包的源IP,使它们看起来来自堡垒,还是包含原始源IP,在本例中是1.2.3.4?
不,DNAT不改变源ip,只改变目的地。DNAT -目的地网络地址翻译
我如何知道在堡垒上是否启用了IP转发?
以下命令应返回1
# cat /proc/sys/net/ipv4/ip_forward
我如何让iptable执行SNAT (如果这实际上是我想要的--我希望VPC中的所有流量看起来都来自于堡垒,然后将其适当地重定向回来)?
# iptables -t nat -I POSTROUTING -p tcp -s 1.2.3.4 -d 5.5.5.5 --dport 2222 -j DNAT --to-destination 10.3.3.3:22
发布于 2013-08-14 11:38:16
您已经配置了DNAT
或“目的NAT",这意味着您的网关正在重写匹配该规则的连接的目标地址。源地址保持不变,因为您应该能够知道您是在堡垒主机的出站接口上还是在应用服务器上运行tcpdump
。
这意味着应用服务器试图将数据包返回到您的原始主机的地址,在您的示例中是1.2.3.4
。这是否有效取决于您的主机是如何连接的。
一个简单的解决方案是用一个简单的tcp代理(例如,哈代、钢笔、平衡等)替换您的iptables规则。让代理监听您的堡垒主机上的端口2222,并将连接转发到应用服务器上的端口22,这样它就可以工作了,因为从应用服务器连接的角度来看,连接来自于堡垒主机。
发布于 2013-08-14 13:47:46
这只是一个快速修复/短期解决方案。
那SSH隧道怎么样?
ssh -L 2222:10.3.3.3:22 username@5.5.5.5 -N &
#then
ssh username@localhost -p 2222
SSH与SSH :D
这只是个想法。
Update:没有看到这一点:-/:“我想,对于SSH,我可以专门设置SSH隧道,但我也需要一个类似的解决方案,以允许在几个不同的应用服务器上访问端口443。”
https://serverfault.com/questions/530886
复制相似问题