【问题标题】:how to get remote IP addresses from reverse ssh tunnel如何从反向 ssh 隧道获取远程 IP 地址
【发布时间】:2012-08-13 23:31:24
【问题描述】:

我有一个通过反向 ssh 隧道在本地机器上运行的 Apache 网络服务器,即:

ssh -R *:80:local_machine:8080 用户名@gateway_machine

换句话说,所有来自 gateway_machine 上 80 端口的流量 被发送到 local_machine 上的 8080 端口。

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

我的问题:有什么方法可以设置在 gateway_machine 上运行的 ssh 服务器,这样 它将所有流量发送到具有实际远程 IP 地址的 local_machine ?

【问题讨论】:

  • 尝试使用 -v(或 -vv 或 -vvv)并查看 ssh 客户端是否在其日志中显示这些连接
  • 好主意,谢谢。我已经说服自己,没有“黑客”就没有办法做到这一点。虽然通过将 ssh -vvv 调试输出与 openssh 源进行比较,我发现这发生在 clientloop.c 中定义的“client_request_forwarded_tcpip()”函数中。似乎默认情况下 ssh 不会在 TCP/IP 标头中转发“originator_address”(远程客户端 IP)。这可以通过破解源来改变。如果我得到它的工作,我会在这里发布解决方案
  • 你能在远程机器上运行别的东西吗?例如 HAProxy 或其他 Apache HTTPD?在这种情况下,您可能可以使用远程 Web 代理从端口 80 转发到 8080(远程)并从远程 8080 隧道到本地 8080。如果您使用 HTTP 代理执行此类操作,则可以将其配置为包含带有原始 IP 地址的 X-Forwarded-For 标头。

标签: ssh ssh-tunnel


【解决方案1】:

SSH 协议使用一种称为“direct-tcpip”的通道类型来转发 TCP 连接。 The protocol message for opening one of these channels 包括正在转发连接的客户端的地址和端口。因此,您想要的信息可供 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. source code 更改为ssh 以使其按照您希望的方式处理信息。
  3. 编写您自己的 ssh 客户端来满足您的需求。 SSH 客户端库适用于大多数现代编程语言。

【讨论】:

    猜你喜欢
    • 2012-06-06
    • 2020-10-16
    • 1970-01-01
    • 2010-09-27
    • 1970-01-01
    • 2017-06-02
    • 1970-01-01
    • 2021-05-11
    • 2015-12-02
    相关资源
    最近更新 更多