GoでSSH port forwarding
今までPort Forwardingはbashrcに書いて呼び出していましたが、量が多い時など手間が多くなっていたので、Goで呼び出せるようにしようと調べてみました。ちょうど同時期にGoで実装している方がいたので、参考にしてサンプル実装を作ってみました。
go-memo/ssh_port_forwarding at master · reiki4040/go-memo · GitHub
vagrantで踏み台(bastion)とHTTPサーバを起動して、bastion経由でHTTPサーバの80ポートにforwardingする形でサンプルを作っています。
参考にしたページではSSHの認証がパスワードだったので、公開鍵認証に変更して実装しています。この公開鍵認証の実装例がGoDocにあるんですが、その通りにやると動かず地味にはまりました。
調べてみたらExampleはここの一部とのこと。HostKeyをデフォルトでチェックしてないGoの脆弱性(CVE-2017-3204)があってそうなったようですね。とりあえず、サンプルではそこまで要らないのでInsecureIgnoreHostKeyで対応しています。実際使うときは、適宜チェック機構があった方が良いです。多分known_hostsファイルの対応でいいと思います。
実装してないので、ツール的に必要だと思うのは以下あたりなので適宜実装していこうかと。
- 複数のport forwardingの一括起動
- remote hostのDNS解決(A record, SRV record)
- 定期的な接続先の再解決(DNS追従など)
- ServiceDiscovery的なもので自動解決(AWS CloudMapあたり)
- 暗号化されているprivate keyの読み込み対応(GoDocにもありますがx509でやる必要がある様子)
- remoteが複数ある場合のバランシング(これはできるんだろうか?)
- 多分色々エラーハンドリング