通过中间Linux/BSD网关建立X连接的隧道

时间:2020-01-09 10:43:05  来源:igfitidea点击:

我有 SSH网关位于我的NAT防火墙后面。
因此,所有用户必须首先从Internet登录到我的网关主机,然后登录到LAN上的其他计算机。
这对于基于cli的应用程序非常有用。
但是,很少有用户希望从内部LAN主机运行x应用程序,并希望通过中间的ssh网关在隧道X上显示并在其本地系统上显示输出。
例如,从本地系统用户进行如下连接:

ssh -X [email protected] ssh -X [email protected]

X转发失败并出现错误:

Error: Cant open display:
错误:无法打开显示:

如何解决此问题,并允许用户在我的中间Linux/BSD网关中使用X应用程序?
您需要在$HOME/.ssh/config中将ProxyCommand用于通过Internet连接的外部主机。
它指定用于连接到服务器的命令。
命令字符串延伸到该行的末尾,并通过users shell执行。
在命令字符串中,%h将替换为要连接的主机名,而%p将替换为端口。
该命令基本上可以是任何命令,并且应该从其标准输入读取并写入其标准输出。
它最终应连接在某台计算机上运行的sshd服务器,或者在某处执行sshd -i。
主机密钥管理将使用所连接主机的主机名(默认为用户执行的名称)完成。
将命令设置为none将完全禁用此选项。

您需要将此指令与nc及其代理支持一起使用。
例如,以下指令将通过HTTP代理在端口3128处位于192.1.0.222处进行连接:

ProxyCommand /usr/bin/nc -X connect -x 192.1.0.222:3128 %h %p

打开$HOME/.ssh/config:

$ vi $HOME/.ssh/config

修改/添加配置,如下所示:

Host internal
        Hostname somelan.example.com
        HostKeyAlias proxy
        User Hyman
        # ProxyCommand ssh gw.theitroad.com nc %h %p 2> /dev/null
        ProxyCommand ssh gateway.example.com "/usr/bin/nc internal 22"

保存并关闭文件。
其中:

  • Host internal将以下声明(直到下一个Host关键字)限制为仅与那些在关键字之后给出的模式之一匹配的主机。
  • ProxyCommand使用nc命令通过网关将您的SSH会话代理到内部系统。
  • "用户"指定登录用户的身份。在我们的示例中,以Hyman身份登录。
  • HostKeyAlias指定在查找或者将主机密钥保存在主机密钥数据库文件中时应使用的别名,而不是真实的主机名。该行可以被注释掉。

现在,用户可以登录并运行X应用程序:

$ ssh -X [email protected]
$ ssh -X [email protected]
$ xeyes &

有关更多详细信息,请参见ssh_config手册页。