ssh所有机器在路由器后面

我的局域网上有几台机器。 一个用作http代理来定位其他网站(现在工作正常,感谢ServerFault)。 在我的路由器上,端口22被NAT到这个代理机器。 我希望能够通过互联网访问其他机器,例如:

ssh user@first_machine.my_domain.tld ssh user@second_machine.my_domain.tld

我可以使用代理机器来“过滤”传入的ssh请求并将其路由到正确的机器? (对于在Apache中使用mod_proxy和namevirtualhost组合的网站,也可以这样做)

谢谢,Luc

您可以先使用VPN连接到远程networking,然后通过SSH直接连接。 这是可能的,也可能不可能的,可能会或可能不是你想要达到的目标,但是会起作用。

我强烈build议你尽可能less的机器通过端口映射公开到互联网! 特别是如果允许密码/键盘交互式validation的话。 人们确实有弱密码。

另一个build议可能是连接到你的代理机器,并明确地build立你想要直接到达NAT后面的每台机器的通道。 您可以直接从命令行指定一个(或多个)SSH隧道,如下所示:

ssh -L localport:hostnameOrIPofMachineBehindNAT:remoteMachinePort [email protected] 

如果localport是您需要在本地主机上连接的端口号,那么该端口号将被转发到NAT后面的机器,SSH通过您的代理进行隧道传输。

hostnameOrIPofMachineBehindNAT是要在NAT后面到达的非代理机器的LAN IP或LAN DNS。 通常在私人IP范围,如10 / 8,192.168 / 16或172.16 / 12。

remoteMachinePort是要在NAT后面的远程计算机上连接的服务的端口号。 在SSH的情况下,这可能是标准的22端口。

[email protected]是微不足道的,我猜。

然后可以从另一个本地shell连接到另一台机器:

 ssh usernameOnRemoteBoxBehindNat@localhost 

由于一个命令行可以很容易地input很长的时间,所以最好把所有的东西放在这里,使用你想要的SSH选项,以及你喜欢的许多端口隧道到你的~/.ssh/.ssh_config文件中。 这将减less你的inputssh connectionNickname并始终拥有所有的转发和选项自动设置。

请参阅man 5 ssh_config ,以获取可在~/.ssh/.ssh_config使用的configuration选项的深入说明和列表。

你可以在.ssh/config文件中设置它来自动configuration隧道

http://backdrift.org/transparent-proxy-with-ssh

基本上你只是添加一些像

 Host machinebehindrouter ProxyCommand ssh user@externalhost nc %h %p 
  • 你可以先ssh到一台机器,然后ssh从那台机器到其他机器。 也许使用ssh-key使login更容易。
  • 或者你可以改变每台机器的端口和NAT。

我会select第一个选项,并确保其他机器只允许第一台机器的SSH。

其他人提出了很好的build议,但是我认为当你提供一个示例命令时,最简单和最灵活的答案已经包含在你的问题中。 也就是说,如果我们有源主机,中间主机和目标主机, 由于ssh可以在我们的远程主机上执行命令,所以可以从源主机运行这个命令:

ssh -t $intermediate ssh $destination

当然,你可以根据需要添加其他选项到ssh命令,或者编写一个shell包装器(脚本,别名,函数)来处理任何variables。 -t标志强制分配一个伪tty,我认为这是必要的,但是你可以在没有它的情况下testing连接来确认。 另外,如果为链中的每个主机创build公钥/私钥对,并使用ssh-agent,则可以避免input密码。

我会看看只是连接到您的代理框或其他主机,然后使用GNU screen实用程序有多个会话运行到您的其他箱子。

作为奖励,您将学习如何使用screen ,这是每个人都应该了解更多的奇妙的应用程序!