这些是测试 SSH 隧道或排除故障的更详细步骤。您可以在脚本中使用其中的一些。我添加这个答案是因为我必须在两个应用程序停止工作后对它们之间的链接进行故障排除。仅仅 grepping ssh 进程是不够的,因为它仍然存在。而且我不能使用nc -z,因为我的netcat咒语中没有该选项。
让我们从头开始。假设有一台名为 local 的机器,IP 地址为 10.0.0.1,另一台名为 remote,位于 10.0.3.12。我会将这些主机名添加到下面的命令中,这样它们的执行位置就很明显了。
目标是创建一个隧道,将 TCP 流量从远程机器上的端口 123 上的环回地址转发到本地机器上的端口 456。这可以在本地机器上使用以下命令完成:
local:~# ssh -N -R 123:127.0.0.1:456 10.0.3.12
要检查进程是否正在运行,我们可以这样做:
local:~# ps aux | grep ssh
如果您在输出中看到该命令,我们可以继续。否则,请检查 SSH 密钥是否安装在遥控器中。请注意,排除远程 IP 之前的用户名,使 ssh 使用当前用户名。
接下来,我们要检查隧道是否在远程打开:
remote:~# netstat | grep 10.0.0.1
我们应该得到类似这样的输出:
tcp 0 0 10.0.3.12:ssh 10.0.0.1:45988 ESTABLISHED
如果能真正看到一些从远程到主机的数据,那就太好了。这就是 netcat 的用武之地。在 CentOS 上可以使用yum install nc 安装它。
首先,在本地机器上打开一个监听端口:
local:~# nc -l 127.0.0.1:456
然后在遥控器上建立连接:
remote:~# nc 127.0.0.1 123
如果您打开本地计算机的第二个终端,您可以看到连接。像这样的:
local:~# netstat | grep 456
tcp 0 0 localhost.localdom:456 localhost.localdo:33826 ESTABLISHED
tcp 0 0 localhost.localdo:33826 localhost.localdom:456 ESTABLISHED
更好的是,继续在遥控器上输入一些内容:
remote:~# nc 127.0.0.1 8888
Hallo?
anyone there?
您应该会在本地终端上看到它的镜像:
local:~# nc -l 127.0.0.1:456
Hallo?
anyone there?
隧道正在工作!但是,如果您有一个名为 appname 的应用程序,它应该监听本地机器上的 456 端口,该怎么办?在两侧终止 nc 然后运行您的应用程序。您可以使用this 来检查它是否在正确端口上侦听:
local:~# netstat -tulpn | grep LISTEN | grep appname
tcp 0 0 127.0.0.1:456 0.0.0.0:* LISTEN 2964/appname
顺便说一句,在遥控器上运行相同的命令应该会显示 sshd 正在侦听端口 127.0.0.1:123。