社内LANのページにアクセスするためにポート転送などについて調べたのでメモ
LAN内のページを外から見る必要があるときには、LAN内にあるサーバをproxyとして用いる。その際、ssh用の設定を書いておくと楽。
ex. 自宅PC(A.hoge.jp) → 踏み台サーバ(B.foo.jp) → LAN内サーバ(C.var.jp) → 目的サーバ(D.boo.jp)
・ AのPCからサーバDにあるページを閲覧したい
・すべてのサーバは同じusername、秘密鍵でアクセスできるとする
.ssh/config
Host B.foo.jp
HostName B.foo.jp
Host C.var.jp
HostName C.var.jp
ProxyCommand ssh B.foo.jp -W %h:%p
DynamicForward 1080
Host *.jp
User user-name
IdentityFile ~/.ssh/id_rsa
この設定を書いた状態で以下のコマンド
% ssh -N -f C.var.jp
これでサーバCをSOCKS proxyとして機能させることができる。あとはA側のproxy設定を行い、localhost:1080にアクセスすればポート転送によりサーバDのページを閲覧できる。
macでのproxy設定はシステム環境設定 - ネットワークから行える。ネットワーク環境が”自動”となっているのでこれをコピーして別名で環境を作っておくと切り替えるだけでproxyへの接続ができるので便利。アプリごとに設定を切り替える必要がなくてよい。
▼上の設定について解説
・config中のワイルドカード
.ssh/configではワイルドカードを使った指定ができるので、ユーザ名や秘密鍵の設定など同じものを使いまわす際にはまとめて書いておける。注意点としては、ワイルドカードを用いた設定を一番したに書くこと。上から順にホスト名の判定をしてマッチした設定が使用されるため、上の方に書いてしまうとそれ以降の設定にアクセスされなくなる。
・ProxyCommand
sshを行う際にここに書いたコマンドを実行してくれる
・ssh B.foo.jp -W %h:%p
このコマンドは以下の書き方でも同じ意味
ssh B.foo.jp nc %h %p
つまり、-Wはncと同じことをしている。ncとはnetcatのことでOpenSSH 5.4あたりから内部コマンドとしてsshに取り込まれたため-Wのオプションで使える。また、%hにはHostName、%pにはPortがreplaceされる。
※ncを使う場合はtimeoutの設定もすべきらしい
→ nc -w 1 %h %p = 1secでtimeout
・DynamicForward
ここに設定したポートを接続先に転送し、接続先のサーバをSOCKS proxyとして用いる。
・ssh -N -f
-N:接続先のサーバでシェルを使った操作をしないときつけとく
-f :sshをバックグラウンドで動かしておきたいときつけとく
追記(2013/06/29)
▼git pullなどを↑で設定したポートを通じて行う
以下の設定を.ssh/configに書く
Host git.example.jp
ProxyCommand nc -x localhost:1080 %h %p
git cloneやpullの際にアクセスする際にdynamic forwardの設定をしたポートを使うようにする。-xはproxyの設定用のオプション。
参考ページ
DynamicForwardについて
・http://openlab.dino.co.jp/2009/05/28/235026555.html
・http://old.typemiss.net/blog/kounoike/20061019-100
多段sshの設定について
・http://d.hatena.ne.jp/dayflower/20080204/1202457379