我有两台主机 A 和 B。主机 A 在端口 8080 上托管服务,并具有出站互联网防火墙规则,允许端口 80 和 443 访问主机 C。
主机 B 与主机 A 位于同一子网。主机 B 被阻止访问 Internet 主机 C。然而,主机 A 在外部防火墙上具有出站规则,允许端口 80 和 443 出站到主机 C。
主机 B 运行一个软件客户端,该客户端使用硬编码 URL 从主机 A(http 端口 8080)和主机 C(http 端口 80)下载。同样,主机 B 无法通过防火墙访问主机 C。主机 B 上的客户端不支持 SOCKS 或任何其他代理功能。我唯一可能访问主机 C:80 的方式是通过主机 A 重定向或建立隧道。
我对主机 A 和主机 B 具有 root 访问权限。主机 B 如何通过主机 A 的端口 80 访问主机 C?
为什么这在主机 B 上不起作用?
ssh -L 80:主机C:80 root@主机A -N
我已经在主机 A 上启用了 AllowTCPForwarding 和 GatewayPorts。这样做正确吗,或者我可以使用 iptables 技巧吗?
这张图片是我想要用我拥有的东西做的图表:https://i.stack.imgur.com/MGsJp.png
答案1
正如@Nathan Adams 所说,图片对于解决这个问题特别有用。我以前没有遇到过您要做什么,但在为自己创建了一个图表并阅读了 SSH 的 -L 命令后,我怀疑问题在于您需要以 root 身份运行它,因为您尝试绑定的端口是特权端口(即 < 1025)。
答案2
防火墙在哪里,在 B 本身上还是外部?
您的 ssh 命令不起作用,因为它将 B 上的端口 80 绑定到通过 A 转发到 C。根据您的描述,您有一个硬编码地址,这意味着 B 不会尝试连接到自身的端口 80。硬编码地址是您问题的关键。URL 包含逻辑地址还是实际的硬编码 IP 地址?
如果防火墙在 B 上,则必须避免数据包发往 C。我认为情况并非如此,因为您在 B 上有 root 权限。但是,在这种情况下,无论如何都应该有一个解决方案,即找到一种方法让与 C 的连接转而转到 A。您可以通过操纵 DNS 或使用防火墙重写规则来做到这一点。
另一个技巧是将 A 设置为 B 的默认路由。假设 C 是外部的,并且在尝试将数据包返回到 B 时会遇到防火墙,则您需要让 A 为 B 执行 NAT。一种非常粗鲁的方法是让 A 响应 ARP 请求以诱骗流量通过它,但除非在非常小的设置中,否则这种方法不太可能可行。
答案3
看到这个是在寻找别的东西,但我想回答,即使它很旧:
在主机B:
ssh -L 8080:hostC:80 user@hostA -N -f
sudo iptables -t nat -A OUTPUT -d hostC -p tcp --dport 80 -j DNAT --to 127.0.0.1:8080
该软件主机B已硬编码为连接到 HostC:80(根据问题),因此您必须重定向连接以通过您创建的 SSH 隧道。此外,通过上述更改,您不需要以 root 身份运行任何操作。