A机器在内网, B机器在外网,B无法直接访问A。
1.从A机器上发起SSH连接到B机器上 ,建立反向连接隧道
ssh -v -NfR 3999:localhost:22 root@20.1.178.201
-f 表示后台执行
-N 表示不执行任何命令
-R 建立反向隧道 listen-port:host:port 指派远程上的 port 到本地地址上的 port。
3999 A机器用于建立反向隧道的端口,只要端口没被使用, 可以随意选择
localhost A机器的localhost
22 B机器的ssh端口
这里需要手动输入B机器ssh的密码, 可以使用免密码登陆。
2.在B机器上发起ssh连接
ssh localhost -p 3999
-p 表示指定目标机器的端口
localhost A机器的localhost
3999 目标机器的端口, 一定要和A机器上用于建立反向隧道的端口号一致。
这里需要输入A机器的ssh登陆密码
A到B的ssh反向隧道建立之后,A上的本地3999端口就被转发到B的22端口了,
上面这个ssh命令就建立了从A到B:22的连接
实际使用中, 我们可能需要A机器建立连接时不需要输入密码,所以要用到ssh免密码登陆。
SSH 密钥对总是成双出现的,一把公钥,一把私钥。公钥可以自由的放在您所需要连接的 SSH 服务器上,而私钥必须稳妥的保管好。所谓"公钥登录",原理很简单,就是用户将自己的公钥储存在远程主机上。 登录的时候,远程主机会向用户发送一段随机字符串,用户用自己的私钥加密后,再发回来。远程主机用事先储存的公钥进行解密,如果成功,就证明用户是可信的, 直接允许登录 shell,不再要求密码。这样子,我们即可保证了整个登录过程的安全,也不会受到中间人攻击。
openwrt上可能装有两个ssh服务, 一个是openssh,一个是dropbear(轻量级的ssh服务)。所以生成公钥步骤不一样。
dropbear:
#把authorized_keys-1 复制到服务器上,用scp工具或者其他
这里我用scp工具拷贝到服务器的tmp目录下.
如果服务器端也是用dropbear,将public key增加到/etc/dropbear/
cat /tmp/authorized_keys-1 >> /etc/dropbear/authorized_keys
如果服务器端用的是openssh, 将public key增加到~/.ssh/authorized_keys
cat /tmp/authorized_keys-1 >> ~/.ssh/authorized_keys
重启ssh服务端
客户端发起连接, 如果前面步骤没错的话, 这里就可以不用输密码,直接连接上了。
ssh -i /etc/dropbear/dropbear_rsa_host_key root@20.1.178.201
-i 指定加密方式
root 目标机器的登陆用户名
20.1.178.201 目标机器的ip地址
openssh:
# 生成公钥, 一直回车, 不用输密码
ssh-keygen -t rsa
命令执行完会在~/.ssh/ 目录下生成 rsa_id rsa_id.pub 文件, .pub文件就是公钥。
#将公钥拷贝到服务器上, 步骤和dropbear一致。
拷贝完成之后, 重启ssh服务端,
回到客户端机器发起连接, 如果前面配置没错的话, 这里就可以连接上了
ssh -i ~/.ssh/id_rsa root@20.1.178.201