やりたいこと
AWS で Private Subnet(基本的に外界から断絶されたサブネット)に配置されたサーバから、Public Subnet に配置された NAT インスタンス経由で、github にアクセスする。Local Machine から NAT 経由でサーバにアクセスするのの逆。Private Subnet 内のインスタンスからは、基本的にはあちこち ssh でアクセスさせない。
なお、サーバの OS は Amazon Linux2。
github の IP
クソいっぱいある!全部で56個(レンジ)ある。使うのは、git の部分の35個だけかな?
プレフィックスリスト の作成
Inbound/Outbound の Rules に1つずつ全部追加するのはシンドイので、プレフィックスリストを使う。
VPC > マネージドプレフィックスリスト
新規作成。今後増えるやも知れないので、上限40個くらいにしておく。溢れたら作り直す。
Security Group(or NACL) の設定
SG か NACL かは、ポリシー次第。
NAT の SG or Public Subnet の NACL or both の Outbound に 22 ポートで先程作成した プレフィックスリストを加える。
Private Subnet のサーバから Public Subnet の NAT サーバに対して 22 ポートを受け付けていなければ、開ける。Inbound。
22番ポートのルートがルートテーブルになければ、それも追加。
RSA key の作成および登録
github にアクセスしたい Private Subnet のサーバで、RSA Key を NAT 用と github 用の 2 つ作る。
$ cd ~/.ssh
$ ssh-keygen -t rsa -b 4096 -C "your_email@example.com" -f nat_rsa
$ ssh-keygen -t rsa -b 4096 -C "your_email@example.com" -f github_rsa
鍵の使い回しはやめよう!鍵にパスワードは付けよう!
生成された鍵を登録する。
- nat_rsa.pub の中身を NAT サーバの .ssh/authorized_keys に追記
- github_rsa.pub の中身を github > settings > SSH and GPG keys に登録
SSH トンネルが成功している時点で、パーミッション関連は大丈夫だと思いますが、外に出ていく用に User を作ったりすることもあるかも知れないので、念の為書くと、
- NAT サーバの .ssh: 700
- NAT サーバの authorized_keys: 600
- nat_rsa, github_rsa: 600
.ssh/config の設定
Host nat
HostName xxx.xxx.xxx.xxx
User your_user_name
IdentityFile ~/.ssh/nat_rsa
TCPKeepAlive yes
IdentitiesOnly yes
Host github.com
HostName github.com
User git
IdentityFile ~/.ssh/github_rsa
ProxyCommand ssh -W %h:%p nat
NAT サーバの Private IP Address と your_user_name は自分のものに。
疎通確認
NAT サーバの /var/log/secure
を監視しておく(私は、less / shift + f 派)
Private Subnet のサーバにて
$ ssh git@github.com
PTY allocation request failed on channel 0
Hi xxxxx! You've successfully authenticated, but GitHub does not provide shell access.
Connection to github.com closed.
Killed by signal 1.
つながった。NAT サーバのログもちゃんと反応している。
clone 等も問題なくできる。
というわけで、NAT 経由の ssh ポートフォワーディングで、github に接続できた。おしまい。