どこでも見れるメモ帳

とあるSEの備忘録。何かあれば気軽にコメントください〜

SSHトンネル経由でVPN/社内ネットワーク内のGitリポジトリにpush/pull/cloneする

f:id:ni66ling:20201220150009p:plain

はじめに

コロナで在宅ワークするにあたり、上図の在宅開発端末*1からダイレクトにVPN/社内ネットワーウ内の社内サーバにあるGitリポジトリにpush/pullしたいニーズが発生したのでメモです*2

課題感

git push/pullするたびに毎回、上図の「在宅作業端末」を経由する必要があり*3、具体的にはgit push/pull/cloneするたびに次のような作業が発生します。

  • 「在宅開発端末」→「社内サーバ」にgit push
    1. 「在宅開発端末」から「在宅作業端末」にscp等でリポジトリディレクトリごとコピー
    2. 「在宅作業端末」から「社内サーバ」にgit push
  • 「社内サーバ」→「在宅開発端末」にgit clone/pull
    1. 「社内サーバ」から「在宅作業端末」にgit clone/pull
    2. これを「在宅作業端末」から「在宅開発端末」にscp等でコピー

やりたき

「在宅開発端末」にて直接「社内サーバ」に対して、git clone/pull/pushしたい。

これを実現する手順を述べます。

登場する端末

f:id:ni66ling:20201220153543p:plain

  • 社内サーバ
    • gitリポジトリがあるサーバです。
    • 社内ネットワークからのみアクセスできます。
    • 家庭内ネットワークなど社外ネットワークからは直接アクセスできません*4
    • 便宜のため「syanai.server.com」とします。
    • git clone/pull/pushはhttpsアクセスで行います。
  • 在宅作業端末
    • 社内サーバ含む社内ネットワークにVPN経由でアクセスできる端末です。
    • 家庭内ネットワークで在宅開発端末にアクセスできます。
    • 便宜のため家庭内ネットワークにおけるIPは「192.168.0.2」とします。
  • 在宅開発端末
    • 社内ネットワークにアクセスできない端末です。
    • 家庭内ネットワークで在宅作業端末にアクセスできます。
    • 便宜のために家庭内ネットワークにおけるIPは「192.168.0.3」とします。

方針

  1. 「在宅開発端末」にてSSHポートフォワードを実行
    • 「在宅開発端末」における特定ポート*5を、「在宅作業端末」を経由して、社内サーバ*6に転送するようにします。
  2. 「自宅開発端末」にて、localhostに対してgit clone/push/pull
    • 1.でポートフォワード設定したポート*7に対してgit clone/push/pullします。
    • すると、「在宅作業端末」を経由して、社内サーバにアクセスできます。

手順

1. 「在宅開発端末」にてSSHポートフォワードを実行

$ ssh [在宅作業端末ユーザー名]@[在宅作業端末IP] -L [在宅開発端末転送ポート]:[社内サーバ]:[社内サーバのポート] -g -f -N

# 例) 192.168.0.3 にて
# $ ssh kensho@192.168.0.2 -L 8082:syanai.server.com:443 -g -f -N

なお、社内サーバのgitlabにはhttpsでアクセスする前提としているため、443番ポートとしています*8*9

ポートフォワードのプロセスが起動できているかは、在宅開発端末にてpsコマンドでプロセスを確認できます。

$ ps aux | grep ssh

# 結果の例
# raspberrypi   21934  0.0  0.0  11668  1776 ?        Ss   12月19   0:00 ssh kensho@192.168.0.2 -L 8082:syanai.server.com:443 -g -f -N

SSHポートフォワードを停止する場合は、killでプロセスを殺します*10

2. 「自宅開発端末」にて、localhostに対してgit clone/push/pull

$ git clone https://localhost:[在宅開発端末転送ポート]/[gitリポジトリpath]

# 例)192.168.0.3にて
# $ git clone https://localhost:8082/hoge/fuga

git pullやpushも同様です。

なお、すでに「在宅作業端末」からscpなどで「在宅開発端末」に持ち込んだリポジトリに対して設定変更する場合は、 ファイル.git/configを開き、[remote "origin"]urlを、今回の例で言えばsyanai.server.comからlocalhost:8082に変更ください。

git clone/fetchしようとしたときにエラー「fatal: unable to access 'https://XXXXX.git/': SSL certificate problem: self signed certificate」が出たら下記を実行すると幸せになれるかも*11

git config http.sslVerify false

*1:私の場合はRaspberryPiやJetsonでしたが、windowsmacでも同じです。

*2:過去に何度かやってきたのですが、久々にやろうとしたら忘れてしまって、結局色々ググらないといけない事態になったので改めて備忘録としてまとめることにしました。

*3:ただでさえバグと戦っているのに、その前後でこの作業してたらメンタルが持たない

*4:VPN経由ではアクセスできます

*5:例えば8082ポート

*6:例えばsyanai.server.comの443ポート

*7:1.で8082ポートを指定した場合は8082ポート

*8:httpsでなくsshでアクセスする場合は、転送ポート番号を22番ポートにするなど変更する必要があります。

*9:ここでは在宅開発端末にてSSHポートフォワードを実行していますが、逆に、在宅作業端末にてSSHポートフォワードする方法もあります。これはSSHリモートポートフォワードとかSSHリバースポートフォワードと呼ばれ-Rオプションで実現できます。具体的には在宅作業端末にて例えば $ ssh develop_user@192.168.0.3 -R 8082:syanai.server.com:443 -g -f -N

*10:上の例の場合、「$ kill -9 21934」

*11:参考: 【Git】自前で立てたGitでSSL認証失敗 - Qiita