linux通过ssh tunnel,iptables或简单路由路由出站端口80流量


1

我有两台主机,A和B.主机A在端口8080上托管服务,并具有出站互联网防火墙规则,允许端口80和443访问主机C.

主机B与主机A在同一子网上。主机B被阻止到达互联网主机C.但是,主机A在外部防火墙上具有允许端口80和443出站到主机C的出站规则。

主机B运行具有硬编码URL的软件客户端,以从主机A(http端口8080)和主机C(http端口80)下载。同样,主机B被阻止通过防火墙到达主机C. 主机B上的客户端不支持SOCKS或任何其他代理功能。我可能达到主机C:80的唯一方法是通过主机A重定向或隧道。

我有对主机A和主机B的root访问权限。主机B如何通过端口80上的主机A到达主机C?

为什么这不适用于主机B?

ssh -L 80:hostC:80 root @ hostA -N

我在主机A上启用了AllowTCPForwarding和GatewayPorts。这是对的还是有一个我可以使用的iptables技巧?

这张图片是我想要的图表:http//i.imgur.com/rOhQ9Us.png


1
我想一张照片可能有助于解决这个问题。
娜塔莉亚当斯

我添加了一张图片,概述了我想要做的事情。
Brett Bonner 2013年

-vvv参数可能会显示一些有趣的内容 - 您可以发布输出的内容吗?
娜塔莉亚当斯

唯一有趣的是:debug1:本地连接到LOCALHOST:80转发到远程地址hostc:80 \ n debug3:channel_setup_fwd_listener:type 2 wildcard 0 addr NULL \ n debug1:本地转发侦听127.0.0.1端口80. \ n
Brett Bonner

iptables -t nat -A OUTPUT -o HostA -j REDIRECT
BatchyX 2013年

Answers:


0

正如@Nathan Adams所说,一张图片对解决这个问题特别有用。我之前没有遇到你想要做的事情,但在为我自己创建一个图表并阅读SSH的-L命令后,我怀疑问题是你需要以root身份运行它,就像你的端口一样试图绑定是一个特权端口(即<1025)。


我在主机A和主机B上以root身份运行。我添加了一个图表,可以帮助我解决我正在尝试做的事情。
Brett Bonner 2013年

0

防火墙在哪里,B本身或外部?

您的ssh命令无法正常工作,因为它绑定B上的端口80以转发到C到A.从您的描述中,您有一个硬编码地址,这意味着B不会尝试连接到端口80本身。硬编码地址是您的问题的关键。URL是否包含逻辑地址或实际的硬编码IP地址?

如果防火墙在B上,你必须避免将数据包发送到C。我认为情况并非如此,因为你在B上有root。但是,在这种情况下解决方案也应该工作无论什么,即找到一种方法来获得与C的连接而不是A。您可以通过操作DNS或使用防火墙重写规则来执行此操作。

另一个技巧是将A作为B的默认路由。假设C是外部的,并且在尝试将数据包返回到B时将触及防火墙,您需要为B执行A做NAT。真正粗暴的方法是响应ARP请求以诱使流量通过它,但除非在非常小的设置中,否则这不太可行。


防火墙在A和B的外部。硬编码的URL包含一个fqdn,所以是的,是一个逻辑地址。我可以编辑B上的hosts文件。
Brett Bonner

@ LaughNowButWe'llBeInCharge你能让这个工作吗?您必须确保主机文件条目优先于DNS查找。
生于2013年

0

看到这个寻找其他东西,但我想我会回答,即使它已经过时了:

主持人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身份运行任何内容。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.