21
13

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

接続先のサーバーへインターネット接続を共有しつつssh接続する

Last updated at Posted at 2019-04-29

はじめに: 内部で閉じたネットワークでのインストール作業は大変

ネットワーク内部でつながっているインターネット接続を持たないようなサーバーへssh接続したとき、以下のような問題が生じます。

  • 各種インストール作業の際にインターネットに接続できず不便
  • gitコマンドでGitHubにアクセスできず不便

例えば、以下の図のようにプライベートなネットワークに接続されたラズパイにssh接続する状況では、そのままではラズパイからインターネットに繋げないので何かと不便です。
ラズパイの例に限らず、Linuxの入ったクラスタPCのセットアップ作業など色々な場面で同じような状況が発生します。
ssh_raspi_internet.png
(※図中のRaspberry Piはあくまで一例です。本記事の方法は他のLinuxサーバーでも使えます。)

これらの問題の解決策として、リモート側(sshの接続先)からローカル側(sshの接続元)のインターネット接続を使用する方法を紹介します。

やり方

接続方法(リモート側にsocks5プロキシを立てつつssh接続)

ssh接続の際、以下のように-R (適当なポート番号)を付けて接続します。これだけです。
(user@hostnameは適宜変えてください)

$ ssh -R 6666 user@hostname

すると、ssh接続先(リモート側)の6666番ポートにsocks5プロキシが立ちます。
そこを経由して接続すればインターネットに接続できます。

ssh接続先でのインターネットの使い方

上のようにssh -Rで接続した後、接続先では6666番ポートのsocks5プロキシを経由して各種コマンドを使用します。
ssh_raspi_internet2.png

例えば、gitコマンドを使う場合なら以下のようになります。

一時的に使う例(git pull)
$ git -c http.proxy=socks5h://localhost:6666 -c https.proxy=socks5h://localhost:6666 pull
git configでプロキシを設定する例
$ git config --global http.proxy socks5h://localhost:6666
$ git config --global https.proxy socks5h://localhost:6666

例えば、aptコマンドを使う場合なら以下のようになります。

一時的に使う例(apt update)
$ sudo apt -o Acquire::http::proxy="socks5h://localhost:6666" -o Acquire::https::proxy="socks5h://localhost:6666" update

使えはしますがコマンドが長くてかなり面倒です。そこで、楽にする方法を紹介します。

proxychainsを入れるとコマンドごとのプロキシ設定が不要になって楽

proxychainsというソフトを入れるとプロキシを経由させるのが楽になります。

通常、以下のコマンドでインストールできます(aptの場合)。

$ sudo apt update
$ sudo apt install proxychains

ただし、上記コマンドはインターネット接続がないとできないので、以下のように6666番ポートを経由させてインストールしてください。

※上のコマンドをプロキシ経由で行う場合
$ sudo apt -o Acquire::http::proxy="socks5h://localhost:6666" -o Acquire::https::proxy="socks5h://localhost:6666" update
$ sudo apt -o Acquire::http::proxy="socks5h://localhost:6666" -o Acquire::https::proxy="socks5h://localhost:6666" install proxychains

次に、/etc/proxychains.confをテキストエディタで開き、末尾を以下のように編集します。

/etc/proxychains.conf
※中略

[ProxyList]
socks5 127.0.0.1 6666

これで完了です。

以下のように各種コマンドが楽にプロキシ経由で使えるようになります。

だいたいproxychainsを前につけるだけでOKになる
$ sudo proxychains apt update
$ proxychains git pull
$ proxychains curl google.com

proxychains gitと打つのもだるいという方は、~/.bashrcの末尾にalias pgit="proxychains git"と書いておけばpgit pullだけでpullできるようになると思います。

補足

  • プロキシのURLはsocks5h://ではなくhのないsocks5://でも一応は接続できます
    • ただし、socks5://だとDNSルックアップがプロキシ経由で行われなくなってしまいます
    • 別でDNSサーバーへのアクセスができる環境でないと名前解決に失敗します

  • aptコマンドはhttp_proxyhttps_proxyという環境変数を指定すれば、毎回-oで指定しなくてもプロキシを経由させられるかもしれません
    • うちの環境(ラズパイ)では上手く行きませんでした
    • -oで指定したものと同様のものを/etc/apt/apt.confに書けば大抵上手く行きますが、一時使用の場合は毎回書き替えるのが面倒です

  • 他の多くの記事はなぜか面倒な方の方法を紹介しています
    • 例えば、ssh -f -N -D 54321 localhostでローカルにsocks5プロキシを立ててから、ssh -R 6666:localhost:54321で接続することで、リモート側の6666番ポートにローカルの54321番ポートをポートフォワーディングする、など
    • 昔のバージョンのsshコマンドでは、このような面倒な方法を取る必要があるかもしれません
    • (ちなみに、上の例で54321にしているのは同じ番号だと紛らわしいからというだけなので、両方6666にしても構いません)
    • 例えば、つい最近(2019/6/16)に公開された記事→ https://blog.amedama.jp/entry/remote-port-forward-squid-proxy でもプロキシサーバー(Squid)をインストールした上でポートフォワードしていますが、このような作業は全く必要ありません

参考

21
13
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
21
13

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?