如何确定在服务器上为动态绑定的openssh反向隧道分配的端口?


16

在最新版本的OpenSSH上创建反向隧道时,可以将远程端口0绑定为任何可用端口:

-R [bind_address:] port:host:hostport

...

如果port参数为0,则监听端口将在服务器上动态分配,并在运行时报告给客户端。

openssh ssh客户端手册

我的问题是如何(自动)确定服务器上的此端口分配。将其报告给运行ssh客户端的主机似乎没有帮助,但没有报告给目标,后者将要建立与此端口的连接以访问客户端上的服务。

我可以想到的两个类似选项正在运行

# netstat -ntlp

在服务器上,并通过sshd或查看以下命令的输出来查找绑定在127.0.0.1上的可疑端口

# lsof -p $PPID | grep TCP | grep LISTEN

但是从自动化的角度来看,这些都不是令人满意的,并且如果创建了多个这样的隧道,则无法将动态端口绑定回原始服务端口。

要有效地在sshd服务器端获取活动隧道(本地和远程端口号)的列表(例如等效于SSH_CONNECTION环境变量),但对于活动隧道,我缺少什么吗?

在某些情况下,我尝试创建到主机的潜在同时反向隧道数量,并在许多不同的主机上隧道返回相同的端口号。让TCP堆栈自动管理端口池似乎是最有效的方法。


使用“ -R 0:xxxx:y”语法时,ssh将输出“已分配的端口49488,用于在stderr上远程转发到xxxx:y。”
BlakBat 2012年

是的,问题是如何将这些信息传递到服务器端-这将对您有很大帮助...
codedstructure 2012年

Answers:


1

如果将sshd_config配置文件中的'LogLevel'设置为DEBUG1(或任何DEBUG级别),则sshd会将端口号记录在/var/log/auth.log中。

请记住,由于记录了很多日志,因此使用DEBUG或更高的LogLevel可能会带来隐私风险。

(从/var/log/auth.log中删除了几行以显示相关信息)

Jun 24 06:18:24 radon sshd[9334]: Connection from 192.168.13.10 port 39193
Jun 24 06:18:24 radon sshd[9334]: Accepted publickey for lornix from 192.168.13.10 port 39193 ssh2
Jun 24 06:18:24 radon sshd[9334]: pam_unix(sshd:session): session opened for user lornix by (uid=0)
Jun 24 06:18:24 radon sshd[9334]: User child is on pid 9339
Jun 24 06:18:24 radon sshd[9339]: debug1: Local forwarding listening on 0.0.0.0 port 0.
Jun 24 06:18:24 radon sshd[9339]: debug1: Allocated listen port 39813
Jun 24 06:18:24 radon sshd[9339]: debug1: channel 0: new [port listener]
Jun 24 06:18:24 radon sshd[9339]: debug1: Local forwarding listening on :: port 39813.
Jun 24 06:18:24 radon sshd[9339]: debug1: channel 1: new [port listener]
Jun 24 06:18:27 radon sshd[9339]: Received disconnect from 192.168.13.10: 11: disconnected by user

如果继续进行下去,则可以看到解析连接信息的位置,然后是转发的端口(在这种情况下为39813)

我在两台机器之间使用了此命令行,但确实设置了ssh-key登录,因此没有密码提示或延迟

-xenon- lornix:~> ssh -R "*:0:radon:22" -N -T radon
Allocated port 39813 for remote forward to radon:22

-N指定不给出命令,-T停止为此连接分配tty。

传播端口连接信息的另一种方法是从客户端解析它,然后发送电子邮件,jabber,文本消息,烟雾信号或鸽子以将端口#携带给需要的人。


0

您可以将stderr ssh插入到一个程序中,该程序在目标计算机上打开与服务器的连接,并报告其计算机名/ IP地址/序列号/以及端口号。有点像这样:

% ssh -R "*:0:radon:22" -N -T radon 2>&1 | sed "s/^/`uname -n` /" | netcat radon 3743
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.