如何从反向SSH隧道获取远程IP地址

6

我在本地机器上通过反向SSH隧道运行了一个Apache Web服务器,即:

ssh -R *:80:local_machine:8080 username@gateway_machine

换句话说,所有从gateway_machine的80端口发出的流量都会被发送到local_machine的8080端口。

出于监控目的,我希望知道连接到gateway_machine的远程客户端的IP地址。然而,我的本地Apache服务器看到的所有流量都来自于gateway_machine的IP地址。

我的问题是:有没有办法在gateway_machine上设置运行SSH服务器,以便将所有流量发送到local_machine,并带有实际的远程IP地址?


尝试使用-v(或-vv或-vvv)参数,看看SSH客户端是否在其日志中显示这些连接。 - golimar
好主意,谢谢。我已经说服自己没有办法在不“黑客攻击”的情况下完成这个任务。但是通过比较ssh -vvv调试输出和openssh源代码,我发现这是在clientloop.c中定义的'client_request_forwarded_tcpip()'函数中发生的。似乎ssh默认不会在TCP/IP头中转发“originator_address”(远程客户端IP)。这可以通过修改源代码来改变。如果我成功了,我会在这里发布解决方案。 - user1545642
你能在远程机器上运行其他东西吗?例如HAProxy或另一个Apache HTTPD?在这种情况下,您可能可以使用远程Web代理将端口80转发到8080(远程),并从8080远程隧道到8080本地。如果您像这样使用HTTP代理,可以配置它以包括X-Forwarded-For标头和原始IP地址。 - Alex Nauda
1个回答

2
SSH协议使用名为“direct-tcpip”的通道类型来转发TCP连接。打开这些通道的协议消息包括正在被转发连接的客户端的地址和端口。因此,您想要的信息对于ssh客户端(在您的情况下是打开到目标转发的连接的客户端)是可用的。
OpenSSH ssh客户端在调试级别消息中记录发起者地址和端口,因此如果您使用-v选项运行ssh,则可以看到它:
$ ssh -v -R 2000:localhost:1000 localhost
...
debug1: client_request_forwarded_tcpip: listen localhost port 2000, originator ::1 port 51101

这里的发起者地址是::1(IPv6本地主机),端口号为51101。 ssh 实用程序不会对信息进行其他操作。

因此,根据您的需求,有三种方法可以收集此信息:

  1. 使用 -v 选项调用创建这些转发的 ssh 进程,并安排收集和解析相关的调试信息。
  2. ssh 进行 源代码 更改,使其按照您的要求处理信息。
  3. 编写自己的 ssh 客户端以执行所需功能。大多数现代编程语言都提供 SSH 客户端库。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接