プロキシ環境においてトンネリングを用いた外部サーバへSSH接続する手法のまとめ
大学・企業などのネットワークでは、外部への接続がプロキシ経由に限定されており、更に使用可能プロトコルが
HTTPとHTTPSに限定されている場合がある。
この場合、HTTPとHTTPS以外のプロトコルを用いた通信、SSH等で外部サーバへ接続することが不可能であり、非常に不便である。
そのため、トンネリングを用いて、プロキシ経由でも外部サーバへ接続する手法をまとめた。
本記事では、トンネリングを用いて、ネットワーク外部にあるサーバへSSH接続するための設定方法を述べる。
サーバ側
Arch Linux (x86_64, kernel: 4.0.4-2-ARCH)
OpenSSH (6.8p1-3)
クライアント側
Arch Linux (x86_64, kernel: 4.0.4-2-ARCH)
OpenSSH (6.8p1-3)
corkscrew (2.0-6)
設定手順
設定は、以下の手順でおこなう。
必要なソフトウェアの導入
サーバ側での設定
SSH接続のテスト
クライアント側での設定
必要なソフトウェアの導入
まず、トンネリングをする際に必要なソフトウェア、corkscrewを、クライアント側にインストールする。
(OpenSSHは、サーバ・クライアント共にインストール済であるものとする。)
クライアント側において、以下のコマンドを入力する。
# pacman -Sy corkscrew
$ corkscrew -v
corkscrew 2.0 (agroman@agroman.net)
usage: corkscrew <proxyhost> <proxyport> <desthost> <destport> [authfile]
"corkscrew <バージョン情報> …"が表示されれば、必要なソフトウェアの導入は完了である。
サーバ側での設定
次に、サーバ側での設定をおこなう。
サーバ側では、SSHサービスをポート443で待ち受けるように設定する。
設定は、/etc/ssh/sshd_configに、"Port 443"を記入すれば良い。
具体的には、以下の手順でおこなう。
# cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak #設定ファイルのバックアップを作成
# sed -i -E 's/^#?Port [1-9][0-9]{0,4}/&\nPort 443/' /etc/ssh/sshd_config
# cat /etc/ssh/sshd_config | grep -E '^#?Port'
#Port 22
Port 443
# systemctl restart sshd.service
以上で、サーバ側での設定は完了である。
443以外のポートでもSSHを待ち受けるようにしたい場合は、"Port <ポート番号>"行を、以下のように複数記述すれば良い。
# cat /etc/sshd/sshd_config | grep -E '^#?Port'
Port 22
Port 443
Port 10022
SSH接続のテスト
次に、トンネリングを利用してサーバ側にSSHでアクセスできるかどうか、接続テストをおこなう。
接続テストは、クライアント側でおこなう。
以下のコマンドを入力する。
$ ssh -q -l <ログインするユーザ名> <サーバのIPまたはドメイン名> -o "ProxyCommand corkscrew <プロキシのIPまたはドメイン名> <プロキシのポート番号> <サーバのIPまたはドメイン名> 443" uname -n
(サーバのホスト名が表示される)
上記のコマンドを実行後、接続先サーバのホスト名が表示されれば、接続テストは成功である。
クライアント側での設定
最後に、クライアント側での設定をおこなう。
クライアント側では、今後のコマンド入力を簡便にするために、SSHクライアントの設定をおこなう。
設定は、$HOME/.ssh/configに接続テストで用いたオプション等を記入していく。
具体的には、以下のコマンドを入力する。
$ cat >> $HOME/.ssh/config
Host your_server # "your_server"は好きな名前に設定する
User <ログインするユーザ名>
HostName <サーバのIPまたはドメイン名>
Port 443
ProxyCommand corkscrew <プロキシのIPまたはドメイン名> <プロキシのポート番号> %h %p
ServerAliveInterval 15
(ここでCTRL-dを押す)
以上で、クライアント側での設定、およびトンネリングに必要な作業は、全て完了である。
今後、以下のコマンドで外部サーバへのSSH接続が可能である。
$ ssh your_server # "your_server"は、$HOME/.ssh/configファイルのHost行で設定した名前
そのため、安定してSSH接続をおこなうために、"ServerAliveInterval 15"は記述することを推奨する。
参考にしたもの
Linux - 社内プロキシに虐げられてる人たちはVPSとか借りて社外にプロキシ立ててsshトンネルで繋ぐとウハウハですよってお話 - Qiita
http://qiita.com/kiida/items/37557a1029788afec98a (2015-06-24T12:41:21 参照)HTTP tunneling - ArchWiki
https://wiki.archlinux.org/index.php/HTTP_tunneling (2015-06-24T12:41:29 参照)
雑感
サーバ側で、HTTPS(443ポート)が既に使用されている場合、どうすれば良いんだろう。
→ まあ、443が埋まっていないサーバを踏み台にすれば済むのだけれど。corkscrewは、DebianやFreeBSDでも、公式リポジトリにて提供されている。
→ なので、Arch Linux以外の、大半のLinuxディストリ・BSD系OSでも、この手法は使えるはず。
→WindowsとMacは知らん。(2015-08-01T13:03:36 修正)
Macでもhomebrowでcorkscrewをインストール可能だそう(認証付きプロキシ環境でssh接続したい場合、Squid + corkscrewの組み合わせで乗り越えてみる)。
Windowsはやっぱり知らん。参考サイト2によれば、corkscrew以外にも、netcatなどでもトンネリングが可能だそう。
会社内から利用する場合、念の為、社内規約に目を通したほうが良いかも。
→ 万が一、トンネリングが社内規約に違反していたら、面倒なことになる可能性があるので。