インターネットに直接つながっていないマシンというのは意外とよくある。 とはいえ、そういったマシンでも当然のことながらセットアップ等の作業は必要になる。 その際、作業に必要なファイルは大抵の場合に SCP などで転送することになると思う。 とはいえ、もしマシンから直接 Web につながれば楽ができるはず。 今回は、そういった状況で SSH Remote Port Forwarding と Squid (Web プロキシのソフトウェア) を使って Web への疎通を提供する方法を試してみる。 なお、提供できるのはあくまで HTTP/HTTPS 等に限られ、ICMP や UDP といったプロトコルは通らない。
構成について
最初に、ざっくりとした構成図を以下に示す。 インターネットにつながらないマシンは SSH Server を想定する。 そして、SSH Client がインターネットにつながるマシンで、SSH Server に接続しに行く。 SSH Client のマシンでは Squid を 8080 ポートで起動している。 今回の主眼は、SSH Client のマシンの 8080 ポートを Remote Port Forwarding で SSH Server にも見えるようにするところ。 SSH Server は自身の 8080 ポートを Web プロキシとして利用することで、Web への疎通が手に入る。
使った環境について
続いては、今回の検証に使った環境について説明する。
インターネットにつながっているマシン (SSH Client) としては、以下の通り macOS のマシンを用意した。
$ sw_vers ProductName: Mac OS X ProductVersion: 10.14.5 BuildVersion: 18F132
このマシンは、次のようにインターネットに疎通がある。
$ ping -c 3 8.8.8.8 PING 8.8.8.8 (8.8.8.8): 56 data bytes 64 bytes from 8.8.8.8: icmp_seq=0 ttl=56 time=9.156 ms 64 bytes from 8.8.8.8: icmp_seq=1 ttl=56 time=30.316 ms 64 bytes from 8.8.8.8: icmp_seq=2 ttl=56 time=18.479 ms --- 8.8.8.8 ping statistics --- 3 packets transmitted, 3 packets received, 0.0% packet loss round-trip min/avg/max/stddev = 9.156/19.317/30.316/8.659 ms
そして、インターネットにつながっていないマシン (SSH Server) は、以下の通り Ubuntu 18.04 LTS のマシンを用意した。 このマシンは VirtualBox を使って先ほどの macOS 上で仮想マシンとして稼働させている。
$ cat /etc/lsb-release DISTRIB_ID=Ubuntu DISTRIB_RELEASE=18.04 DISTRIB_CODENAME=bionic DISTRIB_DESCRIPTION="Ubuntu 18.04.2 LTS" $ uname -r 4.15.0-51-generic
こちらは以下のようにインターネットに疎通がない。
かろうじて 192.168.33.0/24
のネットワークを経由して前述した macOS のマシンと疎通がある。
$ ip addr show 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: enp0s8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000 link/ether 08:00:27:42:06:7b brd ff:ff:ff:ff:ff:ff inet 192.168.33.10/24 brd 192.168.33.255 scope global enp0s8 valid_lft forever preferred_lft forever inet6 fe80::a00:27ff:fe42:67b/64 scope link valid_lft forever preferred_lft forever $ ip route show 192.168.33.0/24 dev enp0s8 proto kernel scope link src 192.168.33.10 $ ping -c 3 8.8.8.8 connect: Network is unreachable
なお、このマシンは Vagrant + VirtualBox を使って仮想マシンとして用意した。
前述した macOS 上で稼働している。
ただし SSH については vagrant
コマンドを使う代わりに、次のようにしてログインしている。
$ ssh -i .vagrant/machines/default/virtualbox/private_key \ -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null \ -l vagrant 192.168.33.10
Web プロキシをインストールする
ここからは、実際に SSH Server のマシンに Web への疎通を提供するまでに必要な作業について記載していく。 まずは SSH Client 側のマシンに Squid (Web プロキシ) をインストールする。
使っているのが macOS なので Homebrew を使うと楽にインストールできる。
$ brew install squid
コンフィグを編集する場合には、初期状態のものをコピーしてバックアップしておく。
$ cp $(brew --prefix)/etc/squid.conf{,.bak}
今回はコンフィグの編集例として、使うポートをよく利用される 8080
に変更してみる。
$ sed -i -e " s:^http_port.*$:http_port 8080: " $(brew --prefix)/etc/squid.conf $ grep http_port $(brew --prefix)/etc/squid.conf http_port 8080
あと、念のため次のようにしてどのような ACL が入っているのか、あらかじめ確認しておいた方が良いと思う。 オープンプロキシになってると危険なので。 とはいえ、おそらくデフォルトでプライベートアドレスからのアクセスしか認めないようになっているはず。
$ grep acl $(brew --prefix)/etc/squid.conf $ grep deny $(brew --prefix)/etc/squid.conf
Squid のサービスを開始する。
$ brew services start squid
次のように 8080
ポートを Listen していれば良い。
$ lsof -i:8080 | grep -i squid squid 58763 amedama 14u IPv6 0x4e9127c629e616d5 0t0 TCP *:http-alt (LISTEN)
Remote Port Forwarding で Web プロキシを利用する
続いては SSH Server 側の作業に入る。
やることは単純で、次のように SSH するときに -R
オプションで Remote Port Forwarding する。
以下では自身の 8080
ポートをリモートの localhost:8080
で見られるようにしている。
$ ssh -i .vagrant/machines/default/virtualbox/private_key \ -R 8080:localhost:8080 \ -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null \ -l vagrant 192.168.33.10
ログインしたらポートを localhost:8080
で Listen していることを確認しておこう。
$ ss -tlnp | grep 8080 LISTEN 0 128 127.0.0.1:8080 0.0.0.0:* LISTEN 0 128 [::1]:8080 [::]:*
これで localhost:8080
経由で Web プロキシが使えるようになった。
あとは一般的なプロキシを使うのと同じ。
例えば環境変数に設定を入れておこう。
$ export http_proxy=http://localhost:8080 $ export https_proxy=$http_proxy
試しに wget を使って Ubuntu のイメージファイルのハッシュファイルを取得してみよう。
$ wget http://ftp.riken.jp/Linux/ubuntu-releases/bionic/SHA256SUMS
次のように、ちゃんと取得できれば上手くいっている。
$ cat SHA256SUMS 22580b9f3b186cc66818e60f44c46f795d708a1ad86b9225c458413b638459c4 *ubuntu-18.04.2-desktop-amd64.iso ea6ccb5b57813908c006f42f7ac8eaa4fc603883a2d07876cf9ed74610ba2f53 *ubuntu-18.04.2-live-server-amd64.iso
いじょう。
Squid Proxy Server 3.1: Beginner's Guide (English Edition)
- 作者: Kulbir Saini
- 出版社/メーカー: Packt Publishing
- 発売日: 2011/02/21
- メディア: Kindle版
- この商品を含むブログ (1件) を見る
Squid: The Definitive Guide: The Definitive Guide (Definitive Guides) (English Edition)
- 作者: Duane Wessels
- 出版社/メーカー: O'Reilly Media
- 発売日: 2009/02/09
- メディア: Kindle版
- この商品を含むブログを見る