使用 assh 來管理 SSH config

前兩天一直在思考如何管理我的 SSH config 配置,最後的解決辦法就是通過 git 版本管理起來。但這兩天由冒出一個新的問題,那就是經常在國內直連 aws 或者 oracle 的機器時 ssh 連不上,但是通過國內的 VPS 中轉就非常快,那這就意味着,我每一次連接國外的機器時必須先登錄騰訊雲的機器,然後在從騰訊雲的機器上連過去,有些麻煩,但那天在 Twitter 上看到有人分享了一個 SSH 管理的命令行工具 assh,大致的看了一下使用簡介,通過配置就可以完美的解決這個問題。

ProxyCommand

assh 這個工具就將登錄一臺機器跳轉 SSH 再登錄另外一臺機器的步驟簡化了,assh 使用 lib-ssh 提供的 ProxyCommand 來實現。大部分的公司,或者注重安全的 SSH 訪問都會將 SSH 的登錄配置管理放到一臺堡壘機或者跳板機上,然後通過跳板機再去連接真正的機器。

 +-------+       +----------+      +-----------+
 | Laptop| <---> | Jumphost | <--> | RealServer |
 +-------+       +----------+      +-----------+

比如上面的流程中,可能需要先連接 Jumphost:

ssh -p 222 someone@Jumphost

然後在 Jumphost 上連接 RealServer:

ssh someone@RealServer

如果要簡化這個步驟可以使用 SSH 的 -J 選項:

ssh -J someone@Jumphost:222 someone@RealServer

或者可以使用 ProxyCommand:

ssh -o ProxyCommand='ssh -W %h:%p -p 222 someone@Jumphost' someone@RealServer

從 OpenSSH 7.3 開始,還可以使用 ProxyJump,可以通過在 config 文件中配置:

Host RealServer
    HostName 1.2.3.4
	ProxyJump someone@Jumphost:22[, user2@Jumphost2:222]
	User someone

如果有多個 Jumphost 可以直接用逗號分隔接在後面。

上面兩個方式都可以直接通過 Jumphost 來直接登錄到 RealServer 上。

SSH Config 配置

  • Host: 定義 host, * 可以用來表示全局配置
  • HostName: 定義真實的 hostname, 可以是域名或者 IP
  • User: SSH 登錄的用戶名
  • IdentityFile: 私鑰路徑
  • ProxyCommand: 定義連接服務器的命令
  • LocalForward: 通過 TCP 轉發指定的本地端口到遠程的端口
  • Port: 指定連接的遠程端口
  • Protocol: 協議
  • ServerAliveInterval: 設置沒有數據後多少時間間隔超時
  • ServerAliveCountMax: 設置服務活躍信息的數量,如果閾值達到,同時服務器活躍信息 ,服務器活躍消息 (server alive messages) 通過加密通道傳輸,因此不能被欺騙。The TCP keepalive 選項通過 TCPKeepAlive 是可以僞造的。服務器活躍機制在判斷客戶端或者服務器在不活躍時何時斷開是非常有用的。默認值是 3,舉一個例子,ServerAliveInterval 設置成 15,ServerAliveCountMax 保持默認,如果服務器沒有迴應,ssh 會在大約 45 秒後斷開連接。這個選項只在 protocol 2 下有效

看一個最基本的 assh.yml 配置:

hosts:
  hosta:
    Hostname: 1.2.3.4

  hostb:
    Hostname: 5.6.7.8
    Gateways: hosta

  hostc:
    Hostname: 9.10.11.12
    Gateways: hostb

  hostd:
    Hostname: 13.14.15.16
    GatewayConnectTimeout: 2
    Gateways:
    - direct
    - hosta

說明:

  • 配置了 hosta 直連
  • hostb 則是通過 hosta 連接,ssh hostb 時會轉換成 ssh -o ProxyCommand="ssh hostb nc %h %p" hosta
  • hostc 通過 hostb 連接
  • hostd 會首先嚐試直連,如果失敗了則回退到使用 hosta 連接

加速 SSH 會話

OpenSSH 可以複用存在的 TCP 連接,比如在創建了多個 SSH sessions 的時候,可以避免 TCP 創建連接帶來的過度開銷,修改 vi ~/.ssh/config:

Host *
	ServerAliveInterval 60
	ServerAliveCountMax 30
	ControlMaster auto
	ControlPath ~/.ssh/connection-%r@%h:%p
	ControlPersist 48h

assh

回到 assh 本身,assh 是用 Go 語言編寫的一個命令行工具,使用 yaml 格式的配置,可以通過該配置快速生成 ~/.ssh/config 配置,通過幾行配置就可以利用 ProxyCommand 來進行 SSH 跳轉。

特性

assh 非常小巧,當卻很強大

  • 支持正則表達式
  • 支持別名 aliases -> gate.domain.tld
  • 支持 includes 語法,可以將配置文件拆分到多個文件 includes: split configuration in multiple files
  • 支持 SSH 連接的透明轉發 gateways -> transparent ssh connection chaining
  • local command execution: finally the reverse of RemoteCommand
  • inheritance: make hosts inherits from host hosts or templates
  • 支持繼承,可以通過繼承其他 hosts 或者模板來簡化配置
  • templates: 模板
  • 通過環境變量來進行配置 variable expansion: resolve variables from the environment
  • 更加靈活的 ProxyCommand, smart proxycommand 當 netcat 或者 socat 可用時,會替換純 TCP 連接
  • 可以進行速率控制,rate limit
  • JSON output
  • desktop notifications: based on events
  • Graphviz representation of the hosts

Install

go get -u moul.io/assh/v2

Event

assh 支持一些事件,可以用來觸發一些操作或者進行通知。

BeforeConnect

BeforeConnect 會在 assh 將要連接到遠程 SSH 端口時觸發。

OnConnect

OnConnect 會在連接到遠端 SSH 端口後被調用。

OnConnectError

OnConnectError 會在 assh 在建立 TCP 連接失敗時調用。

OnDisconnect

OnDisconnect 會在 assh socket 斷掉後觸發。

BeforeConfigWrite

BeforeConfigWrite 會在 assh 重寫 ~/.ssh/config 時觸發。

基礎命令

assh config

# 生成 SSH 配置文件
assh config build
assh config build > ~/.ssh/config
# 搜索 hosts
assh config search <keywords>

# 列出配置
assh config list
# 可視化顯示
assh config graphviz

assh sockets

# 列出活躍的連接
assh sockets list
# create a master control sockets
assh sockets master
# close active control sockets
assh sockets flush

assh ping

# send packets to the SSH server
assh ping -c 4 host

reference

https://github.com/moul/assh https://en.wikibooks.org/wiki/OpenSSH/Cookbook/Proxies_and_Jump_Hosts

轉載自:http://einverne.github.io/post/2020/07/advanced-ssh-config-management.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章