在较新版本的 OpenSSH 上创建反向隧道时,可以指定远程端口 0 来绑定任何可用端口:
-R [bind_address:]port:host:hostport
...
如果端口参数为“0”,则监听端口将在服务器上动态分配,并在运行时报告给客户端。...
我的问题是:我如何(以自动化方式)确定服务器上的此端口分配?它只报告给运行 ssh 客户端的主机,而不是目标主机,这似乎没什么帮助,因为目标主机需要连接到此端口才能访问客户端上的服务。
我能想到的两个类似选项是运行
# netstat -ntlp
在服务器上,通过 sshd 查找 127.0.0.1 上绑定的可疑端口,或者查看
# lsof -p $PPID | grep TCP | grep LISTEN
但是从自动化的角度来看,这两种情况都不是令人愉快的,并且如果创建了多个这样的隧道,就没有任何方法将动态端口绑定回原始服务端口。
我是否缺少了什么来有效地获取 sshd 服务器端的活动隧道列表(本地和远程端口号),就像相当于 SSH_CONNECTION 环境变量一样,但对于活动隧道来说?
在某些情况下,我试图创建可能非常多的同步反向隧道到一台主机,隧道返回到许多不同主机上的相同端口号。让 TCP 堆栈自动管理端口池似乎是实现此目的最有效的方式。
答案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、文本消息、烟雾信号或鸽子将端口号传送给需要它的人。
答案2
您可以将 stderr 导入ssh
到程序中,该程序会打开与目标计算机上的服务器的连接,并报告其计算机名称/ IP 地址/序列号/任何其他信息以及端口号。有点像这样:
% ssh -R "*:0:radon:22" -N -T radon 2>&1 | sed "s/^/`uname -n` /" | netcat radon 3743