SSH远程登录和TCP端口转发

Security Shell Protocal (SSH)是一种网络协议,旨在为不安全的网络提供安全的加密通信。SSH应用基于客户端/服务端架构,SSH客户端用于登录远程机器(SSH服务器)并在远程机器上执行命令。
最常见的SSH应用包括:

  • SSH远程登录
  • 任意TCP端口转发

1. SSH远程登录

身份验证的方式有很多,最常见的是密码验证和公钥认证。首次登录远程ssh服务器时,ssh会将机器标识保存在~/.ssh/known_hosts文件里,也就是说它会保存访问过的每个主机的信息。

1.1 密码验证

如果没有配置任何身份验证方式,ssh会提示你输入密码。

$ ssh username@ip
username@ip‘s password:

SSH服务默认端口是22,如果ssh服务不是在默认端口启动的,则在登录时需要通过-p指定端口:

$ ssh -p 1234 username@ip

如果主机标识发生改变,ssh会发出告警并且禁用密码验证方式,以防止服务器欺骗或中间人攻击,否则这些攻击可以规避加密。

1.2 公钥认证

公钥认证基于公钥密码学,密码系统的加密和解密使用不同的密钥。使用公钥认证可以避免每次登录时输入密码,你要在客户机上生成公-私密钥对,并把公钥复制到服务器上,之后你就可以方便地登录远程机器。

1.2.1 生成密钥对

公钥协议和算法有很多,这里我们使用RSA算法,在客户机上输入命令:

$ ssh-keygen -t rsa

该命令会生成~/.ssh目录,并在目录下生成~/.ssh/id_rsa~/.ssh/id_rsa.pub文件分别保存私钥和公钥。

1.2.2 复制公钥到服务器

服务器把客户机公钥保存在~/.ssh/authorized_keys文件内,有两种方式拷贝公钥:

  1. 客户机使用ssh-copy-id命令:
$ ssh-copy-id remote_username@ip
  1. 直接将客户机的id_rsa.pub内容复制到服务机的~/.ssh/authorized_keys文件末尾:
(client) $ cat ~/.ssh/id_rsa.pub
(server) $ vim ~/.ssh/authorized_keys
1.2.3 远程登录

现在你可以像密码验证的命令那样登录远程服务器,但是不再需要输入密码。

为了简化这个命令,还可以创建~/.ssh/config文件并且添加Host:

Host wechar
  HostName <remote_ip>
  User wechar
  IdentityFile ~/.ssh/id_rsa

然后你可以这样登录:

$ ssh wechar

更进一步,如果你必须通过**跳板机(jump server)**访问安全隔离的空间内的设备,你可以这样配置:

Host jump
  HostName <jump_ip>
  User username
  IdentityFile ~/.ssh/id_rsa

Host dev01 # must access through jump server, access dev01 as username
  HostName <dev01_ip>
  ProxyJump jump
  ProxyCommand  sudo ssh -W %h:%p jump

Host dev02 # access dev02 as another_user
  HostName <dev02_ip>
  IdentityFile ~/.ssh/id_rsa
  User another_user
  ProxyCommand ssh -W %h:%p jump

2. TCP转发

可以通过以下选项指定任意TCP连接在安全通道(channel)内被转发:

-L [bind_address:]port:target_host:target_hostport

这将分配一个socket来监听目标socket,一旦连接到本地端口,连接就会通过安全通道转发。

举个例子,我们要通过跳板机jump转发10.128.1.1:4990端口到本地端口5005

$ ssh -f -N -L 5005:10.128.1.1:4990 jump
  • -f: ssh以守护进程方式启动
  • -N: 不执行远程命令,只用于端口转发

TCP转发有很多应用场景。

2.1 JVM远程调试

我们可以用TCP转发为远程服务器上的java应用进行调试,步骤如下:

  1. 通过以下选项启动java应用:
java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=4990 -cp "Test.jar:lib/*" org.wechar.Main
  1. 在Idea上配置远程调试:

    然后你就可以像本地应用一样调试远程java应用了。
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值