2015年6月24日

プロキシ環境においてトンネリングを用いた外部サーバへ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)

設定手順

設定は、以下の手順でおこなう。

  1. 必要なソフトウェアの導入

  2. サーバ側での設定

  3. SSH接続のテスト

  4. クライアント側での設定

必要なソフトウェアの導入

まず、トンネリングをする際に必要なソフトウェア、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"は記述することを推奨する。

参考にしたもの

  1. Linux - 社内プロキシに虐げられてる人たちはVPSとか借りて社外にプロキシ立ててsshトンネルで繋ぐとウハウハですよってお話 - Qiita
    http://qiita.com/kiida/items/37557a1029788afec98a (2015-06-24T12:41:21 参照)

  2. 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などでもトンネリングが可能だそう。

  • 会社内から利用する場合、念の為、社内規約に目を通したほうが良いかも。
    → 万が一、トンネリングが社内規約に違反していたら、面倒なことになる可能性があるので。

Tags: *nix ssh
このエントリーをはてなブックマークに追加