言简意赅的讲解SSH解决的痛点
在童鞋们讲解Docker之后,大家遇到了各种问题。互相协助的时候发现很多童鞋没有公网IP不能被远程,这时候交流起来犯了难。那本文给大家提供一些解决思路,在实际开发中,很多个人开发者和小型团队会面临这样的挑战:某些服务器没有公网IP,导致无法直接通过SSH进行远程访问。这时,我们可以借助一台拥有公网IP的服务器来解决这个问题。这篇文章将为你详细讲解如何通过反向代理技术,使用SSH命令来连接没有公网IP的服务器,同时我们还将探讨一些SSH的常见用法及一些冷门技巧。
背景介绍
有时我们需要访问位于内网中的服务器,这些服务器没有公网IP,无法通过传统的SSH直接访问。我们可以通过一台拥有公网IP的服务器,利用反向SSH隧道技术将没有公网IP的服务器连接到公网IP服务器上,然后通过公网IP服务器作为跳板机,访问内网服务器。
假设你有以下两台服务器:
- 公网IP服务器:拥有公网IP的服务器,可以直接访问。
- 目标服务器:没有公网IP的服务器,位于内网。
我们将通过反向SSH隧道,让目标服务器与公网IP服务器建立连接,并用公网IP服务器作为跳板机连接目标服务器。
解决方案:使用SSH反向隧道 (ssh -R)
SSH反向隧道是一种通过远程服务器反向建立隧道的方式。使用ssh -R命令,你可以让目标服务器(没有公网IP的服务器)连接到公网IP服务器,并将目标服务器的端口映射到公网IP服务器上,从而实现远程访问。
步骤1:在没有公网IP的目标服务器上创建反向隧道
假设你在目标服务器上执行以下命令:
ssh -R 2222:localhost:22 user@公网IP服务器
这条命令的含义如下:
- -R 2222:localhost:22:表示将目标服务器的22端口(SSH端口)映射到公网IP服务器的2222端口。通过公网IP服务器的2222端口,可以访问目标服务器的SSH服务。
- user@公网IP服务器:你需要使用你在公网IP服务器上的用户名和IP地址进行连接。
执行该命令后,目标服务器的SSH服务就通过公网IP服务器的2222端口暴露出来了。
步骤2:从本地设备连接到公网IP服务器
现在,在你的本地设备上,你可以通过以下命令连接到公网IP服务器的2222端口:
ssh -p 2222 user@公网IP服务器
这条命令会将你连接到公网IP服务器上的2222端口,该端口实际上是指向目标服务器的SSH服务的,所以user应该是目标服务器的。
步骤3:通过公网IP服务器访问目标服务器
一旦你成功连接到公网IP服务器,你就可以直接通过该服务器访问没有公网IP的目标服务器。可以像使用普通SSH连接一样,在公网IP服务器上执行操作,操作实际上会影响目标服务器。
常见的SSH用法
除了反向隧道,SSH还提供了许多强大的功能,帮助开发者更高效地管理和访问远程服务器。以下是一些常见的SSH用法:
1. SSH端口转发(Port Forwarding)
除了反向隧道,你还可以使用SSH端口转发(forwarding)来转发端口。常见的方式有本地端口转发和远程端口转发。
-
本地端口转发:将本地机器的端口映射到远程服务器的端口。
ssh -L 8080:localhost:80 user@remote_server
这条命令将你本地的8080端口映射到远程服务器remote_server的80端口。
-
远程端口转发:将远程机器的端口映射到本地机器的端口。
ssh -R 9090:localhost:3000 user@remote_server
这条命令将远程服务器remote_server的9090端口映射到本地机器的3000端口。
2. SSH密钥认证(Key-based Authentication)
为了提高安全性,SSH支持使用密钥对进行认证,而不是依赖密码登录。首先,你需要在本地机器生成一对SSH密钥:
ssh-keygen -t rsa
然后将公钥上传到远程服务器的~/.ssh/authorized_keys文件中:
ssh-copy-id user@remote_server
这样,以后你就可以使用密钥而不是密码来登录远程服务器。
3. SSH代理转发(SSH Agent Forwarding)
如果你需要在远程服务器上使用本地机器的SSH密钥,可以使用SSH代理转发。首先,在本地启动SSH代理:
eval $(ssh-agent)
然后将你的密钥添加到SSH代理中:
ssh-add ~/.ssh/id_rsa
接着,当你通过SSH登录到远程服务器时,使用-A选项启用代理转发:
ssh -A user@remote_server
这样,你在远程服务器上的操作将能够使用本地机器的SSH密钥。
4. SSH的ControlMaster和ControlPersist选项
如果你需要频繁连接到同一台远程服务器,可以使用ControlMaster和ControlPersist选项来复用SSH连接,从而加速连接过程。
在~/.ssh/config文件中添加以下配置:
Host remote_server
ControlMaster auto
ControlPersist 10m
这将允许SSH复用连接,保持连接持续10分钟,减少每次连接的开销。
冷门用法:SSH代理隧道
在某些情况下,你可能希望通过SSH建立一个完整的代理隧道,来访问受限的网络资源。使用SSH代理隧道可以将你的网络流量通过SSH通道进行加密传输,绕过防火墙等网络限制。
假设你希望通过SSH隧道访问远程服务器的HTTP服务,可以使用如下命令:
ssh -D 8080 user@remote_server
这将创建一个SOCKS代理,所有通过本地8080端口的请求都会通过SSH隧道转发。
总结
通过SSH的反向隧道功能,个人开发者可以轻松地通过公网IP服务器远程访问没有公网IP的内网服务器。这种方式不仅解决了没有公网IP服务器的访问问题,还能扩展为多种SSH常见用法,如端口转发、密钥认证、代理转发等,帮助开发者提高工作效率。
通过上述内容,你就已经基本理解了这个方法,基础用法我也都有展示。如果你能融会贯通,我相信你会很强
Best Wenhao (楠博万)
评论前必须登录!
注册