テスト環境からしか接続が許されていないAPIサーバーへローカルの開発環境からアクセスするために多段でSSHポートフォワーディングしてSOCKS5を使用してどうにかしてみました。
構成図です。
外部から接続出来るのはremote1のみ、APIサーバーから許可されているのはremote2のみです。
つまり、クライアントからの接続をremote2からのアクセスであるようにしたいわけです。
今回わかりやすいように最終目的地をYahooにしてあります。
クライアントからremote2の22番へSSHポートフォワーディング
SSHのトンネルを使い、 ローカルの10022番へアクセスしたらremote2の22番へアクセスしたことになるよう設定します。
ssh -N -f -L 10022:192.168.1.11:22 hoge@222.111.111.xxx
これでポートフォワード出来ました。認証はパスワードでも鍵ファイルでも環境に合わせて行って下さい。
オプションは
- -N リモート・ホストでコマンドを実行しない。
- -f バックグランドで実行
- -L ポートフォワーディング
クライアントからremote2上のSOCKS5サーバーへ接続
SOCKS(Wikipediaより引用)
ファイアーウォールの背後にあり、外部サーバにアクセスする必要があるクライアントは、代わりに SOCKS プロキシサーバに接続できる。 SOCKS プロキシサーバはクライアントが外部サーバにアクセスする資格を制御し、外部サーバにリクエストを伝える。 SOCKS はまた正反対にも使用することができる。つまり、ファイアーウォールの外側のクライアント("外部クライアント")が、ファイアーウォールの内側のサーバ(内部サーバ)に接続することを可能にする。
ということで、リモート上で代わりに外部へ接続しに行ってくれます。これは、特に特別にサーバーを立てなくてもSSHが行ってくれます。
ssh -p 10022 -N -f -D 10080 piyo@localhost
これで何をやっているかというとremote2の22番につながっているlocalhostの10022番に対してSSH接続しています。そしてその時に-Dオプションをつけてlocalhostの10080番にダイナミックポートフォワーディング(SOCKSを使う)をしています。
これで上図の状態になりました。
Yahooにアクセスしてみる。
ちょっと種類の違うプロキシができたことになるので使うのは難しくありません。
curl —socks5 localhost:10080 http://www.yahoo.co.jp/
これでremote2経由でアクセス出来ます。~/.curlrc
へ
socks5 = "localhost:10080"
を追加してもいいです。ちなみにPHPからcurlでアクセスしたいなら
curl_setopt($ch, CURLOPT_PROXYTYPE, CURLPROXY_SOCKS5);
curl_setopt($ch, CURLOPT_PROXY, 'localhost:10080');
を追加して下さい。
ブラウザからの接続はよく分かりませんが、プロキシ周りをいじるだけだと思います。