3

SSH客户端可以通过配置进行不少实用的功能。详细的说明可以参见man ssh_config

概述

配置入口

  • 作为命令行参数传递
  • 用户级配置文件~/.ssh/config
  • 系统级配置文件/etc/ssh/ssh_config

配置格式和用法

  • 空行和#开头的行均为注释
  • 有效行以keyword arguments为一组,参数可以由空白符隔开,或者以=表示一一对应的关系
  • 参数如果包含空格,需要用引号包括整体参数;如果使用=作为分隔符,则不用
  • 配置项的keyword大小写不敏感

通常一个有效的配置组有以下模式:

Host app1
    HostName my.app.com
    Port 2200
    User superadmin

那么,你获得了一个app1的配置;你可以把app1当作一种别名,任何ssh相关的命令里面都可以用它来获取你之前的配置。例如,建立一个交互式的ssh连接:

ssh app1

你会发现,它等效于:

ssh -p 2200 superadmin@my.app.com

翻阅文档不难发现,ssh的配置向有很多很多。下文会给出一些十分有趣的配方,让你快速从中获益。

美味配方

Recipe 01: 管理多公钥

为了安全或者其他因素,我们会拥有多个公钥。在没有指定特定公钥的情况下,ssh会使用~/.ssh/id_rsa.pub作为公钥。假如针对开放服务(例如github等),我们要使用另外一个公钥,通常需要利用ssh-i参数;我们也可以利用ssh_config来轻松管理。

Host github.com
    IdentityFile ~/.ssh/github.key

假如,github内,我们需要针对不同的team,使用不同的公钥,我们还可以:

Host github-project1
    User git
    HostName github.com
    IdentityFile ~/.ssh/github.project1.key
Host github-org
    User git
    HostName github.com
    IdentityFile ~/.ssh/github.org.key
Host github.com
    User git
    IdentityFile ~/.ssh/github.key

Recipe 02: 安全网关

对于大多数不公共暴露服务,只能通过一个网关服务器去访问。假如一个简化的拓扑结构如下:

                                 - > App1
                                /
Internet < - >  Gateway < - >  - >  App2
                                \
                                 - > App3

这样,我们必须通过Gateway来访问内部的APP服务器,我们可以利用ProxyCommandnc来一起实现:

Host gateway
     HostName example.com
     User foo
     Port 22
     IdentityFile ~/.ssh/id_rsa.pub
Host app1
      HostName gold-mine.com
      Port 22
      User foo
      ProxyCommand ssh -A gateway nc %h %p

这样,我们可以直接通过如下命令来访问app1:

ssh app1

Recipe 03: 安全通道

除了登录到网关之后手动连接,我们也可以通过网关建立安全通道,并映射到开发者本地的某个端口;这样开发者可以直接通过本地端口连接网关之后的私有服务。

例如,我们需要连接一个只在数据库服务本地监听的mysql:

$ ssh -f -N -L 9906:127.0.0.1:3306 root@mysql.app.com

那么我们可以通过mysql连接本地的9906端口来进行访问远程的数据库。

将这些参数转换为ssh_config

Host tunnel
    HostName mysql.app.com
    IdentityFile ~/.ssh/internal-1.key
    LocalForward 9906 127.0.0.1:3306
    User root

ssh命令被简化为:

$ ssh -f -N tunnel

假设,这台mysql本身就在网关之后呢?利用上一条recipe,我们可以如下设置:

Host gateway
     HostName gateway.app.com
     User root
     Port 22
     IdentityFile ~/.ssh/id_rsa.pub

Host tunnel
     HostName mysql.app.com
     Port 22
     User root
     ProxyCommand ssh -A gateway nc %h %p
     LocalForward 9906 127.0.0.1:6379

ssh命令不变,但是这时,ssh通道是经用网关服务器转发的。

科学上网

利用ssh转发功能,我们可以迅速的打开一个socks代理:

$ ssh -CfNg -D 127.0.0.1:1080 root@server.com
  • -C:开启通讯压缩
  • -f:后台执行
  • -N:忽略远程命令(服务器端sshd配置)
  • -g:允许远程用户访问本地转发端口
  • -D:开启ssh的动态转发,即实现一个sock代理

只有-D是核心命令,其他的都是辅助效果。

相应的ssh_config为:

Host prxoy
     HostName server.com
     Port 22
     User root
     Compression yes
     DynamicForward *:6370

相应的ssh命令:

$ ssh -fN proxy

即使直接ssh proxy也可以,只不过这个进程没有进入后台,当你临时使用时反而这样更方便。

Reference


RobinQu
599 声望38 粉丝